From 852548b07d7be83fef83e3cdd576792335b16415 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 19:36:58 +0200 Subject: [PATCH 001/155] [Core] Introduce new package structure --- .../main/java/cucumber/api/SnippetType.java | 11 +- .../cucumber/api/StepDefinitionReporter.java | 2 +- core/src/main/java/cucumber/api/cli/Main.java | 2 +- .../api/event/ConcurrentEventListener.java | 2 +- .../java/cucumber/runner/RunnerSupplier.java | 7 - .../java/cucumber/runtime/ExitStatus.java | 48 ------- .../runtime/FeaturePathFeatureSupplier.java | 24 ---- .../java/cucumber/runtime/GlueSupplier.java | 5 - .../main/java/cucumber/runtime/Supplier.java | 7 - .../main/java/cucumber/runtime/Timeout.java | 63 --------- .../runtime/autocomplete/MetaStepdef.java | 95 ------------- .../cucumber/core/backend}/Backend.java | 4 +- .../core/backend}/BackendSupplier.java | 2 +- .../DuplicateStepDefinitionException.java | 4 +- .../cucumber/core/backend}/Glue.java | 3 +- .../core/backend}/HookDefinition.java | 2 +- .../core/backend}/StepDefinition.java | 4 +- .../core/backend}/StepDefinitionMatch.java | 2 +- .../core/exception}/CucumberException.java | 2 +- .../cucumber/core}/filter/Filters.java | 4 +- .../cucumber/core}/filter/LinePredicate.java | 2 +- .../cucumber/core}/filter/NamePredicate.java | 2 +- .../core}/filter/PicklePredicate.java | 2 +- .../cucumber/core}/filter/RerunFilters.java | 8 +- .../core}/filter/TagExpressionOld.java | 2 +- .../cucumber/core}/filter/TagPredicate.java | 2 +- .../cucumber/core/io}/ClassFinder.java | 2 +- .../core}/io/ClasspathResourceIterable.java | 6 +- .../core}/io/ClasspathResourceLoader.java | 2 +- .../io/DelegatingResourceIteratorFactory.java | 4 +- .../cucumber/core}/io/FileResource.java | 2 +- .../core}/io/FileResourceIterable.java | 2 +- .../core}/io/FileResourceIterator.java | 4 +- .../core}/io/FileResourceIteratorFactory.java | 4 +- .../cucumber/core}/io/FileResourceLoader.java | 2 +- .../cucumber/core}/io/FlatteningIterator.java | 2 +- .../cucumber/core}/io/Helpers.java | 4 +- .../cucumber/core}/io/MultiLoader.java | 2 +- .../cucumber/core}/io/Resource.java | 2 +- .../core}/io/ResourceIteratorFactory.java | 2 +- .../cucumber/core}/io/ResourceLoader.java | 2 +- .../core}/io/ResourceLoaderClassFinder.java | 4 +- .../cucumber/core}/io/URLOutputStream.java | 4 +- .../core}/io/UTF8OutputStreamWriter.java | 2 +- .../cucumber/core}/io/ZipResource.java | 2 +- .../core}/io/ZipResourceIterator.java | 2 +- .../core}/io/ZipResourceIteratorFactory.java | 4 +- .../ZipThenFileResourceIteratorFactory.java | 2 +- .../cucumber/core}/model/CucumberFeature.java | 8 +- .../cucumber/core/model}/Encoding.java | 11 +- .../cucumber/core}/model/FeatureBuilder.java | 7 +- .../cucumber/core/model}/FeatureCompiler.java | 3 +- .../cucumber/core}/model/FeatureLoader.java | 14 +- .../cucumber/core}/model/PathWithLines.java | 2 +- .../cucumber/core/options}/Env.java | 2 +- .../core/options}/RuntimeOptions.java | 33 ++--- .../core/options}/RuntimeOptionsFactory.java | 5 +- .../cucumber/core/options}/Shellwords.java | 2 +- .../cucumber/core/plugin}/AnsiFormats.java | 4 +- .../core/plugin}/DefaultSummaryPrinter.java | 3 +- .../cucumber/core/plugin}/Format.java | 2 +- .../cucumber/core/plugin}/Formats.java | 2 +- .../cucumber/core/plugin}/HTMLFormatter.java | 12 +- .../cucumber/core/plugin}/JSONFormatter.java | 6 +- .../cucumber/core/plugin}/JUnitFormatter.java | 20 +-- .../core/plugin}/MonochromeFormats.java | 2 +- .../core/plugin}/NullSummaryPrinter.java | 2 +- .../java/io/cucumber/core/plugin/Options.java | 15 ++ .../cucumber/core/plugin}/PluginFactory.java | 29 +++- .../cucumber/core/plugin}/Plugins.java | 67 +++------ .../core/plugin}/PrettyFormatter.java | 6 +- .../core/plugin}/ProgressFormatter.java | 2 +- .../cucumber/core/plugin}/RerunFormatter.java | 2 +- .../cucumber/core/plugin}/Stats.java | 6 +- .../core/plugin}/TestNGFormatter.java | 8 +- .../core/plugin}/TestSourcesModel.java | 2 +- .../core/plugin}/TimelineFormatter.java | 28 ++-- .../core/plugin}/UndefinedStepsTracker.java | 8 +- .../cucumber/core/plugin}/UsageFormatter.java | 4 +- .../core/reflection}/MethodFormat.java | 4 +- .../reflection}/NoInstancesException.java | 6 +- .../core/reflection}/Reflections.java | 13 +- .../TooManyInstancesException.java | 4 +- .../core}/runner/AbstractEventBus.java | 2 +- .../core}/runner/AbstractEventPublisher.java | 2 +- .../AmbiguousPickleStepDefinitionsMatch.java | 4 +- .../AmbiguousStepDefinitionsException.java | 4 +- .../cucumber/core/runner/CachingGlue.java} | 16 +-- .../runner/CanonicalOrderEventPublisher.java | 2 +- .../core/runner}/DefinitionArgument.java | 8 +- .../cucumber/core}/runner/EventBus.java | 2 +- .../FailedPickleStepInstantiationMatch.java | 4 +- .../cucumber/core}/runner/HookComparator.java | 4 +- .../core}/runner/HookDefinitionMatch.java | 6 +- .../cucumber/core}/runner/HookTestStep.java | 2 +- .../cucumber/core}/runner/Match.java | 4 +- .../core}/runner/NoStepDefinition.java | 6 +- .../runner/PickleStepDefinitionMatch.java | 10 +- .../core}/runner/PickleStepTestStep.java | 3 +- .../cucumber/core}/runner/Runner.java | 13 +- .../cucumber/core/runner/RunnerSupplier.java | 5 + .../cucumber/core}/runner/Scenario.java | 2 +- .../core}/runner/SingletonRunnerSupplier.java | 6 +- .../cucumber/core}/runner/TestCase.java | 2 +- .../cucumber/core}/runner/TestStep.java | 4 +- .../runner/ThreadLocalRunnerSupplier.java | 8 +- .../cucumber/core}/runner/TimeService.java | 2 +- .../core}/runner/TimeServiceEventBus.java | 2 +- .../UndefinedPickleStepDefinitionMatch.java | 4 +- .../UndefinedStepDefinitionException.java | 4 +- .../core}/runner/UndefinedStepException.java | 2 +- .../runtime/BackendModuleBackendSupplier.java | 16 ++- .../DefaultTypeRegistryConfiguration.java | 4 +- .../runtime/FeaturePathFeatureSupplier.java | 33 +++++ .../core}/runtime/FeatureSupplier.java | 4 +- .../cucumber/core/runtime/Invoker.java} | 103 ++++++++------ .../cucumber/core}/runtime/Runtime.java | 88 +++++++++--- .../core}/snippets/ArgumentPattern.java | 2 +- .../core}/snippets/CamelCaseConcatenator.java | 2 +- .../cucumber/core}/snippets/Concatenator.java | 2 +- .../core}/snippets/FunctionNameGenerator.java | 2 +- .../cucumber/core}/snippets/Snippet.java | 2 +- .../core}/snippets/SnippetGenerator.java | 2 +- .../snippets/UnderscoreConcatenator.java | 2 +- .../{ => core}/stepexpression/Argument.java | 2 +- .../stepexpression/ArgumentMatcher.java | 2 +- .../stepexpression/DataTableArgument.java | 2 +- .../stepexpression/DocStringArgument.java | 2 +- .../stepexpression/DocStringTransformer.java | 2 +- .../stepexpression/ExpressionArgument.java | 2 +- .../ExpressionArgumentMatcher.java | 2 +- .../stepexpression/PickleTableConverter.java | 2 +- .../stepexpression/RawTableTransformer.java | 2 +- .../stepexpression/StepExpression.java | 2 +- .../stepexpression/StepExpressionFactory.java | 4 +- .../stepexpression/TypeRegistry.java | 2 +- .../stepexpression/TypeResolver.java | 2 +- .../cucumber/core}/util/FixJava.java | 32 +---- .../cucumber/core}/util/Mapper.java | 2 +- .../plugin}/timeline/chosen-sprite.png | Bin .../plugin}/timeline/chosen.jquery.min.js | 0 .../plugin}/timeline/chosen.min.css | 0 .../plugin}/timeline/chosen.override.css | 0 .../plugin}/timeline/formatter.js | 0 .../plugin}/timeline/index.html | 0 .../plugin}/timeline/jquery-3.3.1.min.js | 0 .../plugin}/timeline/report.css | 0 .../plugin}/timeline/vis.min.css | 0 .../plugin}/timeline/vis.min.js | 0 .../plugin}/timeline/vis.override.css | 0 .../cucumber/core}/version.properties | 0 .../test/java/cucumber/runtime/UtilsTest.java | 36 ----- .../cucumber/core/backend}/StubBackend.java | 9 +- .../core}/filter/LinePredicateTest.java | 2 +- .../core}/filter/NamePredicateTest.java | 2 +- .../core}/filter/TagPredicateTest.java | 2 +- ...DelegatingResourceIteratorFactoryTest.java | 2 +- .../cucumber/core}/io/FileResourceTest.java | 2 +- .../core}/io/FlatteningIteratorTest.java | 2 +- .../cucumber/core}/io/HelpersTest.java | 6 +- .../cucumber/core}/io/ResourceLoaderTest.java | 6 +- .../core}/io/TestResourceIterator.java | 2 +- .../core}/io/TestResourceIteratorFactory.java | 2 +- .../core}/io/URLOutputStreamTest.java | 30 ++-- .../io/ZipResourceIteratorFactoryTest.java | 2 +- .../core}/model/CucumberFeatureTest.java | 8 +- .../core}/model/FeatureBuilderTest.java | 4 +- .../core}/model/PathWithLinesTest.java | 2 +- .../cucumber/core/options}/EnvTest.java | 2 +- .../options}/RuntimeOptionsFactoryTest.java | 43 +++--- .../core/options}/RuntimeOptionsTest.java | 45 +++--- .../core/options}/ShellwordsTest.java | 2 +- .../plugin}/AnyStepDefinitionReporter.java | 4 +- .../AverageUsageStatisticStrategyTest.java | 2 +- .../core/plugin}/FormatterBuilder.java | 2 +- .../cucumber/core/plugin}/FormatterSpy.java | 2 +- .../core/plugin}/HTMLFormatterTest.java | 130 +++++++++--------- .../core/plugin}/JSONFormatterTest.java | 38 ++--- .../core/plugin}/JUnitFormatterTest.java | 56 ++++---- .../core/plugin}/JsonParallelRuntimeTest.java | 16 +-- .../MedianUsageStatisticStrategyTest.java | 2 +- .../core/plugin}/PickleStepMatcher.java | 2 +- .../core/plugin}/PluginFactoryTest.java | 52 ++++--- .../core/plugin}/PrettyFormatterTest.java | 20 +-- .../core/plugin}/RerunFormatterTest.java | 8 +- .../cucumber/core/plugin}/StatsTest.java | 3 +- .../cucumber/core/plugin}/StubFormatter.java | 2 +- .../cucumber/core/plugin}/TempDir.java | 8 +- .../core/plugin}/TestNGFormatterTest.java | 57 ++++---- .../core/plugin}/TimelineFormatterTest.java | 12 +- .../plugin}/UndefinedStepsTrackerTest.java | 33 +++-- .../core/plugin}/UsageFormatterTest.java | 2 +- .../core/reflection}/MethodFormatTest.java | 4 +- .../core/reflection/ReflectionsTest.java | 25 ++++ .../AmbiguousStepDefinitionMatchsTest.java | 2 +- .../core/runner/CachingGlueTest.java} | 28 ++-- .../cucumber/core}/runner/EventBusTest.java | 2 +- .../FailedStepInstantiationMatchTest.java | 2 +- .../cucumber/core}/runner/HookOrderTest.java | 23 ++-- .../cucumber/core}/runner/HookTest.java | 12 +- .../core}/runner/HookTestStepTest.java | 5 +- .../core}/runner/PickleStepTestStepTest.java | 4 +- .../cucumber/core}/runner/RunnerTest.java | 17 ++- .../core}/runner/ScenarioResultTest.java | 2 +- .../cucumber/core}/runner/ScenarioTest.java | 3 +- .../runner/SingletonRunnerSupplierTest.java | 14 +- .../core}/runner/StepDefinitionMatchTest.java | 12 +- .../core}/runner/StepDurationTimeService.java | 3 +- .../core}/runner/TestBackendSupplier.java | 8 +- .../cucumber/core}/runner/TestCaseTest.java | 5 +- .../cucumber/core}/runner/TestHelper.java | 31 ++--- .../core}/runner/TestRunnerSupplier.java | 18 ++- .../core}/runner/TimeServiceStub.java | 4 +- .../core}/runner/TimeServiceTest.java | 3 +- .../UndefinedStepDefinitionMatchTest.java | 2 +- .../BackendModuleBackendSupplierTest.java | 19 ++- .../core}/runtime/ExitStatusTest.java | 13 +- .../cucumber/core/runtime/InvokerTest.java} | 16 +-- .../cucumber/core}/runtime/RuntimeTest.java | 37 ++--- .../core}/runtime/StubStepDefinition.java | 15 +- .../ThreadLocalRunnerSupplierTest.java | 20 +-- .../core}/snippets/ArgumentPatternTest.java | 2 +- .../snippets/FunctionNameGeneratorTest.java | 2 +- .../StepExpressionFactoryTest.java | 2 +- .../stepexpression/TableParser.java | 4 +- ...ucumber.runtime.io.ResourceIteratorFactory | 1 - ...o.cucumber.core.io.ResourceIteratorFactory | 1 + .../cucumber/core/io}/bar.properties | 0 .../cucumber/core/io}/foo.properties | 0 .../cucumber/core/io}/has spaces.properties | 0 .../core/plugin}/FormatterInParallel.feature | 0 .../core/plugin}/HTMLFormatterTest.feature | 0 .../plugin}/JSONPrettyFormatterTest.feature | 0 .../core/plugin}/JSONPrettyFormatterTest.json | 2 +- .../core/plugin}/JUnitFormatterTest_1.feature | 0 .../plugin}/JUnitFormatterTest_1.report.xml | 2 +- .../JUnitFormatterTest_1_strict.report.xml | 2 +- .../core/plugin}/JUnitFormatterTest_2.feature | 0 .../plugin}/JUnitFormatterTest_2.report.xml | 2 +- .../core/plugin}/JUnitFormatterTest_3.feature | 0 .../plugin}/JUnitFormatterTest_3.report.xml | 2 +- 241 files changed, 1030 insertions(+), 1177 deletions(-) delete mode 100644 core/src/main/java/cucumber/runner/RunnerSupplier.java delete mode 100755 core/src/main/java/cucumber/runtime/ExitStatus.java delete mode 100644 core/src/main/java/cucumber/runtime/FeaturePathFeatureSupplier.java delete mode 100644 core/src/main/java/cucumber/runtime/GlueSupplier.java delete mode 100644 core/src/main/java/cucumber/runtime/Supplier.java delete mode 100644 core/src/main/java/cucumber/runtime/Timeout.java delete mode 100644 core/src/main/java/cucumber/runtime/autocomplete/MetaStepdef.java rename core/src/main/java/{cucumber/runtime => io/cucumber/core/backend}/Backend.java (87%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/backend}/BackendSupplier.java (76%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/backend}/DuplicateStepDefinitionException.java (82%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/backend}/Glue.java (85%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/backend}/HookDefinition.java (95%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/backend}/StepDefinition.java (94%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/backend}/StepDefinitionMatch.java (86%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/exception}/CucumberException.java (89%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/filter/Filters.java (95%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/filter/LinePredicate.java (96%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/filter/NamePredicate.java (94%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/filter/PicklePredicate.java (77%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/filter/RerunFilters.java (87%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/filter/TagExpressionOld.java (99%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/filter/TagPredicate.java (98%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/io}/ClassFinder.java (89%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/ClasspathResourceIterable.java (89%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/ClasspathResourceLoader.java (92%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/DelegatingResourceIteratorFactory.java (95%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/FileResource.java (98%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/FileResourceIterable.java (94%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/FileResourceIterator.java (97%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/FileResourceIteratorFactory.java (93%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/FileResourceLoader.java (90%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/FlatteningIterator.java (98%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/Helpers.java (93%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/MultiLoader.java (98%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/Resource.java (89%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/ResourceIteratorFactory.java (96%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/ResourceLoader.java (77%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/ResourceLoaderClassFinder.java (95%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/URLOutputStream.java (98%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/UTF8OutputStreamWriter.java (91%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/ZipResource.java (96%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/ZipResourceIterator.java (98%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/ZipResourceIteratorFactory.java (89%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/io/ZipThenFileResourceIteratorFactory.java (97%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/model/CucumberFeature.java (80%) rename core/src/main/java/{cucumber/util => io/cucumber/core/model}/Encoding.java (82%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/model/FeatureBuilder.java (94%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/model}/FeatureCompiler.java (88%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/model/FeatureLoader.java (92%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/model/PathWithLines.java (97%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/options}/Env.java (98%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/options}/RuntimeOptions.java (93%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/options}/RuntimeOptionsFactory.java (97%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/options}/Shellwords.java (95%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/AnsiFormats.java (98%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/DefaultSummaryPrinter.java (96%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/Format.java (62%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/Formats.java (69%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/HTMLFormatter.java (98%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JSONFormatter.java (99%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JUnitFormatter.java (95%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/MonochromeFormats.java (89%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/NullSummaryPrinter.java (84%) create mode 100644 core/src/main/java/io/cucumber/core/plugin/Options.java rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/PluginFactory.java (90%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/Plugins.java (63%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/PrettyFormatter.java (99%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/ProgressFormatter.java (98%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/RerunFormatter.java (98%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/Stats.java (97%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/TestNGFormatter.java (98%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/TestSourcesModel.java (99%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/TimelineFormatter.java (91%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/plugin}/UndefinedStepsTracker.java (97%) rename core/src/main/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/UsageFormatter.java (98%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/reflection}/MethodFormat.java (97%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/reflection}/NoInstancesException.java (66%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/reflection}/Reflections.java (82%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/reflection}/TooManyInstancesException.java (80%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/AbstractEventBus.java (90%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/AbstractEventPublisher.java (98%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/AmbiguousPickleStepDefinitionsMatch.java (90%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/AmbiguousStepDefinitionsException.java (92%) rename core/src/main/java/{cucumber/runner/Glue.java => io/cucumber/core/runner/CachingGlue.java} (93%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/CanonicalOrderEventPublisher.java (94%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core/runner}/DefinitionArgument.java (82%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/EventBus.java (87%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/FailedPickleStepInstantiationMatch.java (89%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/HookComparator.java (84%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/HookDefinitionMatch.java (81%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/HookTestStep.java (92%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/Match.java (88%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/NoStepDefinition.java (84%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/PickleStepDefinitionMatch.java (95%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/PickleStepTestStep.java (97%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/Runner.java (93%) create mode 100644 core/src/main/java/io/cucumber/core/runner/RunnerSupplier.java rename core/src/main/java/{cucumber => io/cucumber/core}/runner/Scenario.java (98%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/SingletonRunnerSupplier.java (86%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/TestCase.java (98%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/TestStep.java (97%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/ThreadLocalRunnerSupplier.java (94%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/TimeService.java (85%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/TimeServiceEventBus.java (89%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/UndefinedPickleStepDefinitionMatch.java (87%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/UndefinedStepDefinitionException.java (66%) rename core/src/main/java/{cucumber => io/cucumber/core}/runner/UndefinedStepException.java (87%) rename core/src/main/java/{cucumber => io/cucumber/core}/runtime/BackendModuleBackendSupplier.java (81%) rename core/src/main/java/{cucumber => io/cucumber/core}/runtime/DefaultTypeRegistryConfiguration.java (72%) create mode 100644 core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java rename core/src/main/java/{cucumber => io/cucumber/core}/runtime/FeatureSupplier.java (54%) rename core/src/main/java/{cucumber/runtime/Utils.java => io/cucumber/core/runtime/Invoker.java} (54%) rename core/src/main/java/{cucumber => io/cucumber/core}/runtime/Runtime.java (75%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/snippets/ArgumentPattern.java (96%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/snippets/CamelCaseConcatenator.java (94%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/snippets/Concatenator.java (68%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/snippets/FunctionNameGenerator.java (97%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/snippets/Snippet.java (97%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/snippets/SnippetGenerator.java (99%) rename core/src/main/java/{cucumber/runtime => io/cucumber/core}/snippets/UnderscoreConcatenator.java (93%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/Argument.java (57%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/ArgumentMatcher.java (78%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/DataTableArgument.java (94%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/DocStringArgument.java (92%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/DocStringTransformer.java (64%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/ExpressionArgument.java (93%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/ExpressionArgumentMatcher.java (96%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/PickleTableConverter.java (93%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/RawTableTransformer.java (71%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/StepExpression.java (97%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/StepExpressionFactory.java (97%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/TypeRegistry.java (97%) rename core/src/main/java/io/cucumber/{ => core}/stepexpression/TypeResolver.java (87%) rename core/src/main/java/{cucumber => io/cucumber/core}/util/FixJava.java (52%) rename core/src/main/java/{cucumber => io/cucumber/core}/util/Mapper.java (62%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/timeline/chosen-sprite.png (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/timeline/chosen.jquery.min.js (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/timeline/chosen.min.css (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/timeline/chosen.override.css (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/timeline/formatter.js (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/timeline/index.html (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/timeline/jquery-3.3.1.min.js (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/timeline/report.css (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/timeline/vis.min.css (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/timeline/vis.min.js (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/timeline/vis.override.css (100%) rename core/src/main/resources/{cucumber => io/cucumber/core}/version.properties (100%) delete mode 100644 core/src/test/java/cucumber/runtime/UtilsTest.java rename core/src/test/java/{cucumber/runtime => io/cucumber/core/backend}/StubBackend.java (76%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/filter/LinePredicateTest.java (98%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/filter/NamePredicateTest.java (98%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/filter/TagPredicateTest.java (99%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/io/DelegatingResourceIteratorFactoryTest.java (96%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/io/FileResourceTest.java (97%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/io/FlatteningIteratorTest.java (97%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/io/HelpersTest.java (93%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/io/ResourceLoaderTest.java (87%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/io/TestResourceIterator.java (93%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/io/TestResourceIteratorFactory.java (94%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/io/URLOutputStreamTest.java (90%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/io/ZipResourceIteratorFactoryTest.java (97%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/model/CucumberFeatureTest.java (98%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/model/FeatureBuilderTest.java (97%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/model/PathWithLinesTest.java (97%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core/options}/EnvTest.java (97%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core/options}/RuntimeOptionsFactoryTest.java (84%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core/options}/RuntimeOptionsTest.java (90%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core/options}/ShellwordsTest.java (96%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/AnyStepDefinitionReporter.java (81%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/AverageUsageStatisticStrategyTest.java (97%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/FormatterBuilder.java (80%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/FormatterSpy.java (98%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/HTMLFormatterTest.java (91%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JSONFormatterTest.java (97%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JUnitFormatterTest.java (89%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JsonParallelRuntimeTest.java (68%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/MedianUsageStatisticStrategyTest.java (98%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/PickleStepMatcher.java (92%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/PluginFactoryTest.java (74%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/PrettyFormatterTest.java (97%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/RerunFormatterTest.java (98%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/StatsTest.java (99%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/StubFormatter.java (88%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/TempDir.java (74%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/TestNGFormatterTest.java (88%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/TimelineFormatterTest.java (98%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core/plugin}/UndefinedStepsTrackerTest.java (88%) rename core/src/test/java/{cucumber/runtime/formatter => io/cucumber/core/plugin}/UsageFormatterTest.java (99%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core/reflection}/MethodFormatTest.java (89%) create mode 100644 core/src/test/java/io/cucumber/core/reflection/ReflectionsTest.java rename core/src/test/java/{cucumber => io/cucumber/core}/runner/AmbiguousStepDefinitionMatchsTest.java (97%) rename core/src/test/java/{cucumber/runner/GlueTest.java => io/cucumber/core/runner/CachingGlueTest.java} (90%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/EventBusTest.java (97%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/FailedStepInstantiationMatchTest.java (97%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/HookOrderTest.java (92%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/HookTest.java (89%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/HookTestStepTest.java (96%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/PickleStepTestStepTest.java (99%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/RunnerTest.java (97%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/ScenarioResultTest.java (99%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/ScenarioTest.java (98%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/SingletonRunnerSupplierTest.java (80%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/StepDefinitionMatchTest.java (97%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/StepDurationTimeService.java (94%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/TestBackendSupplier.java (78%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/TestCaseTest.java (98%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/TestHelper.java (96%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/TestRunnerSupplier.java (64%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/TimeServiceStub.java (87%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/TimeServiceTest.java (95%) rename core/src/test/java/{cucumber => io/cucumber/core}/runner/UndefinedStepDefinitionMatchTest.java (96%) rename core/src/test/java/{cucumber => io/cucumber/core}/runtime/BackendModuleBackendSupplierTest.java (71%) rename core/src/test/java/{cucumber => io/cucumber/core}/runtime/ExitStatusTest.java (96%) rename core/src/test/java/{cucumber/runtime/TimeoutTest.java => io/cucumber/core/runtime/InvokerTest.java} (89%) rename core/src/test/java/{cucumber => io/cucumber/core}/runtime/RuntimeTest.java (95%) rename core/src/test/java/{cucumber => io/cucumber/core}/runtime/StubStepDefinition.java (80%) rename core/src/test/java/{cucumber => io/cucumber/core}/runtime/ThreadLocalRunnerSupplierTest.java (85%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/snippets/ArgumentPatternTest.java (95%) rename core/src/test/java/{cucumber/runtime => io/cucumber/core}/snippets/FunctionNameGeneratorTest.java (98%) rename core/src/test/java/io/cucumber/{ => core}/stepexpression/StepExpressionFactoryTest.java (98%) rename core/src/test/java/io/cucumber/{ => core}/stepexpression/TableParser.java (90%) delete mode 100644 core/src/test/resources/META-INF/services/cucumber.runtime.io.ResourceIteratorFactory create mode 100644 core/src/test/resources/META-INF/services/io.cucumber.core.io.ResourceIteratorFactory rename core/src/test/resources/{cucumber/runtime => io/cucumber/core/io}/bar.properties (100%) rename core/src/test/resources/{cucumber/runtime => io/cucumber/core/io}/foo.properties (100%) rename core/src/test/resources/{cucumber/runtime => io/cucumber/core/io}/has spaces.properties (100%) rename core/src/test/resources/{cucumber/runtime/formatter => io/cucumber/core/plugin}/FormatterInParallel.feature (100%) rename core/src/test/resources/{cucumber/runtime/formatter => io/cucumber/core/plugin}/HTMLFormatterTest.feature (100%) rename core/src/test/resources/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JSONPrettyFormatterTest.feature (100%) rename core/src/test/resources/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JSONPrettyFormatterTest.json (99%) rename core/src/test/resources/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JUnitFormatterTest_1.feature (100%) rename core/src/test/resources/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JUnitFormatterTest_1.report.xml (88%) rename core/src/test/resources/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JUnitFormatterTest_1_strict.report.xml (89%) rename core/src/test/resources/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JUnitFormatterTest_2.feature (100%) rename core/src/test/resources/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JUnitFormatterTest_2.report.xml (92%) rename core/src/test/resources/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JUnitFormatterTest_3.feature (100%) rename core/src/test/resources/{cucumber/runtime/formatter => io/cucumber/core/plugin}/JUnitFormatterTest_3.report.xml (96%) diff --git a/core/src/main/java/cucumber/api/SnippetType.java b/core/src/main/java/cucumber/api/SnippetType.java index 3809e0ab28..a7bc666c6c 100644 --- a/core/src/main/java/cucumber/api/SnippetType.java +++ b/core/src/main/java/cucumber/api/SnippetType.java @@ -1,10 +1,9 @@ package cucumber.api; -import cucumber.runtime.CucumberException; -import cucumber.runtime.snippets.CamelCaseConcatenator; -import cucumber.runtime.snippets.Concatenator; -import cucumber.runtime.snippets.FunctionNameGenerator; -import cucumber.runtime.snippets.UnderscoreConcatenator; +import io.cucumber.core.snippets.CamelCaseConcatenator; +import io.cucumber.core.snippets.Concatenator; +import io.cucumber.core.snippets.FunctionNameGenerator; +import io.cucumber.core.snippets.UnderscoreConcatenator; public enum SnippetType { UNDERSCORE("underscore", new UnderscoreConcatenator()), @@ -24,7 +23,7 @@ public static SnippetType fromString(String name) { return snippetType; } } - throw new CucumberException(String.format("Unrecognized SnippetType %s", name)); + throw new IllegalArgumentException(String.format("Unrecognized SnippetType %s", name)); } public FunctionNameGenerator getFunctionNameGenerator() { diff --git a/core/src/main/java/cucumber/api/StepDefinitionReporter.java b/core/src/main/java/cucumber/api/StepDefinitionReporter.java index 81c317c57f..5083829c38 100644 --- a/core/src/main/java/cucumber/api/StepDefinitionReporter.java +++ b/core/src/main/java/cucumber/api/StepDefinitionReporter.java @@ -1,6 +1,6 @@ package cucumber.api; -import cucumber.runtime.StepDefinition; +import io.cucumber.core.backend.StepDefinition; public interface StepDefinitionReporter extends Plugin { /** diff --git a/core/src/main/java/cucumber/api/cli/Main.java b/core/src/main/java/cucumber/api/cli/Main.java index c8c79a0d9b..f4007d2550 100644 --- a/core/src/main/java/cucumber/api/cli/Main.java +++ b/core/src/main/java/cucumber/api/cli/Main.java @@ -1,6 +1,6 @@ package cucumber.api.cli; -import cucumber.runtime.Runtime; +import io.cucumber.core.runtime.Runtime; public class Main { diff --git a/core/src/main/java/cucumber/api/event/ConcurrentEventListener.java b/core/src/main/java/cucumber/api/event/ConcurrentEventListener.java index 3da8faf1d1..0b471abe0e 100644 --- a/core/src/main/java/cucumber/api/event/ConcurrentEventListener.java +++ b/core/src/main/java/cucumber/api/event/ConcurrentEventListener.java @@ -30,7 +30,7 @@ public interface ConcurrentEventListener extends Plugin { /** - * Set the event publisher. The formatter can register event listeners with the publisher. + * Set the event publisher. The plugin can register event listeners with the publisher. * * @param publisher the event publisher */ diff --git a/core/src/main/java/cucumber/runner/RunnerSupplier.java b/core/src/main/java/cucumber/runner/RunnerSupplier.java deleted file mode 100644 index 8a8a5c2a4b..0000000000 --- a/core/src/main/java/cucumber/runner/RunnerSupplier.java +++ /dev/null @@ -1,7 +0,0 @@ -package cucumber.runner; - -import cucumber.runner.Runner; - -public interface RunnerSupplier { - Runner get(); -} diff --git a/core/src/main/java/cucumber/runtime/ExitStatus.java b/core/src/main/java/cucumber/runtime/ExitStatus.java deleted file mode 100755 index 6514d9fd77..0000000000 --- a/core/src/main/java/cucumber/runtime/ExitStatus.java +++ /dev/null @@ -1,48 +0,0 @@ -package cucumber.runtime; - -import cucumber.api.Result; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; - -import java.util.ArrayList; -import java.util.List; - -import static cucumber.api.Result.SEVERITY; -import static java.util.Collections.max; -import static java.util.Collections.min; - -public class ExitStatus implements EventListener { - private static final byte DEFAULT = 0x0; - private static final byte ERRORS = 0x1; - - private final List results = new ArrayList(); - private final RuntimeOptions runtimeOptions; - - private final EventHandler testCaseFinishedHandler = new EventHandler() { - @Override - public void receive(TestCaseFinished event) { - results.add(event.result); - } - }; - - public ExitStatus(RuntimeOptions runtimeOptions) { - this.runtimeOptions = runtimeOptions; - } - - @Override - public void setEventPublisher(EventPublisher publisher) { - publisher.registerHandlerFor(TestCaseFinished.class, testCaseFinishedHandler); - } - - public byte exitStatus() { - if (results.isEmpty()) { return DEFAULT; } - - if (runtimeOptions.isWip()) { - return min(results, SEVERITY).is(Result.Type.PASSED) ? ERRORS : DEFAULT; - } - - return max(results, SEVERITY).isOk(runtimeOptions.isStrict()) ? DEFAULT : ERRORS; - } -} diff --git a/core/src/main/java/cucumber/runtime/FeaturePathFeatureSupplier.java b/core/src/main/java/cucumber/runtime/FeaturePathFeatureSupplier.java deleted file mode 100644 index fab1995f0b..0000000000 --- a/core/src/main/java/cucumber/runtime/FeaturePathFeatureSupplier.java +++ /dev/null @@ -1,24 +0,0 @@ -package cucumber.runtime; - -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.model.FeatureLoader; - -import java.util.List; - -/** - * Supplies a list of features found on the the feature path provided to RuntimeOptions. - */ -public class FeaturePathFeatureSupplier implements FeatureSupplier { - private final FeatureLoader featureLoader; - private final RuntimeOptions runtimeOptions; - - public FeaturePathFeatureSupplier(FeatureLoader featureLoader, RuntimeOptions runtimeOptions) { - this.featureLoader = featureLoader; - this.runtimeOptions = runtimeOptions; - } - - @Override - public List get() { - return featureLoader.load(runtimeOptions.getFeaturePaths(), System.out); - } -} diff --git a/core/src/main/java/cucumber/runtime/GlueSupplier.java b/core/src/main/java/cucumber/runtime/GlueSupplier.java deleted file mode 100644 index 623fb5f47f..0000000000 --- a/core/src/main/java/cucumber/runtime/GlueSupplier.java +++ /dev/null @@ -1,5 +0,0 @@ -package cucumber.runtime; - -public interface GlueSupplier { - Glue get(); -} diff --git a/core/src/main/java/cucumber/runtime/Supplier.java b/core/src/main/java/cucumber/runtime/Supplier.java deleted file mode 100644 index 7ee00439ae..0000000000 --- a/core/src/main/java/cucumber/runtime/Supplier.java +++ /dev/null @@ -1,7 +0,0 @@ -package cucumber.runtime; - -public interface Supplier { - - T get(); - -} diff --git a/core/src/main/java/cucumber/runtime/Timeout.java b/core/src/main/java/cucumber/runtime/Timeout.java deleted file mode 100644 index 2bc310edfc..0000000000 --- a/core/src/main/java/cucumber/runtime/Timeout.java +++ /dev/null @@ -1,63 +0,0 @@ -package cucumber.runtime; - -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicBoolean; - -public class Timeout { - private Timeout() { - } - - public static T timeout(Callback callback, long timeoutMillis) throws Throwable { - if (timeoutMillis == 0) { - return callback.call(); - } - - /* We need to ensure a happens before relation exists between these events; - * a. the timer setting the interrupt flag on the execution thread. - * b. terminating and cleaning up the timer - * To do this we synchronize on monitor. The atomic boolean is merely a convenient container. - */ - final Thread executionThread = Thread.currentThread(); - final Object monitor = new Object(); - final AtomicBoolean done = new AtomicBoolean(); - - ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); - ScheduledFuture timer = executorService.schedule(new Runnable() { - @Override - public void run() { - synchronized (monitor) { - if (!done.get()) { - executionThread.interrupt(); - } - } - } - }, timeoutMillis, TimeUnit.MILLISECONDS); - - try { - T result = callback.call(); - // The callback may have been busy waiting. - if (Thread.interrupted()) { - throw new TimeoutException("Timed out after " + timeoutMillis + "ms."); - } - return result; - } catch (InterruptedException timeout) { - throw new TimeoutException("Timed out after " + timeoutMillis + "ms."); - } finally { - synchronized (monitor) { - done.set(true); - timer.cancel(true); - executorService.shutdownNow(); - // Clear the interrupted flag. It may have been set by the timer just before we returned the result. - Thread.interrupted(); - } - } - } - - public interface Callback { - T call() throws Throwable; - } -} diff --git a/core/src/main/java/cucumber/runtime/autocomplete/MetaStepdef.java b/core/src/main/java/cucumber/runtime/autocomplete/MetaStepdef.java deleted file mode 100644 index e68683fd3d..0000000000 --- a/core/src/main/java/cucumber/runtime/autocomplete/MetaStepdef.java +++ /dev/null @@ -1,95 +0,0 @@ -package cucumber.runtime.autocomplete; - -import gherkin.deps.com.google.gson.Gson; -import gherkin.deps.com.google.gson.GsonBuilder; - -import java.util.ArrayList; -import java.util.List; -import java.util.SortedSet; -import java.util.TreeSet; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class MetaStepdef { - private static final Gson GSON = new GsonBuilder().create(); - - public final SortedSet steps = new TreeSet(); - public String source; - public String flags; - private transient Pattern pattern; - - public boolean matches(String text) { - Pattern p = pattern(); - Matcher m = p.matcher(text); - return m.matches() || m.hitEnd(); - } - - private Pattern pattern() { - if (pattern == null) { - pattern = Pattern.compile(source); - } - return pattern; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - MetaStepdef that = (MetaStepdef) o; - - if (!flags.equals(that.flags)) return false; - if (!source.equals(that.source)) return false; - if (!steps.equals(that.steps)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = steps.hashCode(); - result = 31 * result + source.hashCode(); - result = 31 * result + flags.hashCode(); - return result; - } - - @Override - public String toString() { - return GSON.toJson(this); - } - - public static class MetaStep implements Comparable { - public String name; - public final List args = new ArrayList(); - - @Override - public int compareTo(MetaStep other) { - return name.compareTo(other.name); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - MetaStep metaStep = (MetaStep) o; - - if (!args.equals(metaStep.args)) return false; - if (!name.equals(metaStep.name)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = name.hashCode(); - result = 31 * result + args.hashCode(); - return result; - } - } - - public static class MetaArgument { - public int offset; - public String val; - } -} diff --git a/core/src/main/java/cucumber/runtime/Backend.java b/core/src/main/java/io/cucumber/core/backend/Backend.java similarity index 87% rename from core/src/main/java/cucumber/runtime/Backend.java rename to core/src/main/java/io/cucumber/core/backend/Backend.java index 91dc41668b..86c7db052b 100644 --- a/core/src/main/java/cucumber/runtime/Backend.java +++ b/core/src/main/java/io/cucumber/core/backend/Backend.java @@ -1,6 +1,6 @@ -package cucumber.runtime; +package io.cucumber.core.backend; -import cucumber.runtime.snippets.FunctionNameGenerator; +import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; import java.util.List; diff --git a/core/src/main/java/cucumber/runtime/BackendSupplier.java b/core/src/main/java/io/cucumber/core/backend/BackendSupplier.java similarity index 76% rename from core/src/main/java/cucumber/runtime/BackendSupplier.java rename to core/src/main/java/io/cucumber/core/backend/BackendSupplier.java index 59506410ef..a4fbb4672d 100644 --- a/core/src/main/java/cucumber/runtime/BackendSupplier.java +++ b/core/src/main/java/io/cucumber/core/backend/BackendSupplier.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.backend; import java.util.Collection; diff --git a/core/src/main/java/cucumber/runtime/DuplicateStepDefinitionException.java b/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java similarity index 82% rename from core/src/main/java/cucumber/runtime/DuplicateStepDefinitionException.java rename to core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java index f62890b807..277cb676dc 100644 --- a/core/src/main/java/cucumber/runtime/DuplicateStepDefinitionException.java +++ b/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java @@ -1,4 +1,6 @@ -package cucumber.runtime; +package io.cucumber.core.backend; + +import io.cucumber.core.exception.CucumberException; public class DuplicateStepDefinitionException extends CucumberException { public DuplicateStepDefinitionException(StepDefinition a, StepDefinition b) { diff --git a/core/src/main/java/cucumber/runtime/Glue.java b/core/src/main/java/io/cucumber/core/backend/Glue.java similarity index 85% rename from core/src/main/java/cucumber/runtime/Glue.java rename to core/src/main/java/io/cucumber/core/backend/Glue.java index f8db770287..a85631e10f 100644 --- a/core/src/main/java/cucumber/runtime/Glue.java +++ b/core/src/main/java/io/cucumber/core/backend/Glue.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.backend; public interface Glue { @@ -12,5 +12,4 @@ public interface Glue { void addAfterStepHook(HookDefinition hookDefinition); - void removeScenarioScopedGlue(); } diff --git a/core/src/main/java/cucumber/runtime/HookDefinition.java b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java similarity index 95% rename from core/src/main/java/cucumber/runtime/HookDefinition.java rename to core/src/main/java/io/cucumber/core/backend/HookDefinition.java index 02683bb746..63b8cbc9d2 100644 --- a/core/src/main/java/cucumber/runtime/HookDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.backend; import cucumber.api.Scenario; import gherkin.pickles.PickleTag; diff --git a/core/src/main/java/cucumber/runtime/StepDefinition.java b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java similarity index 94% rename from core/src/main/java/cucumber/runtime/StepDefinition.java rename to core/src/main/java/io/cucumber/core/backend/StepDefinition.java index f2aeb19237..beff2262b9 100644 --- a/core/src/main/java/cucumber/runtime/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java @@ -1,6 +1,6 @@ -package cucumber.runtime; +package io.cucumber.core.backend; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import gherkin.pickles.PickleStep; import java.util.List; diff --git a/core/src/main/java/cucumber/runtime/StepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java similarity index 86% rename from core/src/main/java/cucumber/runtime/StepDefinitionMatch.java rename to core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java index 30435a9e74..06fd2ec701 100644 --- a/core/src/main/java/cucumber/runtime/StepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.backend; import cucumber.api.Scenario; diff --git a/core/src/main/java/cucumber/runtime/CucumberException.java b/core/src/main/java/io/cucumber/core/exception/CucumberException.java similarity index 89% rename from core/src/main/java/cucumber/runtime/CucumberException.java rename to core/src/main/java/io/cucumber/core/exception/CucumberException.java index 4ce81aa33a..07e58a1957 100644 --- a/core/src/main/java/cucumber/runtime/CucumberException.java +++ b/core/src/main/java/io/cucumber/core/exception/CucumberException.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.exception; public class CucumberException extends RuntimeException { public CucumberException(String message) { diff --git a/core/src/main/java/cucumber/runtime/filter/Filters.java b/core/src/main/java/io/cucumber/core/filter/Filters.java similarity index 95% rename from core/src/main/java/cucumber/runtime/filter/Filters.java rename to core/src/main/java/io/cucumber/core/filter/Filters.java index da9a8b2885..4f05215c01 100644 --- a/core/src/main/java/cucumber/runtime/filter/Filters.java +++ b/core/src/main/java/io/cucumber/core/filter/Filters.java @@ -1,6 +1,6 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; -import cucumber.runtime.RuntimeOptions; +import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import java.util.ArrayList; diff --git a/core/src/main/java/cucumber/runtime/filter/LinePredicate.java b/core/src/main/java/io/cucumber/core/filter/LinePredicate.java similarity index 96% rename from core/src/main/java/cucumber/runtime/filter/LinePredicate.java rename to core/src/main/java/io/cucumber/core/filter/LinePredicate.java index 44f57d4b5b..026b5386be 100644 --- a/core/src/main/java/cucumber/runtime/filter/LinePredicate.java +++ b/core/src/main/java/io/cucumber/core/filter/LinePredicate.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; import gherkin.pickles.PickleLocation; diff --git a/core/src/main/java/cucumber/runtime/filter/NamePredicate.java b/core/src/main/java/io/cucumber/core/filter/NamePredicate.java similarity index 94% rename from core/src/main/java/cucumber/runtime/filter/NamePredicate.java rename to core/src/main/java/io/cucumber/core/filter/NamePredicate.java index b69ca5577d..317482b1bd 100644 --- a/core/src/main/java/cucumber/runtime/filter/NamePredicate.java +++ b/core/src/main/java/io/cucumber/core/filter/NamePredicate.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; diff --git a/core/src/main/java/cucumber/runtime/filter/PicklePredicate.java b/core/src/main/java/io/cucumber/core/filter/PicklePredicate.java similarity index 77% rename from core/src/main/java/cucumber/runtime/filter/PicklePredicate.java rename to core/src/main/java/io/cucumber/core/filter/PicklePredicate.java index e4c2a362df..0319fe9a16 100644 --- a/core/src/main/java/cucumber/runtime/filter/PicklePredicate.java +++ b/core/src/main/java/io/cucumber/core/filter/PicklePredicate.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; diff --git a/core/src/main/java/cucumber/runtime/filter/RerunFilters.java b/core/src/main/java/io/cucumber/core/filter/RerunFilters.java similarity index 87% rename from core/src/main/java/cucumber/runtime/filter/RerunFilters.java rename to core/src/main/java/io/cucumber/core/filter/RerunFilters.java index c8cc769caa..2a6098a7a4 100644 --- a/core/src/main/java/cucumber/runtime/filter/RerunFilters.java +++ b/core/src/main/java/io/cucumber/core/filter/RerunFilters.java @@ -1,8 +1,8 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.model.FeatureLoader; -import cucumber.runtime.model.PathWithLines; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.model.PathWithLines; import java.util.HashMap; import java.util.List; diff --git a/core/src/main/java/cucumber/runtime/filter/TagExpressionOld.java b/core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java similarity index 99% rename from core/src/main/java/cucumber/runtime/filter/TagExpressionOld.java rename to core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java index e527b986ce..da0b486e36 100644 --- a/core/src/main/java/cucumber/runtime/filter/TagExpressionOld.java +++ b/core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.pickles.PickleTag; diff --git a/core/src/main/java/cucumber/runtime/filter/TagPredicate.java b/core/src/main/java/io/cucumber/core/filter/TagPredicate.java similarity index 98% rename from core/src/main/java/cucumber/runtime/filter/TagPredicate.java rename to core/src/main/java/io/cucumber/core/filter/TagPredicate.java index 9f1bcfe7e2..b3a36b310e 100644 --- a/core/src/main/java/cucumber/runtime/filter/TagPredicate.java +++ b/core/src/main/java/io/cucumber/core/filter/TagPredicate.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; import gherkin.pickles.PickleTag; diff --git a/core/src/main/java/cucumber/runtime/ClassFinder.java b/core/src/main/java/io/cucumber/core/io/ClassFinder.java similarity index 89% rename from core/src/main/java/cucumber/runtime/ClassFinder.java rename to core/src/main/java/io/cucumber/core/io/ClassFinder.java index 7e2da8036e..bf7bd3972d 100644 --- a/core/src/main/java/cucumber/runtime/ClassFinder.java +++ b/core/src/main/java/io/cucumber/core/io/ClassFinder.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.io; import java.util.Collection; diff --git a/core/src/main/java/cucumber/runtime/io/ClasspathResourceIterable.java b/core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java similarity index 89% rename from core/src/main/java/cucumber/runtime/io/ClasspathResourceIterable.java rename to core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java index 77c6133f1f..176a958303 100644 --- a/core/src/main/java/cucumber/runtime/io/ClasspathResourceIterable.java +++ b/core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java @@ -1,11 +1,9 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.net.URL; -import java.net.URLDecoder; import java.util.Enumeration; import java.util.Iterator; diff --git a/core/src/main/java/cucumber/runtime/io/ClasspathResourceLoader.java b/core/src/main/java/io/cucumber/core/io/ClasspathResourceLoader.java similarity index 92% rename from core/src/main/java/cucumber/runtime/io/ClasspathResourceLoader.java rename to core/src/main/java/io/cucumber/core/io/ClasspathResourceLoader.java index a6843e4b00..e4d9fd9cd6 100644 --- a/core/src/main/java/cucumber/runtime/io/ClasspathResourceLoader.java +++ b/core/src/main/java/io/cucumber/core/io/ClasspathResourceLoader.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; public class ClasspathResourceLoader implements ResourceLoader { private final ClassLoader classLoader; diff --git a/core/src/main/java/cucumber/runtime/io/DelegatingResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/DelegatingResourceIteratorFactory.java similarity index 95% rename from core/src/main/java/cucumber/runtime/io/DelegatingResourceIteratorFactory.java rename to core/src/main/java/io/cucumber/core/io/DelegatingResourceIteratorFactory.java index 87a5747062..d7e2863732 100644 --- a/core/src/main/java/cucumber/runtime/io/DelegatingResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/DelegatingResourceIteratorFactory.java @@ -1,6 +1,6 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import java.net.URL; import java.util.Iterator; diff --git a/core/src/main/java/cucumber/runtime/io/FileResource.java b/core/src/main/java/io/cucumber/core/io/FileResource.java similarity index 98% rename from core/src/main/java/cucumber/runtime/io/FileResource.java rename to core/src/main/java/io/cucumber/core/io/FileResource.java index 4d1494087e..342b3a1d21 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResource.java +++ b/core/src/main/java/io/cucumber/core/io/FileResource.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.File; import java.io.FileInputStream; diff --git a/core/src/main/java/cucumber/runtime/io/FileResourceIterable.java b/core/src/main/java/io/cucumber/core/io/FileResourceIterable.java similarity index 94% rename from core/src/main/java/cucumber/runtime/io/FileResourceIterable.java rename to core/src/main/java/io/cucumber/core/io/FileResourceIterable.java index e0cb4ae795..288514495f 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResourceIterable.java +++ b/core/src/main/java/io/cucumber/core/io/FileResourceIterable.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.File; import java.util.Iterator; diff --git a/core/src/main/java/cucumber/runtime/io/FileResourceIterator.java b/core/src/main/java/io/cucumber/core/io/FileResourceIterator.java similarity index 97% rename from core/src/main/java/cucumber/runtime/io/FileResourceIterator.java rename to core/src/main/java/io/cucumber/core/io/FileResourceIterator.java index 9a9a650850..f1c86ce1a7 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResourceIterator.java +++ b/core/src/main/java/io/cucumber/core/io/FileResourceIterator.java @@ -1,10 +1,10 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.File; import java.io.FileFilter; import java.util.Iterator; -import static cucumber.runtime.io.Helpers.hasSuffix; +import static io.cucumber.core.io.Helpers.hasSuffix; import static java.util.Arrays.asList; public class FileResourceIterator implements Iterator { diff --git a/core/src/main/java/cucumber/runtime/io/FileResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/FileResourceIteratorFactory.java similarity index 93% rename from core/src/main/java/cucumber/runtime/io/FileResourceIteratorFactory.java rename to core/src/main/java/io/cucumber/core/io/FileResourceIteratorFactory.java index 746a382acf..166a3d20cd 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/FileResourceIteratorFactory.java @@ -1,10 +1,10 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.File; import java.net.URL; import java.util.Iterator; -import static cucumber.runtime.io.Helpers.filePath; +import static io.cucumber.core.io.Helpers.filePath; /** * Factory which creates {@link FileResourceIterator}s. diff --git a/core/src/main/java/cucumber/runtime/io/FileResourceLoader.java b/core/src/main/java/io/cucumber/core/io/FileResourceLoader.java similarity index 90% rename from core/src/main/java/cucumber/runtime/io/FileResourceLoader.java rename to core/src/main/java/io/cucumber/core/io/FileResourceLoader.java index 8785e249e2..9afb1e5ec9 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResourceLoader.java +++ b/core/src/main/java/io/cucumber/core/io/FileResourceLoader.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.File; diff --git a/core/src/main/java/cucumber/runtime/io/FlatteningIterator.java b/core/src/main/java/io/cucumber/core/io/FlatteningIterator.java similarity index 98% rename from core/src/main/java/cucumber/runtime/io/FlatteningIterator.java rename to core/src/main/java/io/cucumber/core/io/FlatteningIterator.java index 1ea9c99293..27090e0e3e 100644 --- a/core/src/main/java/cucumber/runtime/io/FlatteningIterator.java +++ b/core/src/main/java/io/cucumber/core/io/FlatteningIterator.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.util.ArrayDeque; import java.util.Deque; diff --git a/core/src/main/java/cucumber/runtime/io/Helpers.java b/core/src/main/java/io/cucumber/core/io/Helpers.java similarity index 93% rename from core/src/main/java/cucumber/runtime/io/Helpers.java rename to core/src/main/java/io/cucumber/core/io/Helpers.java index 16c7805cd4..2be85cd0d7 100644 --- a/core/src/main/java/cucumber/runtime/io/Helpers.java +++ b/core/src/main/java/io/cucumber/core/io/Helpers.java @@ -1,6 +1,6 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import java.net.MalformedURLException; import java.net.URISyntaxException; diff --git a/core/src/main/java/cucumber/runtime/io/MultiLoader.java b/core/src/main/java/io/cucumber/core/io/MultiLoader.java similarity index 98% rename from core/src/main/java/cucumber/runtime/io/MultiLoader.java rename to core/src/main/java/io/cucumber/core/io/MultiLoader.java index f4856b471d..1ab38f3eb0 100644 --- a/core/src/main/java/cucumber/runtime/io/MultiLoader.java +++ b/core/src/main/java/io/cucumber/core/io/MultiLoader.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/cucumber/runtime/io/Resource.java b/core/src/main/java/io/cucumber/core/io/Resource.java similarity index 89% rename from core/src/main/java/cucumber/runtime/io/Resource.java rename to core/src/main/java/io/cucumber/core/io/Resource.java index 7b52b5fd04..7a57523e04 100644 --- a/core/src/main/java/cucumber/runtime/io/Resource.java +++ b/core/src/main/java/io/cucumber/core/io/Resource.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.IOException; import java.io.InputStream; diff --git a/core/src/main/java/cucumber/runtime/io/ResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/ResourceIteratorFactory.java similarity index 96% rename from core/src/main/java/cucumber/runtime/io/ResourceIteratorFactory.java rename to core/src/main/java/io/cucumber/core/io/ResourceIteratorFactory.java index 912bfd1aee..3f42f322fe 100644 --- a/core/src/main/java/cucumber/runtime/io/ResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/ResourceIteratorFactory.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.net.URL; import java.util.Iterator; diff --git a/core/src/main/java/cucumber/runtime/io/ResourceLoader.java b/core/src/main/java/io/cucumber/core/io/ResourceLoader.java similarity index 77% rename from core/src/main/java/cucumber/runtime/io/ResourceLoader.java rename to core/src/main/java/io/cucumber/core/io/ResourceLoader.java index 8920da4e43..34906d48ae 100644 --- a/core/src/main/java/cucumber/runtime/io/ResourceLoader.java +++ b/core/src/main/java/io/cucumber/core/io/ResourceLoader.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; public interface ResourceLoader { Iterable resources(String path, String suffix); diff --git a/core/src/main/java/cucumber/runtime/io/ResourceLoaderClassFinder.java b/core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java similarity index 95% rename from core/src/main/java/cucumber/runtime/io/ResourceLoaderClassFinder.java rename to core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java index 9085bddece..b8d832502b 100644 --- a/core/src/main/java/cucumber/runtime/io/ResourceLoaderClassFinder.java +++ b/core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java @@ -1,6 +1,4 @@ -package cucumber.runtime.io; - -import cucumber.runtime.ClassFinder; +package io.cucumber.core.io; import java.io.File; import java.util.Collection; diff --git a/core/src/main/java/cucumber/runtime/io/URLOutputStream.java b/core/src/main/java/io/cucumber/core/io/URLOutputStream.java similarity index 98% rename from core/src/main/java/cucumber/runtime/io/URLOutputStream.java rename to core/src/main/java/io/cucumber/core/io/URLOutputStream.java index 777c87cca9..dfe3ca4c90 100644 --- a/core/src/main/java/cucumber/runtime/io/URLOutputStream.java +++ b/core/src/main/java/io/cucumber/core/io/URLOutputStream.java @@ -1,7 +1,7 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import gherkin.deps.com.google.gson.Gson; -import cucumber.util.FixJava; +import io.cucumber.core.util.FixJava; import java.io.*; import java.net.HttpURLConnection; diff --git a/core/src/main/java/cucumber/runtime/io/UTF8OutputStreamWriter.java b/core/src/main/java/io/cucumber/core/io/UTF8OutputStreamWriter.java similarity index 91% rename from core/src/main/java/cucumber/runtime/io/UTF8OutputStreamWriter.java rename to core/src/main/java/io/cucumber/core/io/UTF8OutputStreamWriter.java index 4c638a3fb1..04c1d66434 100644 --- a/core/src/main/java/cucumber/runtime/io/UTF8OutputStreamWriter.java +++ b/core/src/main/java/io/cucumber/core/io/UTF8OutputStreamWriter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.IOException; import java.io.OutputStream; diff --git a/core/src/main/java/cucumber/runtime/io/ZipResource.java b/core/src/main/java/io/cucumber/core/io/ZipResource.java similarity index 96% rename from core/src/main/java/cucumber/runtime/io/ZipResource.java rename to core/src/main/java/io/cucumber/core/io/ZipResource.java index 228d4966b6..fac4ed8abc 100644 --- a/core/src/main/java/cucumber/runtime/io/ZipResource.java +++ b/core/src/main/java/io/cucumber/core/io/ZipResource.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.IOException; import java.io.InputStream; diff --git a/core/src/main/java/cucumber/runtime/io/ZipResourceIterator.java b/core/src/main/java/io/cucumber/core/io/ZipResourceIterator.java similarity index 98% rename from core/src/main/java/cucumber/runtime/io/ZipResourceIterator.java rename to core/src/main/java/io/cucumber/core/io/ZipResourceIterator.java index fe0f8abdbf..15e960f65b 100644 --- a/core/src/main/java/cucumber/runtime/io/ZipResourceIterator.java +++ b/core/src/main/java/io/cucumber/core/io/ZipResourceIterator.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.IOException; import java.util.Enumeration; diff --git a/core/src/main/java/cucumber/runtime/io/ZipResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/ZipResourceIteratorFactory.java similarity index 89% rename from core/src/main/java/cucumber/runtime/io/ZipResourceIteratorFactory.java rename to core/src/main/java/io/cucumber/core/io/ZipResourceIteratorFactory.java index 2b2e41dba8..8d53c8c1e2 100644 --- a/core/src/main/java/cucumber/runtime/io/ZipResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/ZipResourceIteratorFactory.java @@ -1,10 +1,10 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.io.IOException; import java.net.URL; import java.util.Iterator; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; /** * Factory which creates {@link ZipResourceIterator}s for URL's with "jar", "zip" and "wsjar" diff --git a/core/src/main/java/cucumber/runtime/io/ZipThenFileResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java similarity index 97% rename from core/src/main/java/cucumber/runtime/io/ZipThenFileResourceIteratorFactory.java rename to core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java index 09a96939df..5f31114715 100644 --- a/core/src/main/java/cucumber/runtime/io/ZipThenFileResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.net.URL; import java.util.Iterator; diff --git a/core/src/main/java/cucumber/runtime/model/CucumberFeature.java b/core/src/main/java/io/cucumber/core/model/CucumberFeature.java similarity index 80% rename from core/src/main/java/cucumber/runtime/model/CucumberFeature.java rename to core/src/main/java/io/cucumber/core/model/CucumberFeature.java index 07d308bbdd..8ff34a721e 100644 --- a/core/src/main/java/cucumber/runtime/model/CucumberFeature.java +++ b/core/src/main/java/io/cucumber/core/model/CucumberFeature.java @@ -1,7 +1,5 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; -import cucumber.api.event.TestSourceRead; -import cucumber.runner.EventBus; import gherkin.ast.GherkinDocument; import java.io.Serializable; @@ -28,8 +26,8 @@ public String getUri() { return uri; } - public void sendTestSourceRead(EventBus bus) { - bus.send(new TestSourceRead(bus.getTime(), uri, gherkinSource)); + public String getGherkinSource() { + return gherkinSource; } public static class CucumberFeatureUriComparator implements Comparator { diff --git a/core/src/main/java/cucumber/util/Encoding.java b/core/src/main/java/io/cucumber/core/model/Encoding.java similarity index 82% rename from core/src/main/java/cucumber/util/Encoding.java rename to core/src/main/java/io/cucumber/core/model/Encoding.java index 15e19b954e..2c21180ea0 100644 --- a/core/src/main/java/cucumber/util/Encoding.java +++ b/core/src/main/java/io/cucumber/core/model/Encoding.java @@ -1,6 +1,7 @@ -package cucumber.util; +package io.cucumber.core.model; -import cucumber.runtime.io.Resource; +import io.cucumber.core.io.Resource; +import io.cucumber.core.util.FixJava; import java.io.IOException; import java.io.InputStreamReader; @@ -10,12 +11,12 @@ /** * Utilities for reading the encoding of a file. */ -public class Encoding { +class Encoding { private static final Pattern COMMENT_OR_EMPTY_LINE_PATTERN = Pattern.compile("^\\s*#|^\\s*$"); private static final Pattern ENCODING_PATTERN = Pattern.compile("^\\s*#\\s*encoding\\s*:\\s*([0-9a-zA-Z\\-]+)", Pattern.CASE_INSENSITIVE); - public static final String DEFAULT_ENCODING = "UTF-8"; + private static final String DEFAULT_ENCODING = "UTF-8"; - public static String readFile(Resource resource) throws RuntimeException, IOException { + static String readFile(Resource resource) throws RuntimeException, IOException { String source = FixJava.readReader(new InputStreamReader(resource.getInputStream(), DEFAULT_ENCODING)); String enc = encoding(source); if(!enc.equals(DEFAULT_ENCODING)) { diff --git a/core/src/main/java/cucumber/runtime/model/FeatureBuilder.java b/core/src/main/java/io/cucumber/core/model/FeatureBuilder.java similarity index 94% rename from core/src/main/java/cucumber/runtime/model/FeatureBuilder.java rename to core/src/main/java/io/cucumber/core/model/FeatureBuilder.java index 728c2e1c69..77ba998f4e 100644 --- a/core/src/main/java/cucumber/runtime/model/FeatureBuilder.java +++ b/core/src/main/java/io/cucumber/core/model/FeatureBuilder.java @@ -1,8 +1,7 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.Resource; -import cucumber.util.Encoding; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.Resource; import gherkin.AstBuilder; import gherkin.Parser; import gherkin.ParserException; diff --git a/core/src/main/java/cucumber/runtime/FeatureCompiler.java b/core/src/main/java/io/cucumber/core/model/FeatureCompiler.java similarity index 88% rename from core/src/main/java/cucumber/runtime/FeatureCompiler.java rename to core/src/main/java/io/cucumber/core/model/FeatureCompiler.java index 75acc1c336..cbd8769e3c 100644 --- a/core/src/main/java/cucumber/runtime/FeatureCompiler.java +++ b/core/src/main/java/io/cucumber/core/model/FeatureCompiler.java @@ -1,6 +1,5 @@ -package cucumber.runtime; +package io.cucumber.core.model; -import cucumber.runtime.model.CucumberFeature; import gherkin.events.PickleEvent; import gherkin.pickles.Compiler; import gherkin.pickles.Pickle; diff --git a/core/src/main/java/cucumber/runtime/model/FeatureLoader.java b/core/src/main/java/io/cucumber/core/model/FeatureLoader.java similarity index 92% rename from core/src/main/java/cucumber/runtime/model/FeatureLoader.java rename to core/src/main/java/io/cucumber/core/model/FeatureLoader.java index 28983b2ac9..704c7e914b 100644 --- a/core/src/main/java/cucumber/runtime/model/FeatureLoader.java +++ b/core/src/main/java/io/cucumber/core/model/FeatureLoader.java @@ -1,13 +1,9 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.Resource; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.model.FeatureBuilder; -import cucumber.runtime.model.PathWithLines; -import cucumber.util.Encoding; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; import java.io.IOException; import java.io.PrintStream; diff --git a/core/src/main/java/cucumber/runtime/model/PathWithLines.java b/core/src/main/java/io/cucumber/core/model/PathWithLines.java similarity index 97% rename from core/src/main/java/cucumber/runtime/model/PathWithLines.java rename to core/src/main/java/io/cucumber/core/model/PathWithLines.java index 4a1e06297b..1e791ba090 100644 --- a/core/src/main/java/cucumber/runtime/model/PathWithLines.java +++ b/core/src/main/java/io/cucumber/core/model/PathWithLines.java @@ -1,4 +1,4 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/cucumber/runtime/Env.java b/core/src/main/java/io/cucumber/core/options/Env.java similarity index 98% rename from core/src/main/java/cucumber/runtime/Env.java rename to core/src/main/java/io/cucumber/core/options/Env.java index 60afa48225..6e28ef9d8b 100644 --- a/core/src/main/java/cucumber/runtime/Env.java +++ b/core/src/main/java/io/cucumber/core/options/Env.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.options; import java.util.HashMap; import java.util.Map; diff --git a/core/src/main/java/cucumber/runtime/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java similarity index 93% rename from core/src/main/java/cucumber/runtime/RuntimeOptions.java rename to core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 8161ec1cf6..d83a575a81 100644 --- a/core/src/main/java/cucumber/runtime/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -1,15 +1,16 @@ -package cucumber.runtime; +package io.cucumber.core.options; import cucumber.api.SnippetType; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.plugin.Options; import io.cucumber.datatable.DataTable; -import cucumber.runtime.formatter.PluginFactory; -import cucumber.runtime.model.PathWithLines; -import cucumber.util.FixJava; -import cucumber.util.Mapper; +import io.cucumber.core.plugin.PluginFactory; +import io.cucumber.core.model.PathWithLines; +import io.cucumber.core.util.FixJava; +import io.cucumber.core.util.Mapper; import gherkin.GherkinDialect; import gherkin.GherkinDialectProvider; import gherkin.IGherkinDialectProvider; -import io.cucumber.datatable.DataTable; import java.io.InputStreamReader; import java.io.Reader; @@ -20,14 +21,14 @@ import java.util.ResourceBundle; import java.util.regex.Pattern; -import static cucumber.util.FixJava.join; -import static cucumber.util.FixJava.map; +import static io.cucumber.core.util.FixJava.join; +import static io.cucumber.core.util.FixJava.map; import static java.util.Arrays.asList; // IMPORTANT! Make sure USAGE.txt is always uptodate if this class changes. -public class RuntimeOptions { - public static final String VERSION = ResourceBundle.getBundle("cucumber.version").getString("cucumber-jvm.version"); - public static final String USAGE_RESOURCE = "/cucumber/api/cli/USAGE.txt"; +public class RuntimeOptions implements Options { + static final String VERSION = ResourceBundle.getBundle("io.cucumber.core.version").getString("cucumber-jvm.version"); + private static final String USAGE_RESOURCE = "/cucumber/api/cli/USAGE.txt"; static String usageText; @@ -85,7 +86,7 @@ public RuntimeOptions(List argv) { this(Env.INSTANCE, argv); } - public RuntimeOptions(Env env, List argv) { + RuntimeOptions(Env env, List argv) { argv = new ArrayList(argv); // in case the one passed in is unmodifiable. parse(argv); @@ -353,7 +354,7 @@ class ParsedPluginData { ParsedOptionNames stepDefinitionReporterNames = new ParsedOptionNames(); ParsedOptionNames summaryPrinterNames = new ParsedOptionNames(); - public void addPluginName(String name, boolean isAddPlugin) { + void addPluginName(String name, boolean isAddPlugin) { if (PluginFactory.isStepDefinitionReporterName(name)) { stepDefinitionReporterNames.addName(name, isAddPlugin); } else if (PluginFactory.isSummaryPrinterName(name)) { @@ -365,15 +366,15 @@ public void addPluginName(String name, boolean isAddPlugin) { } } - public void updatePluginFormatterNames(List pluginFormatterNames) { + void updatePluginFormatterNames(List pluginFormatterNames) { formatterNames.updateNameList(pluginFormatterNames); } - public void updatePluginStepDefinitionReporterNames(List pluginStepDefinitionReporterNames) { + void updatePluginStepDefinitionReporterNames(List pluginStepDefinitionReporterNames) { stepDefinitionReporterNames.updateNameList(pluginStepDefinitionReporterNames); } - public void updatePluginSummaryPrinterNames(List pluginSummaryPrinterNames) { + void updatePluginSummaryPrinterNames(List pluginSummaryPrinterNames) { summaryPrinterNames.updateNameList(pluginSummaryPrinterNames); } } diff --git a/core/src/main/java/cucumber/runtime/RuntimeOptionsFactory.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java similarity index 97% rename from core/src/main/java/cucumber/runtime/RuntimeOptionsFactory.java rename to core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java index d4e2ec1795..ce7691b3c3 100644 --- a/core/src/main/java/cucumber/runtime/RuntimeOptionsFactory.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java @@ -1,7 +1,8 @@ -package cucumber.runtime; +package io.cucumber.core.options; import cucumber.api.CucumberOptions; -import cucumber.runtime.io.MultiLoader; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.MultiLoader; import java.util.ArrayList; import java.util.Collections; diff --git a/core/src/main/java/cucumber/runtime/Shellwords.java b/core/src/main/java/io/cucumber/core/options/Shellwords.java similarity index 95% rename from core/src/main/java/cucumber/runtime/Shellwords.java rename to core/src/main/java/io/cucumber/core/options/Shellwords.java index a077394bdc..0f416ca74f 100644 --- a/core/src/main/java/cucumber/runtime/Shellwords.java +++ b/core/src/main/java/io/cucumber/core/options/Shellwords.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.options; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/cucumber/runtime/formatter/AnsiFormats.java b/core/src/main/java/io/cucumber/core/plugin/AnsiFormats.java similarity index 98% rename from core/src/main/java/cucumber/runtime/formatter/AnsiFormats.java rename to core/src/main/java/io/cucumber/core/plugin/AnsiFormats.java index 132da9fd4d..3deb971c8b 100644 --- a/core/src/main/java/cucumber/runtime/formatter/AnsiFormats.java +++ b/core/src/main/java/io/cucumber/core/plugin/AnsiFormats.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.formatter.AnsiEscapes; @@ -8,7 +8,7 @@ final class AnsiFormats implements Formats { private static final Map formats = new HashMap() {{ put("undefined", new ColorFormat(AnsiEscapes.YELLOW)); - put("undefined_arg", new ColorFormat(AnsiEscapes.YELLOW, AnsiEscapes.INTENSITY_BOLD)); // Never used, but avoids NPE in formatters. + put("undefined_arg", new ColorFormat(AnsiEscapes.YELLOW, AnsiEscapes.INTENSITY_BOLD)); // Never used, but avoids NPE in plugin. put("pending", new ColorFormat(AnsiEscapes.YELLOW)); put("pending_arg", new ColorFormat(AnsiEscapes.YELLOW, AnsiEscapes.INTENSITY_BOLD)); put("executing", new ColorFormat(AnsiEscapes.GREY)); diff --git a/core/src/main/java/cucumber/runtime/formatter/DefaultSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java similarity index 96% rename from core/src/main/java/cucumber/runtime/formatter/DefaultSummaryPrinter.java rename to core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java index e8457edc7e..6d89325723 100644 --- a/core/src/main/java/cucumber/runtime/formatter/DefaultSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.SummaryPrinter; import cucumber.api.event.EventHandler; @@ -7,7 +7,6 @@ import cucumber.api.event.TestRunFinished; import cucumber.api.formatter.ColorAware; import cucumber.api.formatter.StrictAware; -import cucumber.runtime.UndefinedStepsTracker; import java.io.PrintStream; import java.util.List; diff --git a/core/src/main/java/cucumber/runtime/formatter/Format.java b/core/src/main/java/io/cucumber/core/plugin/Format.java similarity index 62% rename from core/src/main/java/cucumber/runtime/formatter/Format.java rename to core/src/main/java/io/cucumber/core/plugin/Format.java index 4b60cf4392..73a9c52b13 100644 --- a/core/src/main/java/cucumber/runtime/formatter/Format.java +++ b/core/src/main/java/io/cucumber/core/plugin/Format.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; public interface Format { String text(String text); diff --git a/core/src/main/java/cucumber/runtime/formatter/Formats.java b/core/src/main/java/io/cucumber/core/plugin/Formats.java similarity index 69% rename from core/src/main/java/cucumber/runtime/formatter/Formats.java rename to core/src/main/java/io/cucumber/core/plugin/Formats.java index c803eab5a9..ad777901fe 100644 --- a/core/src/main/java/cucumber/runtime/formatter/Formats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Formats.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; public interface Formats { Format get(String key); diff --git a/core/src/main/java/cucumber/runtime/formatter/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java similarity index 98% rename from core/src/main/java/cucumber/runtime/formatter/HTMLFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index bc9b3d899e..802fce0961 100644 --- a/core/src/main/java/cucumber/runtime/formatter/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.HookTestStep; import cucumber.api.PickleStepTestStep; @@ -15,8 +15,8 @@ import cucumber.api.event.TestStepStarted; import cucumber.api.event.WriteEvent; import cucumber.api.formatter.NiceAppendable; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.URLOutputStream; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.URLOutputStream; import gherkin.ast.Background; import gherkin.ast.DataTable; import gherkin.ast.DocString; @@ -147,7 +147,7 @@ private void handleTestSourceRead(TestSourceRead event) { private void handleTestCaseStarted(TestCaseStarted event) { if (firstFeature) { jsOut.append("$(document).ready(function() {").append("var ") - .append(JS_FORMATTER_VAR).append(" = new CucumberHTML.DOMFormatter($('.cucumber-report'));"); + .append(JS_FORMATTER_VAR).append(" = new CucumberHTML.DOMFormatter($('.cucumber-report'));"); firstFeature = false; } handleStartOfFeature(event.testCase); @@ -187,7 +187,7 @@ private void handleTestStepFinished(TestStepFinished event) { private void handleEmbed(EmbedEvent event) { String mimeType = event.mimeType; if(mimeType.startsWith("text/")) { - // just pass straight to the formatter to output in the html + // just pass straight to the plugin to output in the html jsFunctionCall("embedding", mimeType, new String(event.data)); } else { // Creating a file instead of using data urls to not clutter the js file @@ -479,7 +479,7 @@ private URL toUrl(String fileName) { try { return new URL(htmlReportDir, fileName); } catch (IOException e) { - throw new CucumberException(e); + throw new CucumberException(e); } } diff --git a/core/src/main/java/cucumber/runtime/formatter/JSONFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java similarity index 99% rename from core/src/main/java/cucumber/runtime/formatter/JSONFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java index 5bd8e9d5f3..dfa18180ac 100644 --- a/core/src/main/java/cucumber/runtime/formatter/JSONFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.HookTestStep; import cucumber.api.HookType; @@ -316,8 +316,8 @@ private void addHookStepToTestCaseMap(Map currentStepOrHookMap, case AfterStep: mapToAddTo = currentStepsList.get(currentStepsList.size() - 1); break; - default: - mapToAddTo = currentTestCaseMap; + default: + mapToAddTo = currentTestCaseMap; } if (!mapToAddTo.containsKey(hookName)) { diff --git a/core/src/main/java/cucumber/runtime/formatter/JUnitFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java similarity index 95% rename from core/src/main/java/cucumber/runtime/formatter/JUnitFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java index f38f23aaee..ae5270f097 100644 --- a/core/src/main/java/cucumber/runtime/formatter/JUnitFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.PickleStepTestStep; import cucumber.api.Result; @@ -11,10 +11,9 @@ import cucumber.api.event.TestSourceRead; import cucumber.api.event.TestStepFinished; import cucumber.api.formatter.StrictAware; -import cucumber.runtime.CucumberException; -import cucumber.runtime.Utils; -import cucumber.runtime.io.URLOutputStream; -import cucumber.runtime.io.UTF8OutputStreamWriter; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.URLOutputStream; +import io.cucumber.core.io.UTF8OutputStreamWriter; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -93,6 +92,10 @@ public JUnitFormatter(URL out) throws IOException { } } + private static String getUniqueTestNameForScenarioExample(String testCaseName, int exampleNumber) { + return testCaseName + (testCaseName.contains(" ") ? " " : "_") + exampleNumber; + } + @Override public void setEventPublisher(EventPublisher publisher) { publisher.registerHandlerFor(TestSourceRead.class, sourceReadHandler); @@ -217,7 +220,7 @@ private void writeElement(Document doc, Element tc) { private String calculateElementName(cucumber.api.TestCase testCase) { String testCaseName = testCase.getName(); if (testCaseName.equals(previousTestCaseName)) { - return Utils.getUniqueTestNameForScenarioExample(testCaseName, ++exampleNumber); + return getUniqueTestNameForScenarioExample(testCaseName, ++exampleNumber); } else { previousTestCaseName = testCase.getName(); exampleNumber = 1; @@ -305,9 +308,8 @@ private Element createElement(Document doc, StringBuilder sb, String elementType // the createCDATASection method seems to convert "\n" to "\r\n" on Windows, in case // data originally contains "\r\n" line separators the result becomes "\r\r\n", which // are displayed as double line breaks. - // TODO Java 7 PR #1147: Inlined System.lineSeparator() - String systemLineSeperator = System.getProperty("line.separator"); - child.appendChild(doc.createCDATASection(sb.toString().replace(systemLineSeperator, "\n"))); + String normalizedLineEndings = sb.toString().replace(System.lineSeparator(), "\n"); + child.appendChild(doc.createCDATASection(normalizedLineEndings)); return child; } diff --git a/core/src/main/java/cucumber/runtime/formatter/MonochromeFormats.java b/core/src/main/java/io/cucumber/core/plugin/MonochromeFormats.java similarity index 89% rename from core/src/main/java/cucumber/runtime/formatter/MonochromeFormats.java rename to core/src/main/java/io/cucumber/core/plugin/MonochromeFormats.java index 716f5133ec..2598d540be 100644 --- a/core/src/main/java/cucumber/runtime/formatter/MonochromeFormats.java +++ b/core/src/main/java/io/cucumber/core/plugin/MonochromeFormats.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; final class MonochromeFormats implements Formats { private static final Format FORMAT = new Format() { diff --git a/core/src/main/java/cucumber/runtime/formatter/NullSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java similarity index 84% rename from core/src/main/java/cucumber/runtime/formatter/NullSummaryPrinter.java rename to core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java index 856639ea02..08a5fb9302 100644 --- a/core/src/main/java/cucumber/runtime/formatter/NullSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.SummaryPrinter; diff --git a/core/src/main/java/io/cucumber/core/plugin/Options.java b/core/src/main/java/io/cucumber/core/plugin/Options.java new file mode 100644 index 0000000000..d71b40c66f --- /dev/null +++ b/core/src/main/java/io/cucumber/core/plugin/Options.java @@ -0,0 +1,15 @@ +package io.cucumber.core.plugin; + +import java.util.List; + +public interface Options { + List getPluginFormatterNames(); + + List getPluginStepDefinitionReporterNames(); + + List getPluginSummaryPrinterNames(); + + boolean isMonochrome(); + + boolean isStrict(); +} diff --git a/core/src/main/java/cucumber/runtime/formatter/PluginFactory.java b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java similarity index 90% rename from core/src/main/java/cucumber/runtime/formatter/PluginFactory.java rename to core/src/main/java/io/cucumber/core/plugin/PluginFactory.java index ff329fd4e2..c3086fcc62 100644 --- a/core/src/main/java/cucumber/runtime/formatter/PluginFactory.java +++ b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java @@ -1,19 +1,20 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.Plugin; import cucumber.api.StepDefinitionReporter; import cucumber.api.SummaryPrinter; import cucumber.api.event.ConcurrentEventListener; import cucumber.api.event.EventListener; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.URLOutputStream; -import cucumber.runtime.io.UTF8OutputStreamWriter; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.URLOutputStream; +import io.cucumber.core.io.UTF8OutputStreamWriter; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; @@ -21,7 +22,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import static cucumber.runtime.Utils.toURL; import static java.util.Arrays.asList; /** @@ -59,6 +59,21 @@ public void close() { } }; + static URL toURL(String pathOrUrl) { + try { + if (!pathOrUrl.endsWith("/")) { + pathOrUrl = pathOrUrl + "/"; + } + if (pathOrUrl.matches("^(file|http|https):.*")) { + return new URL(pathOrUrl); + } else { + return new URL("file:" + pathOrUrl); + } + } catch (MalformedURLException e) { + throw new CucumberException("Bad URL:" + pathOrUrl, e); + } + } + public Plugin create(String pluginString) { Matcher pluginWithArgument = PLUGIN_WITH_ARGUMENT_PATTERN.matcher(pluginString); String pluginName; @@ -187,9 +202,9 @@ private Appendable defaultOutOrFailIfAlreadyUsed(String formatterString) { defaultOutFormatter = formatterString; return defaultOut; } else { - throw new CucumberException("Only one formatter can use STDOUT, now both " + + throw new CucumberException("Only one plugin can use STDOUT, now both " + defaultOutFormatter + " and " + formatterString + " use it. " + - "If you use more than one formatter you must specify output path with PLUGIN:PATH_OR_URL"); + "If you use more than one plugin you must specify output path with PLUGIN:PATH_OR_URL"); } } finally { defaultOut = null; diff --git a/core/src/main/java/cucumber/runtime/formatter/Plugins.java b/core/src/main/java/io/cucumber/core/plugin/Plugins.java similarity index 63% rename from core/src/main/java/cucumber/runtime/formatter/Plugins.java rename to core/src/main/java/io/cucumber/core/plugin/Plugins.java index b0c3bc6cca..cc8e046133 100644 --- a/core/src/main/java/cucumber/runtime/formatter/Plugins.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugins.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.Plugin; import cucumber.api.StepDefinitionReporter; @@ -9,13 +9,9 @@ import cucumber.api.event.EventPublisher; import cucumber.api.formatter.ColorAware; import cucumber.api.formatter.StrictAware; -import cucumber.runner.CanonicalOrderEventPublisher; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.Utils; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.runner.CanonicalOrderEventPublisher; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; @@ -27,14 +23,14 @@ public final class Plugins { private final PluginFactory pluginFactory; private final EventPublisher eventPublisher; private final EventPublisher orderedEventPublisher; - private final RuntimeOptions runtimeOptions; + private final Options options; - public Plugins(ClassLoader classLoader, PluginFactory pluginFactory, EventPublisher eventPublisher, RuntimeOptions runtimeOptions) { + public Plugins(ClassLoader classLoader, PluginFactory pluginFactory, EventPublisher eventPublisher, Options options) { this.classLoader = classLoader; this.pluginFactory = pluginFactory; this.eventPublisher = eventPublisher; this.orderedEventPublisher = createCanonicalOrderEventPublisher(); - this.runtimeOptions = runtimeOptions; + this.options = options; this.plugins = createPlugins(); } @@ -52,15 +48,15 @@ public void receive(Event event) { private List createPlugins() { List plugins = new ArrayList(); if (!pluginNamesInstantiated) { - for (String pluginName : runtimeOptions.getPluginFormatterNames()) { + for (String pluginName : options.getPluginFormatterNames()) { Plugin plugin = pluginFactory.create(pluginName); addPlugin(plugins, plugin); } - for (String pluginName : runtimeOptions.getPluginStepDefinitionReporterNames()) { + for (String pluginName : options.getPluginStepDefinitionReporterNames()) { Plugin plugin = pluginFactory.create(pluginName); addPlugin(plugins, plugin); } - for (String pluginName : runtimeOptions.getPluginSummaryPrinterNames()) { + for (String pluginName : options.getPluginSummaryPrinterNames()) { Plugin plugin = pluginFactory.create(pluginName); addPlugin(plugins, plugin); } @@ -74,7 +70,17 @@ public List getPlugins() { } public StepDefinitionReporter stepDefinitionReporter() { - return pluginProxy(StepDefinitionReporter.class); + return new StepDefinitionReporter() { + @Override + public void stepDefinition(StepDefinition stepDefinition) { + for (Plugin plugin : getPlugins()) { + if (plugin instanceof StepDefinitionReporter) { + StepDefinitionReporter stepDefinitionReporter = (StepDefinitionReporter) plugin; + stepDefinitionReporter.stepDefinition(stepDefinition); + } + } + } + }; } public void addPlugin(Plugin plugin) { @@ -91,14 +97,14 @@ private void addPlugin(List plugins, Plugin plugin) { private void setMonochromeOnColorAwarePlugins(Plugin plugin) { if (plugin instanceof ColorAware) { ColorAware colorAware = (ColorAware) plugin; - colorAware.setMonochrome(runtimeOptions.isMonochrome()); + colorAware.setMonochrome(options.isMonochrome()); } } private void setStrictOnStrictAwarePlugins(Plugin plugin) { if (plugin instanceof StrictAware) { StrictAware strictAware = (StrictAware) plugin; - strictAware.setStrict(runtimeOptions.isStrict()); + strictAware.setStrict(options.isStrict()); } } @@ -112,34 +118,5 @@ private void setEventBusOnEventListenerPlugins(Plugin plugin) { } } - /** - * Creates a dynamic proxy that multiplexes method invocations to all plugins of the same type. - * - * @param type proxy type - * @param generic proxy type - * @return a proxy - */ - private T pluginProxy(final Class type) { - Object proxy = Proxy.newProxyInstance(classLoader, new Class[]{type}, new InvocationHandler() { - @Override - public Object invoke(Object target, Method method, Object[] args) throws Throwable { - for (Object plugin : getPlugins()) { - if (type.isInstance(plugin)) { - try { - Utils.invoke(plugin, method, 0, args); - } catch (Throwable t) { - if (!method.getName().equals("startOfScenarioLifeCycle") && !method.getName().equals("endOfScenarioLifeCycle")) { - // IntelliJ has its own formatter which doesn't yet implement these methods. - throw t; - } - } - } - } - return null; - } - }); - return type.cast(proxy); - } - } diff --git a/core/src/main/java/cucumber/runtime/formatter/PrettyFormatter.java b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java similarity index 99% rename from core/src/main/java/cucumber/runtime/formatter/PrettyFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java index 331dbad374..c08db46750 100644 --- a/core/src/main/java/cucumber/runtime/formatter/PrettyFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.Argument; import cucumber.api.PickleStepTestStep; @@ -16,8 +16,8 @@ import cucumber.api.event.WriteEvent; import cucumber.api.formatter.ColorAware; import cucumber.api.formatter.NiceAppendable; -import cucumber.util.FixJava; -import cucumber.util.Mapper; +import io.cucumber.core.util.FixJava; +import io.cucumber.core.util.Mapper; import gherkin.ast.Background; import gherkin.ast.Examples; import gherkin.ast.Feature; diff --git a/core/src/main/java/cucumber/runtime/formatter/ProgressFormatter.java b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java similarity index 98% rename from core/src/main/java/cucumber/runtime/formatter/ProgressFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java index 99953501bb..f5665977be 100644 --- a/core/src/main/java/cucumber/runtime/formatter/ProgressFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.PickleStepTestStep; import cucumber.api.Result; diff --git a/core/src/main/java/cucumber/runtime/formatter/RerunFormatter.java b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java similarity index 98% rename from core/src/main/java/cucumber/runtime/formatter/RerunFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java index 415dfe9eee..dedcc3e770 100644 --- a/core/src/main/java/cucumber/runtime/formatter/RerunFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.TestCase; import cucumber.api.event.EventHandler; diff --git a/core/src/main/java/cucumber/runtime/formatter/Stats.java b/core/src/main/java/io/cucumber/core/plugin/Stats.java similarity index 97% rename from core/src/main/java/cucumber/runtime/formatter/Stats.java rename to core/src/main/java/io/cucumber/core/plugin/Stats.java index eb5d83fb7e..ddd520a4db 100755 --- a/core/src/main/java/cucumber/runtime/formatter/Stats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Stats.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.Result; import cucumber.api.PickleStepTestStep; @@ -11,10 +11,6 @@ import cucumber.api.event.TestStepFinished; import cucumber.api.formatter.ColorAware; import cucumber.api.formatter.StrictAware; -import cucumber.runtime.formatter.AnsiFormats; -import cucumber.runtime.formatter.Format; -import cucumber.runtime.formatter.Formats; -import cucumber.runtime.formatter.MonochromeFormats; import java.io.PrintStream; import java.text.DecimalFormat; diff --git a/core/src/main/java/cucumber/runtime/formatter/TestNGFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java similarity index 98% rename from core/src/main/java/cucumber/runtime/formatter/TestNGFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java index dacb5f0b57..bb36275297 100644 --- a/core/src/main/java/cucumber/runtime/formatter/TestNGFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.PickleStepTestStep; import cucumber.api.Result; @@ -12,9 +12,9 @@ import cucumber.api.event.TestSourceRead; import cucumber.api.event.TestStepFinished; import cucumber.api.formatter.StrictAware; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.URLOutputStream; -import cucumber.runtime.io.UTF8OutputStreamWriter; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.URLOutputStream; +import io.cucumber.core.io.UTF8OutputStreamWriter; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; diff --git a/core/src/main/java/cucumber/runtime/formatter/TestSourcesModel.java b/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java similarity index 99% rename from core/src/main/java/cucumber/runtime/formatter/TestSourcesModel.java rename to core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java index e4598e54ef..385a1d5624 100644 --- a/core/src/main/java/cucumber/runtime/formatter/TestSourcesModel.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.event.TestSourceRead; import gherkin.AstBuilder; diff --git a/core/src/main/java/cucumber/runtime/formatter/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java similarity index 91% rename from core/src/main/java/cucumber/runtime/formatter/TimelineFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index bf738ad51f..5d3a75d3a8 100644 --- a/core/src/main/java/cucumber/runtime/formatter/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.TestCase; import cucumber.api.event.ConcurrentEventListener; @@ -10,8 +10,8 @@ import cucumber.api.event.TestRunFinished; import cucumber.api.event.TestSourceRead; import cucumber.api.formatter.NiceAppendable; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.URLOutputStream; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.URLOutputStream; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; import gherkin.deps.com.google.gson.annotations.SerializedName; @@ -36,17 +36,17 @@ public class TimelineFormatter implements ConcurrentEventListener { //TODO: if accepted then should move resources out into own project as per HTML report private static final String[] TEXT_ASSETS = new String[]{ - "/io/cucumber/formatter/timeline/index.html", - "/io/cucumber/formatter/timeline/formatter.js", - "/io/cucumber/formatter/timeline/report.css", - "/io/cucumber/formatter/timeline/jquery-3.3.1.min.js", - "/io/cucumber/formatter/timeline/vis.min.css", - "/io/cucumber/formatter/timeline/vis.min.js", - "/io/cucumber/formatter/timeline/vis.override.css", - "/io/cucumber/formatter/timeline/chosen.jquery.min.js", - "/io/cucumber/formatter/timeline/chosen.min.css", - "/io/cucumber/formatter/timeline/chosen.override.css", - "/io/cucumber/formatter/timeline/chosen-sprite.png" + "/io/cucumber/core/plugin/timeline/index.html", + "/io/cucumber/core/plugin/timeline/formatter.js", + "/io/cucumber/core/plugin/timeline/report.css", + "/io/cucumber/core/plugin/timeline/jquery-3.3.1.min.js", + "/io/cucumber/core/plugin/timeline/vis.min.css", + "/io/cucumber/core/plugin/timeline/vis.min.js", + "/io/cucumber/core/plugin/timeline/vis.override.css", + "/io/cucumber/core/plugin/timeline/chosen.jquery.min.js", + "/io/cucumber/core/plugin/timeline/chosen.min.css", + "/io/cucumber/core/plugin/timeline/chosen.override.css", + "/io/cucumber/core/plugin/timeline/chosen-sprite.png" }; private final EventHandler testSourceReadHandler = new EventHandler() { diff --git a/core/src/main/java/cucumber/runtime/UndefinedStepsTracker.java b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java similarity index 97% rename from core/src/main/java/cucumber/runtime/UndefinedStepsTracker.java rename to core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java index 807fa5280a..4a1caf1cf7 100644 --- a/core/src/main/java/cucumber/runtime/UndefinedStepsTracker.java +++ b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.plugin; import cucumber.api.event.EventHandler; import cucumber.api.event.EventListener; @@ -23,7 +23,7 @@ import java.util.List; import java.util.Map; -public class UndefinedStepsTracker implements EventListener { +class UndefinedStepsTracker implements EventListener { private final List snippets = new ArrayList(); private final IGherkinDialectProvider dialectProvider = new GherkinDialectProvider(); private final Map pathToSourceMap = new HashMap(); @@ -49,11 +49,11 @@ public void setEventPublisher(EventPublisher publisher) { publisher.registerHandlerFor(SnippetsSuggestedEvent.class, snippetsSuggestedHandler); } - public boolean hasUndefinedSteps() { + boolean hasUndefinedSteps() { return hasUndefinedSteps; } - public List getSnippets() { + List getSnippets() { return snippets; } diff --git a/core/src/main/java/cucumber/runtime/formatter/UsageFormatter.java b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java similarity index 98% rename from core/src/main/java/cucumber/runtime/formatter/UsageFormatter.java rename to core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java index 324dca0597..ff9c91c5b0 100644 --- a/core/src/main/java/cucumber/runtime/formatter/UsageFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.PickleStepTestStep; import cucumber.api.Plugin; @@ -164,7 +164,7 @@ private StepContainer findOrCreateStepContainer(String stepNameWithArgs, List clazz) { + boolean isNonStaticInnerClass = !Modifier.isStatic(clazz.getModifiers()) && clazz.getEnclosingClass() != null; + return Modifier.isPublic(clazz.getModifiers()) && !Modifier.isAbstract(clazz.getModifiers()) && !isNonStaticInnerClass; + } + public T instantiateExactlyOneSubclass(Class parentType, List packageNames, Class[] constructorParams, Object[] constructorArgs, T fallback) { Collection instances = instantiateSubclasses(parentType, packageNames, constructorParams, constructorArgs); if (instances.size() == 1) { @@ -31,7 +40,7 @@ public Collection instantiateSubclasses(Class parentType, Li Collection result = new HashSet(); for (String packageName : packageNames) { for (Class clazz : classFinder.getDescendants(parentType, packageName)) { - if (Utils.isInstantiable(clazz)) { + if (isInstantiable(clazz)) { result.add(newInstance(constructorParams, constructorArgs, clazz)); } } diff --git a/core/src/main/java/cucumber/runtime/TooManyInstancesException.java b/core/src/main/java/io/cucumber/core/reflection/TooManyInstancesException.java similarity index 80% rename from core/src/main/java/cucumber/runtime/TooManyInstancesException.java rename to core/src/main/java/io/cucumber/core/reflection/TooManyInstancesException.java index 1a07646558..6c1fd1de74 100644 --- a/core/src/main/java/cucumber/runtime/TooManyInstancesException.java +++ b/core/src/main/java/io/cucumber/core/reflection/TooManyInstancesException.java @@ -1,4 +1,6 @@ -package cucumber.runtime; +package io.cucumber.core.reflection; + +import io.cucumber.core.exception.CucumberException; import java.util.Collection; diff --git a/core/src/main/java/cucumber/runner/AbstractEventBus.java b/core/src/main/java/io/cucumber/core/runner/AbstractEventBus.java similarity index 90% rename from core/src/main/java/cucumber/runner/AbstractEventBus.java rename to core/src/main/java/io/cucumber/core/runner/AbstractEventBus.java index 391b2285e7..afbebaae1b 100644 --- a/core/src/main/java/cucumber/runner/AbstractEventBus.java +++ b/core/src/main/java/io/cucumber/core/runner/AbstractEventBus.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.event.Event; diff --git a/core/src/main/java/cucumber/runner/AbstractEventPublisher.java b/core/src/main/java/io/cucumber/core/runner/AbstractEventPublisher.java similarity index 98% rename from core/src/main/java/cucumber/runner/AbstractEventPublisher.java rename to core/src/main/java/io/cucumber/core/runner/AbstractEventPublisher.java index f3661b6ebb..007960f21a 100644 --- a/core/src/main/java/cucumber/runner/AbstractEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/runner/AbstractEventPublisher.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.event.Event; import cucumber.api.event.EventHandler; diff --git a/core/src/main/java/cucumber/runner/AmbiguousPickleStepDefinitionsMatch.java b/core/src/main/java/io/cucumber/core/runner/AmbiguousPickleStepDefinitionsMatch.java similarity index 90% rename from core/src/main/java/cucumber/runner/AmbiguousPickleStepDefinitionsMatch.java rename to core/src/main/java/io/cucumber/core/runner/AmbiguousPickleStepDefinitionsMatch.java index 4593e937e2..43a4336ddb 100644 --- a/core/src/main/java/cucumber/runner/AmbiguousPickleStepDefinitionsMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/AmbiguousPickleStepDefinitionsMatch.java @@ -1,8 +1,8 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Scenario; import gherkin.pickles.PickleStep; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import java.util.Collections; diff --git a/core/src/main/java/cucumber/runner/AmbiguousStepDefinitionsException.java b/core/src/main/java/io/cucumber/core/runner/AmbiguousStepDefinitionsException.java similarity index 92% rename from core/src/main/java/cucumber/runner/AmbiguousStepDefinitionsException.java rename to core/src/main/java/io/cucumber/core/runner/AmbiguousStepDefinitionsException.java index ad15ac486e..e136e787fd 100644 --- a/core/src/main/java/cucumber/runner/AmbiguousStepDefinitionsException.java +++ b/core/src/main/java/io/cucumber/core/runner/AmbiguousStepDefinitionsException.java @@ -1,6 +1,6 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import gherkin.pickles.PickleStep; import java.util.List; diff --git a/core/src/main/java/cucumber/runner/Glue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java similarity index 93% rename from core/src/main/java/cucumber/runner/Glue.java rename to core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 55e374b5de..b924ef37f5 100644 --- a/core/src/main/java/cucumber/runner/Glue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -1,9 +1,10 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.DuplicateStepDefinitionException; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinition; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.backend.DuplicateStepDefinitionException; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.Argument; import cucumber.api.StepDefinitionReporter; import gherkin.pickles.PickleStep; @@ -15,7 +16,7 @@ import java.util.Map; import java.util.TreeMap; -final class Glue implements cucumber.runtime.Glue { +final class CachingGlue implements Glue { final Map stepDefinitionsByPattern = new TreeMap<>(); final List beforeHooks = new ArrayList<>(); final List beforeStepHooks = new ArrayList<>(); @@ -115,8 +116,7 @@ void reportStepDefinitions(StepDefinitionReporter stepDefinitionReporter) { } } - @Override - public void removeScenarioScopedGlue() { + void removeScenarioScopedGlue() { removeScenarioScopedHooks(beforeHooks); removeScenarioScopedHooks(beforeStepHooks); removeScenarioScopedHooks(afterHooks); diff --git a/core/src/main/java/cucumber/runner/CanonicalOrderEventPublisher.java b/core/src/main/java/io/cucumber/core/runner/CanonicalOrderEventPublisher.java similarity index 94% rename from core/src/main/java/cucumber/runner/CanonicalOrderEventPublisher.java rename to core/src/main/java/io/cucumber/core/runner/CanonicalOrderEventPublisher.java index 712df8077c..1ae15d9b2c 100644 --- a/core/src/main/java/cucumber/runner/CanonicalOrderEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/runner/CanonicalOrderEventPublisher.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.event.Event; import cucumber.api.event.TestRunFinished; diff --git a/core/src/main/java/cucumber/runtime/DefinitionArgument.java b/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java similarity index 82% rename from core/src/main/java/cucumber/runtime/DefinitionArgument.java rename to core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java index b263a0f4a5..c2e449a124 100644 --- a/core/src/main/java/cucumber/runtime/DefinitionArgument.java +++ b/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java @@ -1,7 +1,7 @@ -package cucumber.runtime; +package io.cucumber.core.runner; import cucumber.api.Argument; -import io.cucumber.stepexpression.ExpressionArgument; +import io.cucumber.core.stepexpression.ExpressionArgument; import java.util.ArrayList; import java.util.List; @@ -14,9 +14,9 @@ private DefinitionArgument(ExpressionArgument expressionArgument) { group = expressionArgument.getGroup(); } - public static List createArguments(List match) { + public static List createArguments(List match) { List args = new ArrayList(); - for (io.cucumber.stepexpression.Argument argument : match) { + for (io.cucumber.core.stepexpression.Argument argument : match) { if (argument instanceof ExpressionArgument) { args.add(new DefinitionArgument((ExpressionArgument) argument)); } diff --git a/core/src/main/java/cucumber/runner/EventBus.java b/core/src/main/java/io/cucumber/core/runner/EventBus.java similarity index 87% rename from core/src/main/java/cucumber/runner/EventBus.java rename to core/src/main/java/io/cucumber/core/runner/EventBus.java index 859e8aae98..de322fec94 100644 --- a/core/src/main/java/cucumber/runner/EventBus.java +++ b/core/src/main/java/io/cucumber/core/runner/EventBus.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.event.Event; import cucumber.api.event.EventPublisher; diff --git a/core/src/main/java/cucumber/runner/FailedPickleStepInstantiationMatch.java b/core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java similarity index 89% rename from core/src/main/java/cucumber/runner/FailedPickleStepInstantiationMatch.java rename to core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java index 209f2db3f2..64e06e849a 100644 --- a/core/src/main/java/cucumber/runner/FailedPickleStepInstantiationMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java @@ -1,8 +1,8 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Scenario; import gherkin.pickles.PickleStep; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import java.util.Collections; diff --git a/core/src/main/java/cucumber/runner/HookComparator.java b/core/src/main/java/io/cucumber/core/runner/HookComparator.java similarity index 84% rename from core/src/main/java/cucumber/runner/HookComparator.java rename to core/src/main/java/io/cucumber/core/runner/HookComparator.java index 29e8227fc5..53bbd14153 100644 --- a/core/src/main/java/cucumber/runner/HookComparator.java +++ b/core/src/main/java/io/cucumber/core/runner/HookComparator.java @@ -1,6 +1,6 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.HookDefinition; +import io.cucumber.core.backend.HookDefinition; import java.util.Comparator; diff --git a/core/src/main/java/cucumber/runner/HookDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java similarity index 81% rename from core/src/main/java/cucumber/runner/HookDefinitionMatch.java rename to core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java index 8d88f4c2da..de6e5f674a 100644 --- a/core/src/main/java/cucumber/runner/HookDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java @@ -1,8 +1,8 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Scenario; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinitionMatch; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinitionMatch; final class HookDefinitionMatch implements StepDefinitionMatch { private final HookDefinition hookDefinition; diff --git a/core/src/main/java/cucumber/runner/HookTestStep.java b/core/src/main/java/io/cucumber/core/runner/HookTestStep.java similarity index 92% rename from core/src/main/java/cucumber/runner/HookTestStep.java rename to core/src/main/java/io/cucumber/core/runner/HookTestStep.java index b00fe3d9a2..0415b9b3bd 100644 --- a/core/src/main/java/cucumber/runner/HookTestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/HookTestStep.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.HookType; diff --git a/core/src/main/java/cucumber/runner/Match.java b/core/src/main/java/io/cucumber/core/runner/Match.java similarity index 88% rename from core/src/main/java/cucumber/runner/Match.java rename to core/src/main/java/io/cucumber/core/runner/Match.java index e21daba2bd..e398d02c7b 100644 --- a/core/src/main/java/cucumber/runner/Match.java +++ b/core/src/main/java/io/cucumber/core/runner/Match.java @@ -1,6 +1,6 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import java.util.Collections; import java.util.List; diff --git a/core/src/main/java/cucumber/runner/NoStepDefinition.java b/core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java similarity index 84% rename from core/src/main/java/cucumber/runner/NoStepDefinition.java rename to core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java index fb9611a579..aaa149812d 100644 --- a/core/src/main/java/cucumber/runner/NoStepDefinition.java +++ b/core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java @@ -1,7 +1,7 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.StepDefinition; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.Argument; import gherkin.pickles.PickleStep; import java.util.List; diff --git a/core/src/main/java/cucumber/runner/PickleStepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java similarity index 95% rename from core/src/main/java/cucumber/runner/PickleStepDefinitionMatch.java rename to core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java index 876d2445d1..99d8d7ceee 100644 --- a/core/src/main/java/cucumber/runner/PickleStepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java @@ -1,14 +1,14 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Scenario; -import cucumber.runtime.CucumberException; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.StepDefinitionMatch; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.backend.StepDefinitionMatch; +import io.cucumber.core.exception.CucumberException; import gherkin.pickles.PickleStep; import io.cucumber.cucumberexpressions.CucumberExpressionException; import io.cucumber.datatable.CucumberDataTableException; import io.cucumber.datatable.UndefinedDataTableTypeException; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/cucumber/runner/PickleStepTestStep.java b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java similarity index 97% rename from core/src/main/java/cucumber/runner/PickleStepTestStep.java rename to core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java index 9781c43aa1..1b9b031683 100644 --- a/core/src/main/java/cucumber/runner/PickleStepTestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java @@ -1,7 +1,6 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.TestCase; -import cucumber.runtime.DefinitionArgument; import gherkin.pickles.PickleStep; import java.util.Collections; diff --git a/core/src/main/java/cucumber/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java similarity index 93% rename from core/src/main/java/cucumber/runner/Runner.java rename to core/src/main/java/io/cucumber/core/runner/Runner.java index 02f9df87e4..04c34f7c76 100644 --- a/core/src/main/java/cucumber/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -1,11 +1,11 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.HookType; import cucumber.api.StepDefinitionReporter; import cucumber.api.event.SnippetsSuggestedEvent; -import cucumber.runtime.Backend; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.RuntimeOptions; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; @@ -15,12 +15,12 @@ import java.util.List; public final class Runner { - private final Glue glue = new Glue(); + private final CachingGlue glue = new CachingGlue(); private final EventBus bus; private final Collection backends; private final RuntimeOptions runtimeOptions; - public Runner(EventBus bus, Collection backends, RuntimeOptions runtimeOptions) { + Runner(EventBus bus, Collection backends, RuntimeOptions runtimeOptions) { this.bus = bus; this.runtimeOptions = runtimeOptions; this.backends = backends; @@ -39,6 +39,7 @@ public void runPickle(PickleEvent pickle) { TestCase testCase = createTestCaseForPickle(pickle); testCase.run(bus); disposeBackendWorlds(); + glue.removeScenarioScopedGlue(); } public void reportStepDefinitions(StepDefinitionReporter stepDefinitionReporter) { diff --git a/core/src/main/java/io/cucumber/core/runner/RunnerSupplier.java b/core/src/main/java/io/cucumber/core/runner/RunnerSupplier.java new file mode 100644 index 0000000000..b5138ce078 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runner/RunnerSupplier.java @@ -0,0 +1,5 @@ +package io.cucumber.core.runner; + +public interface RunnerSupplier { + Runner get(); +} diff --git a/core/src/main/java/cucumber/runner/Scenario.java b/core/src/main/java/io/cucumber/core/runner/Scenario.java similarity index 98% rename from core/src/main/java/cucumber/runner/Scenario.java rename to core/src/main/java/io/cucumber/core/runner/Scenario.java index 206120c8f8..82dc5502cd 100644 --- a/core/src/main/java/cucumber/runner/Scenario.java +++ b/core/src/main/java/io/cucumber/core/runner/Scenario.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Result; import cucumber.api.event.EmbedEvent; diff --git a/core/src/main/java/cucumber/runner/SingletonRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java similarity index 86% rename from core/src/main/java/cucumber/runner/SingletonRunnerSupplier.java rename to core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java index 9e7c72c523..861e2b2683 100644 --- a/core/src/main/java/cucumber/runner/SingletonRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java @@ -1,7 +1,7 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.BackendSupplier; -import cucumber.runtime.RuntimeOptions; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.options.RuntimeOptions; /** * Returns a single unique runner. diff --git a/core/src/main/java/cucumber/runner/TestCase.java b/core/src/main/java/io/cucumber/core/runner/TestCase.java similarity index 98% rename from core/src/main/java/cucumber/runner/TestCase.java rename to core/src/main/java/io/cucumber/core/runner/TestCase.java index 124146edc9..0902da35c6 100644 --- a/core/src/main/java/cucumber/runner/TestCase.java +++ b/core/src/main/java/io/cucumber/core/runner/TestCase.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Result; import cucumber.api.TestStep; diff --git a/core/src/main/java/cucumber/runner/TestStep.java b/core/src/main/java/io/cucumber/core/runner/TestStep.java similarity index 97% rename from core/src/main/java/cucumber/runner/TestStep.java rename to core/src/main/java/io/cucumber/core/runner/TestStep.java index 20c3aa9b5f..05c882d5d5 100644 --- a/core/src/main/java/cucumber/runner/TestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/TestStep.java @@ -1,11 +1,11 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Pending; import cucumber.api.Result; import cucumber.api.TestCase; import cucumber.api.event.TestStepFinished; import cucumber.api.event.TestStepStarted; -import cucumber.runtime.StepDefinitionMatch; +import io.cucumber.core.backend.StepDefinitionMatch; import java.util.Arrays; diff --git a/core/src/main/java/cucumber/runner/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runner/ThreadLocalRunnerSupplier.java similarity index 94% rename from core/src/main/java/cucumber/runner/ThreadLocalRunnerSupplier.java rename to core/src/main/java/io/cucumber/core/runner/ThreadLocalRunnerSupplier.java index 4caa8eb33d..ef6575ac50 100644 --- a/core/src/main/java/cucumber/runner/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runner/ThreadLocalRunnerSupplier.java @@ -1,11 +1,9 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.event.Event; import cucumber.api.event.EventHandler; -import cucumber.runner.AbstractEventBus; -import cucumber.runner.EventBus; -import cucumber.runtime.BackendSupplier; -import cucumber.runtime.RuntimeOptions; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.options.RuntimeOptions; /** * Creates a distinct runner for each calling thread. Each runner has its own bus, backend- and glue-suppliers. diff --git a/core/src/main/java/cucumber/runner/TimeService.java b/core/src/main/java/io/cucumber/core/runner/TimeService.java similarity index 85% rename from core/src/main/java/cucumber/runner/TimeService.java rename to core/src/main/java/io/cucumber/core/runner/TimeService.java index 8cc31ebbdd..bc81e8ef12 100644 --- a/core/src/main/java/cucumber/runner/TimeService.java +++ b/core/src/main/java/io/cucumber/core/runner/TimeService.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; public interface TimeService { long time(); diff --git a/core/src/main/java/cucumber/runner/TimeServiceEventBus.java b/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java similarity index 89% rename from core/src/main/java/cucumber/runner/TimeServiceEventBus.java rename to core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java index 676c56e0a7..64e57cf011 100644 --- a/core/src/main/java/cucumber/runner/TimeServiceEventBus.java +++ b/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; public final class TimeServiceEventBus extends AbstractEventBus { private final TimeService stopWatch; diff --git a/core/src/main/java/cucumber/runner/UndefinedPickleStepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java similarity index 87% rename from core/src/main/java/cucumber/runner/UndefinedPickleStepDefinitionMatch.java rename to core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java index 90f25406aa..6c97561c3f 100644 --- a/core/src/main/java/cucumber/runner/UndefinedPickleStepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java @@ -1,6 +1,6 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import cucumber.api.Scenario; import gherkin.pickles.PickleStep; diff --git a/core/src/main/java/cucumber/runner/UndefinedStepDefinitionException.java b/core/src/main/java/io/cucumber/core/runner/UndefinedStepDefinitionException.java similarity index 66% rename from core/src/main/java/cucumber/runner/UndefinedStepDefinitionException.java rename to core/src/main/java/io/cucumber/core/runner/UndefinedStepDefinitionException.java index 944e325fa5..832ea10dbe 100644 --- a/core/src/main/java/cucumber/runner/UndefinedStepDefinitionException.java +++ b/core/src/main/java/io/cucumber/core/runner/UndefinedStepDefinitionException.java @@ -1,6 +1,6 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; final class UndefinedStepDefinitionException extends CucumberException { diff --git a/core/src/main/java/cucumber/runner/UndefinedStepException.java b/core/src/main/java/io/cucumber/core/runner/UndefinedStepException.java similarity index 87% rename from core/src/main/java/cucumber/runner/UndefinedStepException.java rename to core/src/main/java/io/cucumber/core/runner/UndefinedStepException.java index 7bcd461aa8..b5cc80bf9c 100644 --- a/core/src/main/java/cucumber/runner/UndefinedStepException.java +++ b/core/src/main/java/io/cucumber/core/runner/UndefinedStepException.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import gherkin.pickles.PickleStep; diff --git a/core/src/main/java/cucumber/runtime/BackendModuleBackendSupplier.java b/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java similarity index 81% rename from core/src/main/java/cucumber/runtime/BackendModuleBackendSupplier.java rename to core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java index ecda5dafb8..e3738ec90c 100644 --- a/core/src/main/java/cucumber/runtime/BackendModuleBackendSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java @@ -1,9 +1,15 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; import cucumber.api.TypeRegistryConfigurer; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.Reflections; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.stepexpression.TypeRegistry; import java.util.Collection; import java.util.List; @@ -22,7 +28,7 @@ public final class BackendModuleBackendSupplier implements BackendSupplier { private final List packages; public BackendModuleBackendSupplier(ResourceLoader resourceLoader, ClassFinder classFinder, RuntimeOptions runtimeOptions) { - this(resourceLoader, classFinder, runtimeOptions, singletonList("cucumber.runtime")); + this(resourceLoader, classFinder, runtimeOptions, singletonList("io.cucumber")); } BackendModuleBackendSupplier(ResourceLoader resourceLoader, ClassFinder classFinder, RuntimeOptions runtimeOptions, List packages) { diff --git a/core/src/main/java/cucumber/runtime/DefaultTypeRegistryConfiguration.java b/core/src/main/java/io/cucumber/core/runtime/DefaultTypeRegistryConfiguration.java similarity index 72% rename from core/src/main/java/cucumber/runtime/DefaultTypeRegistryConfiguration.java rename to core/src/main/java/io/cucumber/core/runtime/DefaultTypeRegistryConfiguration.java index 731c1c818d..cf253c585f 100644 --- a/core/src/main/java/cucumber/runtime/DefaultTypeRegistryConfiguration.java +++ b/core/src/main/java/io/cucumber/core/runtime/DefaultTypeRegistryConfiguration.java @@ -1,11 +1,11 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; import cucumber.api.TypeRegistryConfigurer; import cucumber.api.TypeRegistry; import java.util.Locale; -public class DefaultTypeRegistryConfiguration implements TypeRegistryConfigurer { +class DefaultTypeRegistryConfiguration implements TypeRegistryConfigurer { @Override public Locale locale() { diff --git a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java new file mode 100644 index 0000000000..4994d37c19 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java @@ -0,0 +1,33 @@ +package io.cucumber.core.runtime; + +import cucumber.api.event.TestSourceRead; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runner.EventBus; + +import java.util.List; + +/** + * Supplies a list of features found on the the feature path provided to RuntimeOptions. + */ +public class FeaturePathFeatureSupplier implements FeatureSupplier { + private final FeatureLoader featureLoader; + private final RuntimeOptions runtimeOptions; + private final EventBus bus; + + public FeaturePathFeatureSupplier(FeatureLoader featureLoader, RuntimeOptions runtimeOptions, EventBus bus) { + this.featureLoader = featureLoader; + this.runtimeOptions = runtimeOptions; + this.bus = bus; + } + + @Override + public List get() { + List features = featureLoader.load(runtimeOptions.getFeaturePaths(), System.out); + for (CucumberFeature feature : features) { + bus.send(new TestSourceRead(bus.getTime(), feature.getUri(), feature.getGherkinSource())); + } + return features; + } +} diff --git a/core/src/main/java/cucumber/runtime/FeatureSupplier.java b/core/src/main/java/io/cucumber/core/runtime/FeatureSupplier.java similarity index 54% rename from core/src/main/java/cucumber/runtime/FeatureSupplier.java rename to core/src/main/java/io/cucumber/core/runtime/FeatureSupplier.java index e758495854..8d4ec971d4 100644 --- a/core/src/main/java/cucumber/runtime/FeatureSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/FeatureSupplier.java @@ -1,6 +1,6 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.model.CucumberFeature; import java.util.List; diff --git a/core/src/main/java/cucumber/runtime/Utils.java b/core/src/main/java/io/cucumber/core/runtime/Invoker.java similarity index 54% rename from core/src/main/java/cucumber/runtime/Utils.java rename to core/src/main/java/io/cucumber/core/runtime/Invoker.java index 33f998204a..2685f1cdd0 100644 --- a/core/src/main/java/cucumber/runtime/Utils.java +++ b/core/src/main/java/io/cucumber/core/runtime/Invoker.java @@ -1,23 +1,71 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; + +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.MethodFormat; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.net.MalformedURLException; -import java.net.URL; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicBoolean; -public class Utils { - private Utils() { +public class Invoker { + private Invoker() { } - public static boolean isInstantiable(Class clazz) { - boolean isNonStaticInnerClass = !Modifier.isStatic(clazz.getModifiers()) && clazz.getEnclosingClass() != null; - return Modifier.isPublic(clazz.getModifiers()) && !Modifier.isAbstract(clazz.getModifiers()) && !isNonStaticInnerClass; + public static T timeout(Callback callback, long timeoutMillis) throws Throwable { + if (timeoutMillis == 0) { + return callback.call(); + } + + /* We need to ensure a happens before relation exists between these events; + * a. the timer setting the interrupt flag on the execution thread. + * b. terminating and cleaning up the timer + * To do this we synchronize on monitor. The atomic boolean is merely a convenient container. + */ + final Thread executionThread = Thread.currentThread(); + final Object monitor = new Object(); + final AtomicBoolean done = new AtomicBoolean(); + + ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); + ScheduledFuture timer = executorService.schedule(new Runnable() { + @Override + public void run() { + synchronized (monitor) { + if (!done.get()) { + executionThread.interrupt(); + } + } + } + }, timeoutMillis, TimeUnit.MILLISECONDS); + + try { + T result = callback.call(); + // The callback may have been busy waiting. + if (Thread.interrupted()) { + throw new TimeoutException("Timed out after " + timeoutMillis + "ms."); + } + return result; + } catch (InterruptedException timeout) { + throw new TimeoutException("Timed out after " + timeoutMillis + "ms."); + } finally { + synchronized (monitor) { + done.set(true); + timer.cancel(true); + executorService.shutdownNow(); + // Clear the interrupted flag. It may have been set by the timer just before we returned the result. + Thread.interrupted(); + } + } } public static Object invoke(final Object target, final Method method, long timeoutMillis, final Object... args) throws Throwable { final Method targetMethod = targetMethod(target, method); - return Timeout.timeout(new Timeout.Callback() { + return timeout(new Callback() { @Override public Object call() throws Throwable { boolean accessible = targetMethod.isAccessible(); @@ -67,38 +115,7 @@ private static Method targetMethod(final Object target, final Method method) thr } } - public static URL toURL(String pathOrUrl) { - try { - if (!pathOrUrl.endsWith("/")) { - pathOrUrl = pathOrUrl + "/"; - } - if (pathOrUrl.matches("^(file|http|https):.*")) { - return new URL(pathOrUrl); - } else { - return new URL("file:" + pathOrUrl); - } - } catch (MalformedURLException e) { - throw new CucumberException("Bad URL:" + pathOrUrl, e); - } - } - - public static String htmlEscape(String s) { - // https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet - return s - .replace("&", "&") - .replace("<", "<") - .replace(">", ">") - .replace("\"", """) - .replace("'", "'") - .replace("/", "/"); + public interface Callback { + T call() throws Throwable; } - - public static String getUniqueTestNameForScenarioExample(String testCaseName, int exampleNumber) { - return testCaseName + (includesBlank(testCaseName) ? " " : "_") + exampleNumber; - } - - private static boolean includesBlank(String testCaseName) { - return testCaseName.indexOf(' ') != -1; - } - -} \ No newline at end of file +} diff --git a/core/src/main/java/cucumber/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java similarity index 75% rename from core/src/main/java/cucumber/runtime/Runtime.java rename to core/src/main/java/io/cucumber/core/runtime/Runtime.java index 83271c756e..258ff71acf 100644 --- a/core/src/main/java/cucumber/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -1,26 +1,37 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; import cucumber.api.Plugin; +import cucumber.api.Result; import cucumber.api.StepDefinitionReporter; +import cucumber.api.event.EventHandler; +import cucumber.api.event.EventListener; +import cucumber.api.event.EventPublisher; +import cucumber.api.event.TestCaseFinished; import cucumber.api.event.TestRunFinished; import cucumber.api.event.TestRunStarted; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.RunnerSupplier; -import cucumber.runner.SingletonRunnerSupplier; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.filter.Filters; -import cucumber.runtime.filter.RerunFilters; -import cucumber.runtime.formatter.PluginFactory; -import cucumber.runtime.formatter.Plugins; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.model.FeatureLoader; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.runner.EventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.runner.RunnerSupplier; +import io.cucumber.core.runner.SingletonRunnerSupplier; +import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.core.filter.Filters; +import io.cucumber.core.filter.RerunFilters; +import io.cucumber.core.plugin.PluginFactory; +import io.cucumber.core.plugin.Plugins; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.model.FeatureCompiler; +import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -29,6 +40,10 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import static cucumber.api.Result.SEVERITY; +import static java.util.Collections.max; +import static java.util.Collections.min; + /** * This is the main entry point for running Cucumber features from the CLI. */ @@ -65,11 +80,8 @@ public Runtime(final Plugins plugins, } public void run() { - final List features = featureSupplier.get(); bus.send(new TestRunStarted(bus.getTime())); - for (CucumberFeature feature : features) { - feature.sendTestSourceRead(bus); - } + final List features = featureSupplier.get(); final StepDefinitionReporter stepDefinitionReporter = plugins.stepDefinitionReporter(); runnerSupplier.get().reportStepDefinitions(stepDefinitionReporter); @@ -205,7 +217,7 @@ public Runtime build() { final FeatureSupplier featureSupplier = this.featureSupplier != null ? this.featureSupplier - : new FeaturePathFeatureSupplier(featureLoader, this.runtimeOptions); + : new FeaturePathFeatureSupplier(featureLoader, this.runtimeOptions, this.eventBus); final RerunFilters rerunFilters = new RerunFilters(this.runtimeOptions, featureLoader); final Filters filters = new Filters(this.runtimeOptions, rerunFilters); @@ -245,4 +257,38 @@ public boolean awaitTermination(long timeout, TimeUnit unit) { return true; } } + + static final class ExitStatus implements EventListener { + private static final byte DEFAULT = 0x0; + private static final byte ERRORS = 0x1; + + private final List results = new ArrayList<>(); + private final RuntimeOptions runtimeOptions; + + private final EventHandler testCaseFinishedHandler = new EventHandler() { + @Override + public void receive(TestCaseFinished event) { + results.add(event.result); + } + }; + + ExitStatus(RuntimeOptions runtimeOptions) { + this.runtimeOptions = runtimeOptions; + } + + @Override + public void setEventPublisher(EventPublisher publisher) { + publisher.registerHandlerFor(TestCaseFinished.class, testCaseFinishedHandler); + } + + byte exitStatus() { + if (results.isEmpty()) { return DEFAULT; } + + if (runtimeOptions.isWip()) { + return min(results, SEVERITY).is(Result.Type.PASSED) ? ERRORS : DEFAULT; + } + + return max(results, SEVERITY).isOk(runtimeOptions.isStrict()) ? DEFAULT : ERRORS; + } + } } diff --git a/core/src/main/java/cucumber/runtime/snippets/ArgumentPattern.java b/core/src/main/java/io/cucumber/core/snippets/ArgumentPattern.java similarity index 96% rename from core/src/main/java/cucumber/runtime/snippets/ArgumentPattern.java rename to core/src/main/java/io/cucumber/core/snippets/ArgumentPattern.java index 83b378b5cf..360c66c757 100644 --- a/core/src/main/java/cucumber/runtime/snippets/ArgumentPattern.java +++ b/core/src/main/java/io/cucumber/core/snippets/ArgumentPattern.java @@ -1,4 +1,4 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/core/src/main/java/cucumber/runtime/snippets/CamelCaseConcatenator.java b/core/src/main/java/io/cucumber/core/snippets/CamelCaseConcatenator.java similarity index 94% rename from core/src/main/java/cucumber/runtime/snippets/CamelCaseConcatenator.java rename to core/src/main/java/io/cucumber/core/snippets/CamelCaseConcatenator.java index e05e031e4c..fb2a37da6b 100644 --- a/core/src/main/java/cucumber/runtime/snippets/CamelCaseConcatenator.java +++ b/core/src/main/java/io/cucumber/core/snippets/CamelCaseConcatenator.java @@ -1,4 +1,4 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; public class CamelCaseConcatenator implements Concatenator { @Override diff --git a/core/src/main/java/cucumber/runtime/snippets/Concatenator.java b/core/src/main/java/io/cucumber/core/snippets/Concatenator.java similarity index 68% rename from core/src/main/java/cucumber/runtime/snippets/Concatenator.java rename to core/src/main/java/io/cucumber/core/snippets/Concatenator.java index d086e406b7..3c2695aadd 100644 --- a/core/src/main/java/cucumber/runtime/snippets/Concatenator.java +++ b/core/src/main/java/io/cucumber/core/snippets/Concatenator.java @@ -1,4 +1,4 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; public interface Concatenator { String concatenate(String[] words); diff --git a/core/src/main/java/cucumber/runtime/snippets/FunctionNameGenerator.java b/core/src/main/java/io/cucumber/core/snippets/FunctionNameGenerator.java similarity index 97% rename from core/src/main/java/cucumber/runtime/snippets/FunctionNameGenerator.java rename to core/src/main/java/io/cucumber/core/snippets/FunctionNameGenerator.java index 7a4e77f7a5..5b46c96c01 100644 --- a/core/src/main/java/cucumber/runtime/snippets/FunctionNameGenerator.java +++ b/core/src/main/java/io/cucumber/core/snippets/FunctionNameGenerator.java @@ -1,4 +1,4 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; public class FunctionNameGenerator { private static final Character SUBST = ' '; diff --git a/core/src/main/java/cucumber/runtime/snippets/Snippet.java b/core/src/main/java/io/cucumber/core/snippets/Snippet.java similarity index 97% rename from core/src/main/java/cucumber/runtime/snippets/Snippet.java rename to core/src/main/java/io/cucumber/core/snippets/Snippet.java index 91805708d5..be8be60daf 100644 --- a/core/src/main/java/cucumber/runtime/snippets/Snippet.java +++ b/core/src/main/java/io/cucumber/core/snippets/Snippet.java @@ -1,4 +1,4 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; import java.lang.reflect.Type; import java.util.Map; diff --git a/core/src/main/java/cucumber/runtime/snippets/SnippetGenerator.java b/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java similarity index 99% rename from core/src/main/java/cucumber/runtime/snippets/SnippetGenerator.java rename to core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java index ecf285da0b..2dfc74d7df 100644 --- a/core/src/main/java/cucumber/runtime/snippets/SnippetGenerator.java +++ b/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java @@ -1,4 +1,4 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; import io.cucumber.cucumberexpressions.GeneratedExpression; import io.cucumber.cucumberexpressions.ParameterType; diff --git a/core/src/main/java/cucumber/runtime/snippets/UnderscoreConcatenator.java b/core/src/main/java/io/cucumber/core/snippets/UnderscoreConcatenator.java similarity index 93% rename from core/src/main/java/cucumber/runtime/snippets/UnderscoreConcatenator.java rename to core/src/main/java/io/cucumber/core/snippets/UnderscoreConcatenator.java index 30dfc8ad4e..9a33b1f016 100644 --- a/core/src/main/java/cucumber/runtime/snippets/UnderscoreConcatenator.java +++ b/core/src/main/java/io/cucumber/core/snippets/UnderscoreConcatenator.java @@ -1,4 +1,4 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; public class UnderscoreConcatenator implements Concatenator { @Override diff --git a/core/src/main/java/io/cucumber/stepexpression/Argument.java b/core/src/main/java/io/cucumber/core/stepexpression/Argument.java similarity index 57% rename from core/src/main/java/io/cucumber/stepexpression/Argument.java rename to core/src/main/java/io/cucumber/core/stepexpression/Argument.java index 963c2b3498..745df56f01 100644 --- a/core/src/main/java/io/cucumber/stepexpression/Argument.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/Argument.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; public interface Argument { diff --git a/core/src/main/java/io/cucumber/stepexpression/ArgumentMatcher.java b/core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java similarity index 78% rename from core/src/main/java/io/cucumber/stepexpression/ArgumentMatcher.java rename to core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java index a56d846f29..b72e40afe2 100644 --- a/core/src/main/java/io/cucumber/stepexpression/ArgumentMatcher.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import gherkin.pickles.PickleStep; diff --git a/core/src/main/java/io/cucumber/stepexpression/DataTableArgument.java b/core/src/main/java/io/cucumber/core/stepexpression/DataTableArgument.java similarity index 94% rename from core/src/main/java/io/cucumber/stepexpression/DataTableArgument.java rename to core/src/main/java/io/cucumber/core/stepexpression/DataTableArgument.java index 94304643ad..f4a56a6fd8 100644 --- a/core/src/main/java/io/cucumber/stepexpression/DataTableArgument.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/DataTableArgument.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.datatable.DataTable; diff --git a/core/src/main/java/io/cucumber/stepexpression/DocStringArgument.java b/core/src/main/java/io/cucumber/core/stepexpression/DocStringArgument.java similarity index 92% rename from core/src/main/java/io/cucumber/stepexpression/DocStringArgument.java rename to core/src/main/java/io/cucumber/core/stepexpression/DocStringArgument.java index c803dd09fa..12c55d29d1 100644 --- a/core/src/main/java/io/cucumber/stepexpression/DocStringArgument.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/DocStringArgument.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; public final class DocStringArgument implements Argument { diff --git a/core/src/main/java/io/cucumber/stepexpression/DocStringTransformer.java b/core/src/main/java/io/cucumber/core/stepexpression/DocStringTransformer.java similarity index 64% rename from core/src/main/java/io/cucumber/stepexpression/DocStringTransformer.java rename to core/src/main/java/io/cucumber/core/stepexpression/DocStringTransformer.java index 75488a1c46..08f74d0821 100644 --- a/core/src/main/java/io/cucumber/stepexpression/DocStringTransformer.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/DocStringTransformer.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; interface DocStringTransformer { diff --git a/core/src/main/java/io/cucumber/stepexpression/ExpressionArgument.java b/core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgument.java similarity index 93% rename from core/src/main/java/io/cucumber/stepexpression/ExpressionArgument.java rename to core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgument.java index c3d6eadd6c..5ec5e8c355 100644 --- a/core/src/main/java/io/cucumber/stepexpression/ExpressionArgument.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgument.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.cucumberexpressions.Group; diff --git a/core/src/main/java/io/cucumber/stepexpression/ExpressionArgumentMatcher.java b/core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgumentMatcher.java similarity index 96% rename from core/src/main/java/io/cucumber/stepexpression/ExpressionArgumentMatcher.java rename to core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgumentMatcher.java index d3525ce969..b68f060d7d 100644 --- a/core/src/main/java/io/cucumber/stepexpression/ExpressionArgumentMatcher.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgumentMatcher.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleString; diff --git a/core/src/main/java/io/cucumber/stepexpression/PickleTableConverter.java b/core/src/main/java/io/cucumber/core/stepexpression/PickleTableConverter.java similarity index 93% rename from core/src/main/java/io/cucumber/stepexpression/PickleTableConverter.java rename to core/src/main/java/io/cucumber/core/stepexpression/PickleTableConverter.java index 62ea55956b..ce5d380921 100644 --- a/core/src/main/java/io/cucumber/stepexpression/PickleTableConverter.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/PickleTableConverter.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleRow; diff --git a/core/src/main/java/io/cucumber/stepexpression/RawTableTransformer.java b/core/src/main/java/io/cucumber/core/stepexpression/RawTableTransformer.java similarity index 71% rename from core/src/main/java/io/cucumber/stepexpression/RawTableTransformer.java rename to core/src/main/java/io/cucumber/core/stepexpression/RawTableTransformer.java index 9071ad0938..594e9c3896 100644 --- a/core/src/main/java/io/cucumber/stepexpression/RawTableTransformer.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/RawTableTransformer.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import java.util.List; diff --git a/core/src/main/java/io/cucumber/stepexpression/StepExpression.java b/core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java similarity index 97% rename from core/src/main/java/io/cucumber/stepexpression/StepExpression.java rename to core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java index 0733aa130b..99f7aced66 100644 --- a/core/src/main/java/io/cucumber/stepexpression/StepExpression.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.cucumberexpressions.Expression; diff --git a/core/src/main/java/io/cucumber/stepexpression/StepExpressionFactory.java b/core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java similarity index 97% rename from core/src/main/java/io/cucumber/stepexpression/StepExpressionFactory.java rename to core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java index cd20a3d120..b90121a450 100644 --- a/core/src/main/java/io/cucumber/stepexpression/StepExpressionFactory.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java @@ -1,6 +1,6 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import io.cucumber.cucumberexpressions.UndefinedParameterTypeException; import io.cucumber.datatable.DataTableTypeRegistryTableConverter; import io.cucumber.datatable.DataTable; diff --git a/core/src/main/java/io/cucumber/stepexpression/TypeRegistry.java b/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java similarity index 97% rename from core/src/main/java/io/cucumber/stepexpression/TypeRegistry.java rename to core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java index 387a14e3d1..625421c26b 100644 --- a/core/src/main/java/io/cucumber/stepexpression/TypeRegistry.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.cucumberexpressions.ParameterTypeRegistry; diff --git a/core/src/main/java/io/cucumber/stepexpression/TypeResolver.java b/core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java similarity index 87% rename from core/src/main/java/io/cucumber/stepexpression/TypeResolver.java rename to core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java index 088c70ee0d..8f83d5be57 100644 --- a/core/src/main/java/io/cucumber/stepexpression/TypeResolver.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import java.lang.reflect.Type; diff --git a/core/src/main/java/cucumber/util/FixJava.java b/core/src/main/java/io/cucumber/core/util/FixJava.java similarity index 52% rename from core/src/main/java/cucumber/util/FixJava.java rename to core/src/main/java/io/cucumber/core/util/FixJava.java index 6d6c831449..377353809e 100644 --- a/core/src/main/java/cucumber/util/FixJava.java +++ b/core/src/main/java/io/cucumber/core/util/FixJava.java @@ -1,17 +1,14 @@ -package cucumber.util; +package io.cucumber.core.util; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.io.Reader; -import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; public class FixJava { public static String join(List strings, String separator) { + //TODO: Java8 replace with StringJoiner. StringBuilder sb = new StringBuilder(); int i = 0; for (String s : strings) { @@ -23,6 +20,7 @@ public static String join(List strings, String separator) { } public static List map(List objects, Mapper mapper) { + //TODO: Java8 replace with lambda List result = new ArrayList(objects.size()); for (T o : objects) { result.add(mapper.map(o)); @@ -30,15 +28,6 @@ public static List map(List objects, Mapper mapper) { return result; } - public static String readResource(String resourcePath) throws RuntimeException { - try { - Reader reader = new InputStreamReader(FixJava.class.getResourceAsStream(resourcePath), "UTF-8"); - return readReader(reader); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - } - public static String readReader(Reader in) throws RuntimeException { try { StringBuilder buffer = new StringBuilder(); @@ -54,19 +43,4 @@ public static String readReader(Reader in) throws RuntimeException { } } - public static byte[] readStream(InputStream in) throws RuntimeException { - try { - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - final byte[] data = new byte[0x10000]; - int read; - - while ((read = in.read(data, 0, data.length)) != -1) { - buffer.write(data, 0, read); - } - buffer.flush(); - return buffer.toByteArray(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } } diff --git a/core/src/main/java/cucumber/util/Mapper.java b/core/src/main/java/io/cucumber/core/util/Mapper.java similarity index 62% rename from core/src/main/java/cucumber/util/Mapper.java rename to core/src/main/java/io/cucumber/core/util/Mapper.java index 3e648e3994..06b321ffb7 100644 --- a/core/src/main/java/cucumber/util/Mapper.java +++ b/core/src/main/java/io/cucumber/core/util/Mapper.java @@ -1,4 +1,4 @@ -package cucumber.util; +package io.cucumber.core.util; public interface Mapper { R map(T o); diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/chosen-sprite.png b/core/src/main/resources/io/cucumber/core/plugin/timeline/chosen-sprite.png similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/chosen-sprite.png rename to core/src/main/resources/io/cucumber/core/plugin/timeline/chosen-sprite.png diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/chosen.jquery.min.js b/core/src/main/resources/io/cucumber/core/plugin/timeline/chosen.jquery.min.js similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/chosen.jquery.min.js rename to core/src/main/resources/io/cucumber/core/plugin/timeline/chosen.jquery.min.js diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/chosen.min.css b/core/src/main/resources/io/cucumber/core/plugin/timeline/chosen.min.css similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/chosen.min.css rename to core/src/main/resources/io/cucumber/core/plugin/timeline/chosen.min.css diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/chosen.override.css b/core/src/main/resources/io/cucumber/core/plugin/timeline/chosen.override.css similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/chosen.override.css rename to core/src/main/resources/io/cucumber/core/plugin/timeline/chosen.override.css diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/formatter.js b/core/src/main/resources/io/cucumber/core/plugin/timeline/formatter.js similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/formatter.js rename to core/src/main/resources/io/cucumber/core/plugin/timeline/formatter.js diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/index.html b/core/src/main/resources/io/cucumber/core/plugin/timeline/index.html similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/index.html rename to core/src/main/resources/io/cucumber/core/plugin/timeline/index.html diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/jquery-3.3.1.min.js b/core/src/main/resources/io/cucumber/core/plugin/timeline/jquery-3.3.1.min.js similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/jquery-3.3.1.min.js rename to core/src/main/resources/io/cucumber/core/plugin/timeline/jquery-3.3.1.min.js diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/report.css b/core/src/main/resources/io/cucumber/core/plugin/timeline/report.css similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/report.css rename to core/src/main/resources/io/cucumber/core/plugin/timeline/report.css diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/vis.min.css b/core/src/main/resources/io/cucumber/core/plugin/timeline/vis.min.css similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/vis.min.css rename to core/src/main/resources/io/cucumber/core/plugin/timeline/vis.min.css diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/vis.min.js b/core/src/main/resources/io/cucumber/core/plugin/timeline/vis.min.js similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/vis.min.js rename to core/src/main/resources/io/cucumber/core/plugin/timeline/vis.min.js diff --git a/core/src/main/resources/io/cucumber/formatter/timeline/vis.override.css b/core/src/main/resources/io/cucumber/core/plugin/timeline/vis.override.css similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/timeline/vis.override.css rename to core/src/main/resources/io/cucumber/core/plugin/timeline/vis.override.css diff --git a/core/src/main/resources/cucumber/version.properties b/core/src/main/resources/io/cucumber/core/version.properties similarity index 100% rename from core/src/main/resources/cucumber/version.properties rename to core/src/main/resources/io/cucumber/core/version.properties diff --git a/core/src/test/java/cucumber/runtime/UtilsTest.java b/core/src/test/java/cucumber/runtime/UtilsTest.java deleted file mode 100644 index 2e298f5d11..0000000000 --- a/core/src/test/java/cucumber/runtime/UtilsTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package cucumber.runtime; - -import org.junit.Test; - -import java.net.MalformedURLException; -import java.net.URL; - -import static cucumber.runtime.Utils.isInstantiable; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class UtilsTest { - @Test - public void public_non_static_inner_classes_are_not_instantiable() { - assertFalse(isInstantiable(NonStaticInnerClass.class)); - } - - @Test - public void public_static_inner_classes_are_instantiable() { - assertTrue(isInstantiable(StaticInnerClass.class)); - } - - public class NonStaticInnerClass { - } - - public static class StaticInnerClass { - } - - @Test - public void test_url() throws MalformedURLException { - URL dotCucumber = Utils.toURL("foo/bar/.cucumber"); - URL url = new URL(dotCucumber, "stepdefs.json"); - assertEquals(new URL("file:foo/bar/.cucumber/stepdefs.json"), url); - } -} diff --git a/core/src/test/java/cucumber/runtime/StubBackend.java b/core/src/test/java/io/cucumber/core/backend/StubBackend.java similarity index 76% rename from core/src/test/java/cucumber/runtime/StubBackend.java rename to core/src/test/java/io/cucumber/core/backend/StubBackend.java index fbc9c07790..9d5618c277 100644 --- a/core/src/test/java/cucumber/runtime/StubBackend.java +++ b/core/src/test/java/io/cucumber/core/backend/StubBackend.java @@ -1,11 +1,10 @@ -package cucumber.runtime; +package io.cucumber.core.backend; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.snippets.FunctionNameGenerator; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; -import java.util.Collections; import java.util.List; import static java.util.Collections.emptyList; diff --git a/core/src/test/java/cucumber/runtime/filter/LinePredicateTest.java b/core/src/test/java/io/cucumber/core/filter/LinePredicateTest.java similarity index 98% rename from core/src/test/java/cucumber/runtime/filter/LinePredicateTest.java rename to core/src/test/java/io/cucumber/core/filter/LinePredicateTest.java index b989b2e73e..46ae146be6 100644 --- a/core/src/test/java/cucumber/runtime/filter/LinePredicateTest.java +++ b/core/src/test/java/io/cucumber/core/filter/LinePredicateTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; diff --git a/core/src/test/java/cucumber/runtime/filter/NamePredicateTest.java b/core/src/test/java/io/cucumber/core/filter/NamePredicateTest.java similarity index 98% rename from core/src/test/java/cucumber/runtime/filter/NamePredicateTest.java rename to core/src/test/java/io/cucumber/core/filter/NamePredicateTest.java index c04cda7a6f..365fc206ea 100644 --- a/core/src/test/java/cucumber/runtime/filter/NamePredicateTest.java +++ b/core/src/test/java/io/cucumber/core/filter/NamePredicateTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; diff --git a/core/src/test/java/cucumber/runtime/filter/TagPredicateTest.java b/core/src/test/java/io/cucumber/core/filter/TagPredicateTest.java similarity index 99% rename from core/src/test/java/cucumber/runtime/filter/TagPredicateTest.java rename to core/src/test/java/io/cucumber/core/filter/TagPredicateTest.java index ea7b0ccaec..e083270aa4 100644 --- a/core/src/test/java/cucumber/runtime/filter/TagPredicateTest.java +++ b/core/src/test/java/io/cucumber/core/filter/TagPredicateTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.filter; +package io.cucumber.core.filter; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; diff --git a/core/src/test/java/cucumber/runtime/io/DelegatingResourceIteratorFactoryTest.java b/core/src/test/java/io/cucumber/core/io/DelegatingResourceIteratorFactoryTest.java similarity index 96% rename from core/src/test/java/cucumber/runtime/io/DelegatingResourceIteratorFactoryTest.java rename to core/src/test/java/io/cucumber/core/io/DelegatingResourceIteratorFactoryTest.java index 72eb9e47c4..f8d1ab49d8 100644 --- a/core/src/test/java/cucumber/runtime/io/DelegatingResourceIteratorFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/io/DelegatingResourceIteratorFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/io/FileResourceTest.java b/core/src/test/java/io/cucumber/core/io/FileResourceTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/io/FileResourceTest.java rename to core/src/test/java/io/cucumber/core/io/FileResourceTest.java index b5d1e8cf35..ecdb5baefb 100644 --- a/core/src/test/java/cucumber/runtime/io/FileResourceTest.java +++ b/core/src/test/java/io/cucumber/core/io/FileResourceTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/io/FlatteningIteratorTest.java b/core/src/test/java/io/cucumber/core/io/FlatteningIteratorTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/io/FlatteningIteratorTest.java rename to core/src/test/java/io/cucumber/core/io/FlatteningIteratorTest.java index 3abf56c8bb..e5e7b2e6a3 100644 --- a/core/src/test/java/cucumber/runtime/io/FlatteningIteratorTest.java +++ b/core/src/test/java/io/cucumber/core/io/FlatteningIteratorTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/io/HelpersTest.java b/core/src/test/java/io/cucumber/core/io/HelpersTest.java similarity index 93% rename from core/src/test/java/cucumber/runtime/io/HelpersTest.java rename to core/src/test/java/io/cucumber/core/io/HelpersTest.java index ab482d2356..9826890324 100644 --- a/core/src/test/java/cucumber/runtime/io/HelpersTest.java +++ b/core/src/test/java/io/cucumber/core/io/HelpersTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import org.junit.Test; @@ -10,8 +10,8 @@ import java.net.URLConnection; import java.net.URLStreamHandler; -import static cucumber.runtime.io.Helpers.filePath; -import static cucumber.runtime.io.Helpers.jarFilePath; +import static io.cucumber.core.io.Helpers.filePath; +import static io.cucumber.core.io.Helpers.jarFilePath; import static org.junit.Assert.assertEquals; public class HelpersTest { diff --git a/core/src/test/java/cucumber/runtime/io/ResourceLoaderTest.java b/core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java similarity index 87% rename from core/src/test/java/cucumber/runtime/io/ResourceLoaderTest.java rename to core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java index 79dcf26509..2eb110fedd 100644 --- a/core/src/test/java/cucumber/runtime/io/ResourceLoaderTest.java +++ b/core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import org.junit.Test; @@ -26,14 +26,14 @@ public void loads_resources_from_filesystem_dir() { @Test public void loads_resource_from_filesystem_file() { - File file = new File(dir, "cucumber/runtime/bar.properties"); + File file = new File(dir, "io/cucumber/core/io/bar.properties"); Iterable files = new FileResourceLoader().resources(file.getPath(), ".doesntmatter"); assertEquals(1, toList(files).size()); } @Test public void loads_resources_from_jar_on_classpath() throws IOException { - Iterable files = new ClasspathResourceLoader(Thread.currentThread().getContextClassLoader()).resources("cucumber", ".properties"); + Iterable files = new ClasspathResourceLoader(Thread.currentThread().getContextClassLoader()).resources("io/cucumber", ".properties"); assertEquals(4, toList(files).size()); } diff --git a/core/src/test/java/cucumber/runtime/io/TestResourceIterator.java b/core/src/test/java/io/cucumber/core/io/TestResourceIterator.java similarity index 93% rename from core/src/test/java/cucumber/runtime/io/TestResourceIterator.java rename to core/src/test/java/io/cucumber/core/io/TestResourceIterator.java index 38e2bc5eb5..78f294120e 100644 --- a/core/src/test/java/cucumber/runtime/io/TestResourceIterator.java +++ b/core/src/test/java/io/cucumber/core/io/TestResourceIterator.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.util.Iterator; import java.util.NoSuchElementException; diff --git a/core/src/test/java/cucumber/runtime/io/TestResourceIteratorFactory.java b/core/src/test/java/io/cucumber/core/io/TestResourceIteratorFactory.java similarity index 94% rename from core/src/test/java/cucumber/runtime/io/TestResourceIteratorFactory.java rename to core/src/test/java/io/cucumber/core/io/TestResourceIteratorFactory.java index 327005e683..3d5331db4a 100644 --- a/core/src/test/java/cucumber/runtime/io/TestResourceIteratorFactory.java +++ b/core/src/test/java/io/cucumber/core/io/TestResourceIteratorFactory.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import java.net.URL; import java.util.Iterator; diff --git a/core/src/test/java/cucumber/runtime/io/URLOutputStreamTest.java b/core/src/test/java/io/cucumber/core/io/URLOutputStreamTest.java similarity index 90% rename from core/src/test/java/cucumber/runtime/io/URLOutputStreamTest.java rename to core/src/test/java/io/cucumber/core/io/URLOutputStreamTest.java index 3c6ea23409..d1713604a6 100644 --- a/core/src/test/java/cucumber/runtime/io/URLOutputStreamTest.java +++ b/core/src/test/java/io/cucumber/core/io/URLOutputStreamTest.java @@ -1,7 +1,6 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; -import cucumber.runtime.Utils; -import cucumber.util.FixJava; +import io.cucumber.core.util.FixJava; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -23,6 +22,7 @@ import java.io.Reader; import java.io.Writer; import java.net.InetSocketAddress; +import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; @@ -43,6 +43,16 @@ import static org.junit.Assert.fail; public class URLOutputStreamTest { + private static final URL CUCUMBER_STEPDEFS = createUrl("http://localhost:9873/.cucumber/stepdefs.json"); + + private static URL createUrl(String s) { + try { + return new URL(s); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + private WebServer webbit; private final int threadsCount = 100; private final long waitTimeoutMillis = 30000L; @@ -66,7 +76,7 @@ public void stopWebbit() throws ExecutionException, InterruptedException { public void write_to_file_without_existing_parent_directory() throws IOException, URISyntaxException { Path filesWithoutParent = Files.createTempDirectory("filesWithoutParent"); String baseURL = filesWithoutParent.toUri().toURL().toString(); - URL urlWithoutParentDirectory = new URL(baseURL + "/non/existing/directory"); + URL urlWithoutParentDirectory = createUrl(baseURL + "/non/existing/directory"); Writer w = new UTF8OutputStreamWriter(new URLOutputStream(urlWithoutParentDirectory)); w.write("Hellesøy"); @@ -97,7 +107,7 @@ public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl } }); - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(new URL(Utils.toURL("http://localhost:9873/.cucumber"), "stepdefs.json"))); + Writer w = new UTF8OutputStreamWriter(new URLOutputStream(CUCUMBER_STEPDEFS)); w.write("Hellesøy"); w.flush(); w.close(); @@ -106,7 +116,7 @@ public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl @Test public void throws_fnfe_if_http_response_is_404() throws IOException, ExecutionException, InterruptedException { - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(new URL(Utils.toURL("http://localhost:9873/.cucumber"), "stepdefs.json"))); + Writer w = new UTF8OutputStreamWriter(new URLOutputStream(CUCUMBER_STEPDEFS)); w.write("Hellesøy"); w.flush(); try { @@ -128,7 +138,7 @@ public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl } }); - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(new URL(Utils.toURL("http://localhost:9873/.cucumber"), "stepdefs.json"))); + Writer w = new UTF8OutputStreamWriter(new URLOutputStream(CUCUMBER_STEPDEFS)); w.write("Hellesøy"); w.flush(); try { @@ -136,7 +146,7 @@ public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl fail(); } catch (IOException expected) { assertEquals("PUT http://localhost:9873/.cucumber/stepdefs.json\n" + - "HTTP 500\nsomething went wrong", expected.getMessage()); + "HTTP 500\nsomething went wrong", expected.getMessage()); } } @@ -162,8 +172,8 @@ private List getThreadsWithLatchForFile(final CountDownLatch countDownLa final int curThreadNo = i; // It useful when 2-3 threads (not more) tries to create the same directory for the report final File tmp = (i % 3 == 0 || i % 3 == 2) ? - new File(tempFolder.getRoot().getAbsolutePath() + "/cuce" + ballast + i + "/tmpFile.tmp") : - new File(tempFolder.getRoot().getAbsolutePath() + "/cuce" + ballast + (i - 1) + "/tmpFile.tmp"); + new File(tempFolder.getRoot().getAbsolutePath() + "/cuce" + ballast + i + "/tmpFile.tmp") : + new File(tempFolder.getRoot().getAbsolutePath() + "/cuce" + ballast + (i - 1) + "/tmpFile.tmp"); tmpFiles.add(tmp); result.add(new Thread() { @Override diff --git a/core/src/test/java/cucumber/runtime/io/ZipResourceIteratorFactoryTest.java b/core/src/test/java/io/cucumber/core/io/ZipResourceIteratorFactoryTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/io/ZipResourceIteratorFactoryTest.java rename to core/src/test/java/io/cucumber/core/io/ZipResourceIteratorFactoryTest.java index 34649647d8..d0bf288e3b 100644 --- a/core/src/test/java/cucumber/runtime/io/ZipResourceIteratorFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/io/ZipResourceIteratorFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.io; +package io.cucumber.core.io; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/model/CucumberFeatureTest.java b/core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java similarity index 98% rename from core/src/test/java/cucumber/runtime/model/CucumberFeatureTest.java rename to core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java index 5170bcaa19..7e1e19b5f1 100644 --- a/core/src/test/java/cucumber/runtime/model/CucumberFeatureTest.java +++ b/core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java @@ -1,7 +1,7 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; -import cucumber.runtime.io.Resource; -import cucumber.runtime.io.ResourceLoader; +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; import org.junit.Test; import java.io.ByteArrayInputStream; @@ -15,7 +15,7 @@ import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; -import static org.mockito.Matchers.anyString; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/core/src/test/java/cucumber/runtime/model/FeatureBuilderTest.java b/core/src/test/java/io/cucumber/core/model/FeatureBuilderTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/model/FeatureBuilderTest.java rename to core/src/test/java/io/cucumber/core/model/FeatureBuilderTest.java index 354fc14bdc..fb84548afe 100644 --- a/core/src/test/java/cucumber/runtime/model/FeatureBuilderTest.java +++ b/core/src/test/java/io/cucumber/core/model/FeatureBuilderTest.java @@ -1,6 +1,6 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; -import cucumber.runtime.io.Resource; +import io.cucumber.core.io.Resource; import org.junit.Test; import java.io.ByteArrayInputStream; diff --git a/core/src/test/java/cucumber/runtime/model/PathWithLinesTest.java b/core/src/test/java/io/cucumber/core/model/PathWithLinesTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/model/PathWithLinesTest.java rename to core/src/test/java/io/cucumber/core/model/PathWithLinesTest.java index 5b1a24ab60..75c60c1a74 100644 --- a/core/src/test/java/cucumber/runtime/model/PathWithLinesTest.java +++ b/core/src/test/java/io/cucumber/core/model/PathWithLinesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.model; +package io.cucumber.core.model; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/EnvTest.java b/core/src/test/java/io/cucumber/core/options/EnvTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/EnvTest.java rename to core/src/test/java/io/cucumber/core/options/EnvTest.java index a2a14a8c1a..0831bde6e2 100644 --- a/core/src/test/java/cucumber/runtime/EnvTest.java +++ b/core/src/test/java/io/cucumber/core/options/EnvTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.options; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/RuntimeOptionsFactoryTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java similarity index 84% rename from core/src/test/java/cucumber/runtime/RuntimeOptionsFactoryTest.java rename to core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java index b198485398..11387a1800 100644 --- a/core/src/test/java/cucumber/runtime/RuntimeOptionsFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java @@ -1,20 +1,21 @@ -package cucumber.runtime; +package io.cucumber.core.options; import cucumber.api.CucumberOptions; import cucumber.api.Plugin; import cucumber.api.SnippetType; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runtime.formatter.PluginFactory; -import cucumber.runtime.formatter.Plugins; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.plugin.PluginFactory; +import io.cucumber.core.plugin.Plugins; import org.junit.Test; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; -import static cucumber.runtime.RuntimeOptionsFactory.packageName; -import static cucumber.runtime.RuntimeOptionsFactory.packagePath; +import static io.cucumber.core.options.RuntimeOptionsFactory.packageName; +import static io.cucumber.core.options.RuntimeOptionsFactory.packagePath; import static java.util.Arrays.asList; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.junit.Assert.assertEquals; @@ -42,13 +43,13 @@ public void create_without_options() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(WithoutOptions.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); assertFalse(runtimeOptions.isStrict()); - assertEquals(asList("classpath:cucumber/runtime"), runtimeOptions.getFeaturePaths()); - assertEquals(asList("classpath:cucumber/runtime"), runtimeOptions.getGlue()); + assertEquals(asList("classpath:io/cucumber/core/options"), runtimeOptions.getFeaturePaths()); + assertEquals(asList("classpath:io/cucumber/core/options"), runtimeOptions.getGlue()); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); assertThat(plugins.getPlugins(), hasSize(2)); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.ProgressFormatter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.ProgressFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test @@ -56,12 +57,12 @@ public void create_without_options_with_base_class_without_options() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(WithoutOptionsWithBaseClassWithoutOptions.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); - assertEquals(asList("classpath:cucumber/runtime"), runtimeOptions.getFeaturePaths()); - assertEquals(asList("classpath:cucumber/runtime"), runtimeOptions.getGlue()); + assertEquals(asList("classpath:io/cucumber/core/options"), runtimeOptions.getFeaturePaths()); + assertEquals(asList("classpath:io/cucumber/core/options"), runtimeOptions.getGlue()); assertThat(plugins.getPlugins(), hasSize(2)); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.ProgressFormatter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.ProgressFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test @@ -112,7 +113,7 @@ public void create_default_summary_printer_when_no_summary_printer_plugin_is_def RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(ClassWithNoSummaryPrinterPlugin.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test @@ -120,8 +121,8 @@ public void inherit_plugin_from_baseclass() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(SubClassWithFormatter.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); List plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions).getPlugins(); - assertPluginExists(plugins, "cucumber.runtime.formatter.JSONFormatter"); - assertPluginExists(plugins, "cucumber.runtime.formatter.PrettyFormatter"); + assertPluginExists(plugins, "io.cucumber.core.plugin.JSONFormatter"); + assertPluginExists(plugins, "io.cucumber.core.plugin.PrettyFormatter"); } @Test @@ -163,7 +164,7 @@ public void create_with_extra_glue() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(ClassWithExtraGlue.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - assertEquals(asList("app.features.hooks", "classpath:cucumber/runtime"), runtimeOptions.getGlue()); + assertEquals(asList("app.features.hooks", "classpath:io/cucumber/core/options"), runtimeOptions.getGlue()); } @Test @@ -171,7 +172,7 @@ public void create_with_extra_glue_in_subclass_of_extra_glue() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(SubClassWithExtraGlueOfExtraGlue.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - assertEquals(asList("app.features.user.hooks", "app.features.hooks", "classpath:cucumber/runtime"), runtimeOptions.getGlue()); + assertEquals(asList("app.features.user.hooks", "app.features.hooks", "classpath:io/cucumber/core/options"), runtimeOptions.getGlue()); } @Test @@ -241,7 +242,7 @@ private static class BaseClassWithMonoChromeFalse { // empty } - @CucumberOptions(plugin = "cucumber.runtime.formatter.AnyStepDefinitionReporter") + @CucumberOptions(plugin = "io.cucumber.core.plugin.AnyStepDefinitionReporter") private static class ClassWithNoFormatterPlugin { // empty } diff --git a/core/src/test/java/cucumber/runtime/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java similarity index 90% rename from core/src/test/java/cucumber/runtime/RuntimeOptionsTest.java rename to core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index 4324db7433..121c5ced8d 100644 --- a/core/src/test/java/cucumber/runtime/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.options; import cucumber.api.Plugin; import cucumber.api.SnippetType; @@ -6,10 +6,11 @@ import cucumber.api.event.EventPublisher; import cucumber.api.formatter.ColorAware; import cucumber.api.formatter.StrictAware; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.TimeService; -import cucumber.runtime.formatter.PluginFactory; -import cucumber.runtime.formatter.Plugins; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.plugin.PluginFactory; +import io.cucumber.core.plugin.Plugins; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -80,36 +81,36 @@ public void assigns_glue() { public void creates_html_formatter() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "html:some/dir", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertEquals("cucumber.runtime.formatter.HTMLFormatter", plugins.getPlugins().get(0).getClass().getName()); + assertEquals("io.cucumber.core.plugin.HTMLFormatter", plugins.getPlugins().get(0).getClass().getName()); } @Test public void creates_progress_formatter_as_default() { RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertEquals("cucumber.runtime.formatter.ProgressFormatter", plugins.getPlugins().get(0).getClass().getName()); + assertEquals("io.cucumber.core.plugin.ProgressFormatter", plugins.getPlugins().get(0).getClass().getName()); } @Test public void creates_progress_formatter_when_no_formatter_plugin_is_specified() { - RuntimeOptions options = new RuntimeOptions(asList("--plugin", "cucumber.runtime.formatter.AnyStepDefinitionReporter", "--glue", "somewhere")); + RuntimeOptions options = new RuntimeOptions(asList("--plugin", "io.cucumber.core.plugin.AnyStepDefinitionReporter", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.ProgressFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.ProgressFormatter"); } @Test public void creates_default_summary_printer_when_no_summary_printer_plugin_is_specified() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "pretty", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test public void creates_null_summary_printer() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "null_summary", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.NullSummaryPrinter"); - assertPluginNotExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.NullSummaryPrinter"); + assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test @@ -287,8 +288,8 @@ public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucum properties.setProperty("cucumber.options", "--plugin pretty"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:some/dir", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.PrettyFormatter"); - assertPluginNotExists(plugins.getPlugins(), "cucumber.runtime.formatter.HTMLFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.PrettyFormatter"); + assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.HTMLFormatter"); } @Test @@ -297,8 +298,8 @@ public void adds_to_formatter_plugins_with_add_plugin_option() { properties.setProperty("cucumber.options", "--add-plugin pretty"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:some/dir", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.HTMLFormatter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.PrettyFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.HTMLFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.PrettyFormatter"); } @Test @@ -307,8 +308,8 @@ public void clobbers_summary_plugins_from_cli_if_summary_printer_specified_in_cu properties.setProperty("cucumber.options", "--plugin default_summary"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "null_summary", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); - assertPluginNotExists(plugins.getPlugins(), "cucumber.runtime.formatter.NullSummaryPrinter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); + assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.NullSummaryPrinter"); } @Test @@ -317,8 +318,8 @@ public void adds_to_summary_plugins_with_add_plugin_option() { properties.setProperty("cucumber.options", "--add-plugin default_summary"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "null_summary", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.NullSummaryPrinter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.NullSummaryPrinter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test @@ -327,8 +328,8 @@ public void does_not_clobber_plugins_of_different_type_when_specifying_plugins_i properties.setProperty("cucumber.options", "--plugin default_summary"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "pretty", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); -// assertPluginExists(options.getPlugins(), "cucumber.runtime.formatter.CucumberPrettyFormatter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); +// assertPluginExists(options.getPlugins(), "io.cucumber.core.plugin.CucumberPrettyFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test diff --git a/core/src/test/java/cucumber/runtime/ShellwordsTest.java b/core/src/test/java/io/cucumber/core/options/ShellwordsTest.java similarity index 96% rename from core/src/test/java/cucumber/runtime/ShellwordsTest.java rename to core/src/test/java/io/cucumber/core/options/ShellwordsTest.java index 0abd66f277..db102d9462 100644 --- a/core/src/test/java/cucumber/runtime/ShellwordsTest.java +++ b/core/src/test/java/io/cucumber/core/options/ShellwordsTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.options; import org.junit.Ignore; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/formatter/AnyStepDefinitionReporter.java b/core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java similarity index 81% rename from core/src/test/java/cucumber/runtime/formatter/AnyStepDefinitionReporter.java rename to core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java index eb07fa6478..7dbaa69e57 100644 --- a/core/src/test/java/cucumber/runtime/formatter/AnyStepDefinitionReporter.java +++ b/core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java @@ -1,7 +1,7 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.StepDefinitionReporter; -import cucumber.runtime.StepDefinition; +import io.cucumber.core.backend.StepDefinition; public class AnyStepDefinitionReporter implements StepDefinitionReporter { diff --git a/core/src/test/java/cucumber/runtime/formatter/AverageUsageStatisticStrategyTest.java b/core/src/test/java/io/cucumber/core/plugin/AverageUsageStatisticStrategyTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/formatter/AverageUsageStatisticStrategyTest.java rename to core/src/test/java/io/cucumber/core/plugin/AverageUsageStatisticStrategyTest.java index 64d5744ee1..8429912bd5 100644 --- a/core/src/test/java/cucumber/runtime/formatter/AverageUsageStatisticStrategyTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/AverageUsageStatisticStrategyTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/formatter/FormatterBuilder.java b/core/src/test/java/io/cucumber/core/plugin/FormatterBuilder.java similarity index 80% rename from core/src/test/java/cucumber/runtime/formatter/FormatterBuilder.java rename to core/src/test/java/io/cucumber/core/plugin/FormatterBuilder.java index 0b2d3880fd..e3db441bd1 100644 --- a/core/src/test/java/cucumber/runtime/formatter/FormatterBuilder.java +++ b/core/src/test/java/io/cucumber/core/plugin/FormatterBuilder.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; public class FormatterBuilder { diff --git a/core/src/test/java/cucumber/runtime/formatter/FormatterSpy.java b/core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java similarity index 98% rename from core/src/test/java/cucumber/runtime/formatter/FormatterSpy.java rename to core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java index 06612a5598..355f413253 100644 --- a/core/src/test/java/cucumber/runtime/formatter/FormatterSpy.java +++ b/core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.event.EventHandler; import cucumber.api.event.EventListener; diff --git a/core/src/test/java/cucumber/runtime/formatter/HTMLFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java similarity index 91% rename from core/src/test/java/cucumber/runtime/formatter/HTMLFormatterTest.java rename to core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java index 175f211edf..b9566593df 100644 --- a/core/src/test/java/cucumber/runtime/formatter/HTMLFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java @@ -1,11 +1,10 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.Result; import cucumber.api.formatter.NiceAppendable; -import cucumber.runner.TestHelper; -import cucumber.runtime.Utils; -import cucumber.runtime.model.CucumberFeature; -import cucumber.util.FixJava; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.util.FixJava; import gherkin.deps.com.google.gson.JsonParser; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -25,15 +24,16 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import static cucumber.runner.TestHelper.createEmbedHookAction; -import static cucumber.runner.TestHelper.createWriteHookAction; -import static cucumber.runner.TestHelper.feature; -import static cucumber.runner.TestHelper.result; +import static io.cucumber.core.runner.TestHelper.createEmbedHookAction; +import static io.cucumber.core.runner.TestHelper.createWriteHookAction; +import static io.cucumber.core.runner.TestHelper.feature; +import static io.cucumber.core.runner.TestHelper.result; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; + public class HTMLFormatterTest { private final static String jsFunctionCallRegexString = "formatter.(\\w*)\\(([^)]*)\\);"; private final static Pattern jsFunctionCallRegex = Pattern.compile(jsFunctionCallRegexString); @@ -49,7 +49,7 @@ public class HTMLFormatterTest { private URL outputDir; public void writeReport() throws Throwable { - outputDir = Utils.toURL(TempDir.createTempDirectory().getAbsolutePath()); + outputDir = TempDir.createTempDirectory().toURI().toURL(); runFeaturesWithFormatter(outputDir); } @@ -68,35 +68,35 @@ public void writes_valid_report_js() throws Throwable { String reportJs = FixJava.readReader(new InputStreamReader(new URL(outputDir, "report.js").openStream(), "UTF-8")); assertJsFunctionCallSequence(asList("" + "formatter.uri(\"some\\\\windows\\\\path\\\\some.feature\");\n", - "formatter.feature({\n" + + "formatter.feature({\n" + " \"name\": \"\",\n" + " \"description\": \"\",\n" + " \"keyword\": \"Feature\"\n" + "});\n", - "formatter.scenario({\n" + + "formatter.scenario({\n" + " \"name\": \"some cukes\",\n" + " \"description\": \"\",\n" + " \"keyword\": \"Scenario\"\n" + "});\n", - "formatter.step({\n" + + "formatter.step({\n" + " \"name\": \"first step\",\n" + " \"keyword\": \"Given \"\n" + "});\n", - "formatter.match({\n" + + "formatter.match({\n" + " \"location\": \"path/step_definitions.java:3\"\n" + "});\n", - "formatter.result({\n" + + "formatter.result({\n" + " \"status\": \"passed\"\n" + "});\n", - "formatter.embedding(\"image/png\", \"embedded0.png\");\n", - "formatter.after({\n" + + "formatter.embedding(\"image/png\", \"embedded0.png\");\n", + "formatter.after({\n" + " \"status\": \"passed\"\n" + "});\n", - "formatter.embedding(\"text/plain\", \"dodgy stack trace here\");\n", - "formatter.after({\n" + + "formatter.embedding(\"text/plain\", \"dodgy stack trace here\");\n", + "formatter.after({\n" + " \"status\": \"passed\"\n" + "});\n"), - reportJs); + reportJs); } @Test @@ -117,10 +117,10 @@ public void included_embedding() throws Throwable { @Test public void should_handle_a_single_scenario() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Given first step\n" + - " Then second step\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Given first step\n" + + " Then second step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToResult.put("second step", result("passed")); @@ -162,19 +162,19 @@ public void should_handle_a_single_scenario() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});"), - formatterOutput); + formatterOutput); } @Test public void should_handle_backgound() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Background: background name\n" + - " Given first step\n" + - " Scenario: scenario 1\n" + - " Then second step\n" + - " Scenario: scenario 2\n" + - " Then third step\n"); + "Feature: feature name\n" + + " Background: background name\n" + + " Given first step\n" + + " Scenario: scenario 1\n" + + " Then second step\n" + + " Scenario: scenario 2\n" + + " Then third step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToResult.put("second step", result("passed")); @@ -247,20 +247,20 @@ public void should_handle_backgound() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});\n"), - formatterOutput); + formatterOutput); } @Test public void should_handle_scenario_outline() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario Outline: outline name\n" + - " Given first step\n" + - " Then step\n" + - " Examples: examples name\n" + - " | arg |\n" + - " | second |\n" + - " | third |\n"); + "Feature: feature name\n" + + " Scenario Outline: outline name\n" + + " Given first step\n" + + " Then step\n" + + " Examples: examples name\n" + + " | arg |\n" + + " | second |\n" + + " | third |\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToResult.put("second step", result("passed")); @@ -364,15 +364,15 @@ public void should_handle_scenario_outline() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});"), - formatterOutput); + formatterOutput); } @Test public void should_handle_before_hooks() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Given first step\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); @@ -400,15 +400,15 @@ public void should_handle_before_hooks() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});\n"), - formatterOutput); + formatterOutput); } @Test public void should_handle_after_hooks() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Given first step\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); @@ -436,7 +436,7 @@ public void should_handle_after_hooks() throws Throwable { "formatter.after({\n" + " \"status\": \"passed\"\n" + "});\n"), - formatterOutput); + formatterOutput); } @Test @@ -501,9 +501,9 @@ public void should_handle_after_step_hooks() throws Throwable { @Test public void should_handle_output_from_before_hooks() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Given first step\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); @@ -533,15 +533,15 @@ public void should_handle_output_from_before_hooks() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});\n"), - formatterOutput); + formatterOutput); } @Test public void should_handle_output_from_after_hooks() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Given first step\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); @@ -571,7 +571,7 @@ public void should_handle_output_from_after_hooks() throws Throwable { "formatter.after({\n" + " \"status\": \"passed\"\n" + "});\n"), - formatterOutput); + formatterOutput); } @Test @@ -632,9 +632,9 @@ public void should_handle_output_from_after_step_hooks() throws Throwable { @Test public void should_handle_text_embeddings_from_before_hooks() throws Throwable { CucumberFeature feature = feature("path/test.feature", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Given first step\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); @@ -664,7 +664,7 @@ public void should_handle_text_embeddings_from_before_hooks() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});\n"), - formatterOutput); + formatterOutput); } private void assertJsFunctionCallSequence(List expectedList, String actual) { @@ -729,9 +729,9 @@ private void assertContains(String substring, String string) { private void runFeaturesWithFormatter(URL outputDir) throws Throwable { final HTMLFormatter f = new HTMLFormatter(outputDir); CucumberFeature feature = feature("some\\windows\\path\\some.feature", "" + - "Feature:\n" + - " Scenario: some cukes\n" + - " Given first step\n"); + "Feature:\n" + + " Scenario: some cukes\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); diff --git a/core/src/test/java/cucumber/runtime/formatter/JSONFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java similarity index 97% rename from core/src/test/java/cucumber/runtime/formatter/JSONFormatterTest.java rename to core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java index c02962f4e6..dfa7945dd8 100755 --- a/core/src/test/java/cucumber/runtime/formatter/JSONFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java @@ -1,16 +1,17 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.Result; -import cucumber.runner.EventBus; -import cucumber.runner.TestBackendSupplier; -import cucumber.runner.TestHelper; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.TimeServiceStub; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.Runtime; -import cucumber.runtime.io.ClasspathResourceLoader; -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.snippets.FunctionNameGenerator; +import io.cucumber.core.runner.EventBus; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.runner.TestBackendSupplier; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.runner.TimeServiceStub; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.runtime.Runtime; +import io.cucumber.core.io.ClasspathResourceLoader; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; import org.junit.Test; @@ -21,15 +22,14 @@ import java.io.IOException; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; -import static cucumber.runner.TestHelper.createEmbedHookAction; -import static cucumber.runner.TestHelper.createWriteHookAction; -import static cucumber.runner.TestHelper.result; +import static io.cucumber.core.runner.TestHelper.createEmbedHookAction; +import static io.cucumber.core.runner.TestHelper.createWriteHookAction; +import static io.cucumber.core.runner.TestHelper.result; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.junit.Assert.assertThat; @@ -49,7 +49,7 @@ public class JSONFormatterTest { @Test public void featureWithOutlineTest() { - String actual = runFeaturesWithFormatter(asList("cucumber/runtime/formatter/JSONPrettyFormatterTest.feature")); + String actual = runFeaturesWithFormatter(asList("io/cucumber/core/plugin/JSONPrettyFormatterTest.feature")); String expected = new Scanner(getClass().getResourceAsStream("JSONPrettyFormatterTest.json"), "UTF-8").useDelimiter("\\A").next(); assertThat(actual, sameJSONAs(expected)); @@ -58,7 +58,7 @@ public void featureWithOutlineTest() { @Test public void featureWithOutlineTestParallel() throws Exception { - String actual = runFeaturesWithFormatterInParallel(asList("cucumber/runtime/formatter/JSONPrettyFormatterTest.feature")); + String actual = runFeaturesWithFormatterInParallel(asList("io/cucumber/core/plugin/JSONPrettyFormatterTest.feature")); String expected = new Scanner(getClass().getResourceAsStream("JSONPrettyFormatterTest.json"), "UTF-8").useDelimiter("\\A").next(); assertThat(actual, sameJSONAs(expected)); @@ -1143,7 +1143,7 @@ private String runFeaturesWithFormatterInParallel(final List featurePath final TestBackendSupplier backendSupplier = new TestBackendSupplier() { @Override - public void loadGlue(cucumber.runtime.Glue glue, List gluePaths) { + public void loadGlue(Glue glue, List gluePaths) { glue.addBeforeHook(hook); } @@ -1179,7 +1179,7 @@ private String runFeaturesWithFormatter(final List featurePaths) { final TestBackendSupplier backendSupplier = new TestBackendSupplier() { @Override - public void loadGlue(cucumber.runtime.Glue glue, List gluePaths) { + public void loadGlue(Glue glue, List gluePaths) { glue.addBeforeHook(hook); } diff --git a/core/src/test/java/cucumber/runtime/formatter/JUnitFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java similarity index 89% rename from core/src/test/java/cucumber/runtime/formatter/JUnitFormatterTest.java rename to core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java index 7892e5c0ce..4b96fa0eb6 100644 --- a/core/src/test/java/cucumber/runtime/formatter/JUnitFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java @@ -1,12 +1,8 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.Result; -import cucumber.runtime.Backend; -import cucumber.runner.TestHelper; -import cucumber.runtime.Utils; -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.snippets.FunctionNameGenerator; -import gherkin.pickles.PickleStep; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.model.CucumberFeature; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.XMLUnit; import org.junit.AssumptionViolatedException; @@ -28,13 +24,11 @@ import java.util.Map; import java.util.Scanner; -import static cucumber.runner.TestHelper.result; +import static io.cucumber.core.runner.TestHelper.result; import static java.util.Arrays.asList; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class JUnitFormatterTest { @@ -48,27 +42,27 @@ public class JUnitFormatterTest { @Test public void featureSimpleTest() throws Exception { - File report = runFeaturesWithJunitFormatter(asList("cucumber/runtime/formatter/JUnitFormatterTest_1.feature")); - assertXmlEqual("cucumber/runtime/formatter/JUnitFormatterTest_1.report.xml", report); + File report = runFeaturesWithJunitFormatter(asList("io/cucumber/core/plugin/JUnitFormatterTest_1.feature")); + assertXmlEqual("io/cucumber/core/plugin/JUnitFormatterTest_1.report.xml", report); } @Test public void featureWithBackgroundTest() throws Exception { - File report = runFeaturesWithJunitFormatter(asList("cucumber/runtime/formatter/JUnitFormatterTest_2.feature")); - assertXmlEqual("cucumber/runtime/formatter/JUnitFormatterTest_2.report.xml", report); + File report = runFeaturesWithJunitFormatter(asList("io/cucumber/core/plugin/JUnitFormatterTest_2.feature")); + assertXmlEqual("io/cucumber/core/plugin/JUnitFormatterTest_2.report.xml", report); } @Test public void featureWithOutlineTest() throws Exception { - File report = runFeaturesWithJunitFormatter(asList("cucumber/runtime/formatter/JUnitFormatterTest_3.feature")); - assertXmlEqual("cucumber/runtime/formatter/JUnitFormatterTest_3.report.xml", report); + File report = runFeaturesWithJunitFormatter(asList("io/cucumber/core/plugin/JUnitFormatterTest_3.feature")); + assertXmlEqual("io/cucumber/core/plugin/JUnitFormatterTest_3.report.xml", report); } @Test public void featureSimpleStrictTest() throws Exception { boolean strict = true; - File report = runFeaturesWithJunitFormatter(asList("cucumber/runtime/formatter/JUnitFormatterTest_1.feature"), strict); - assertXmlEqual("cucumber/runtime/formatter/JUnitFormatterTest_1_strict.report.xml", report); + File report = runFeaturesWithJunitFormatter(asList("io/cucumber/core/plugin/JUnitFormatterTest_1.feature"), strict); + assertXmlEqual("io/cucumber/core/plugin/JUnitFormatterTest_1_strict.report.xml", report); } @Test @@ -88,7 +82,7 @@ public void should_format_passed_scenario() throws Throwable { String formatterOutput = runFeaturesWithFormatter(); String expected = "\n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " \n" + - "\n" + + "\n" + " \n" + " " + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -73,8 +72,8 @@ public void testScenarioWithUndefinedStepsStrict() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -105,8 +104,8 @@ public final void testScenarioWithPendingSteps() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -130,11 +129,11 @@ public void testScenarioWithFailedSteps() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + - " " + + " " + " " + @@ -161,8 +160,8 @@ public final void testScenarioWithPassedSteps() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -189,8 +188,8 @@ public void testScenarioWithBackground() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -217,8 +216,8 @@ public void testScenarioOutlineWithExamples() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -253,8 +252,8 @@ public void testDurationCalculationOfStepsAndHooks() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + " " + @@ -282,11 +281,11 @@ public void testScenarioWithFailedBeforeHook() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + - " " + + " " + " " + @@ -314,11 +313,11 @@ public void testScenarioWithFailedAfterHook() throws Throwable { assertXmlEqual("" + "" + "" + - " " + - " " + + " " + + " " + " " + " " + - " " + + " " + " " + @@ -347,7 +346,7 @@ public int differenceFound(Difference difference) { private String runFeaturesWithFormatter(boolean strict) throws IOException { final File tempFile = File.createTempFile("cucumber-jvm-testng", ".xml"); - final TestNGFormatter formatter = new TestNGFormatter(toURL(tempFile.getAbsolutePath())); + final TestNGFormatter formatter = new TestNGFormatter(tempFile.toURI().toURL()); formatter.setStrict(strict); TestHelper.builder() diff --git a/core/src/test/java/cucumber/runtime/formatter/TimelineFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java similarity index 98% rename from core/src/test/java/cucumber/runtime/formatter/TimelineFormatterTest.java rename to core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java index 2d2bc836b1..73d249e4b6 100644 --- a/core/src/test/java/cucumber/runtime/formatter/TimelineFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java @@ -1,8 +1,8 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.Result; -import cucumber.runner.TestHelper; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.model.CucumberFeature; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; import org.junit.Before; @@ -20,8 +20,8 @@ import java.util.Scanner; import java.util.concurrent.TimeUnit; -import static cucumber.runner.TestHelper.feature; -import static cucumber.runner.TestHelper.result; +import static io.cucumber.core.runner.TestHelper.feature; +import static io.cucumber.core.runner.TestHelper.result; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -36,7 +36,7 @@ public int compare(TimelineFormatter.TestData o1, TimelineFormatter.TestData o2) } }; - private static final String REPORT_TEMPLATE_RESOURCE_DIR = "src/main/resources/io/cucumber/formatter/timeline"; + private static final String REPORT_TEMPLATE_RESOURCE_DIR = "src/main/resources/io/cucumber/core/plugin/timeline"; private static final String REPORT_JS = "report.js"; private static final long STEP_DURATION_MS = 1000; diff --git a/core/src/test/java/cucumber/runtime/UndefinedStepsTrackerTest.java b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java similarity index 88% rename from core/src/test/java/cucumber/runtime/UndefinedStepsTrackerTest.java rename to core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java index 67b72b4e6b..c0467cb6d2 100644 --- a/core/src/test/java/cucumber/runtime/UndefinedStepsTrackerTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java @@ -1,10 +1,11 @@ -package cucumber.runtime; - -import cucumber.runner.TestHelper; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.EventBus; -import cucumber.runner.TimeServiceStub; -import cucumber.runtime.model.CucumberFeature; +package io.cucumber.core.plugin; + +import cucumber.api.event.TestSourceRead; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.runner.EventBus; +import io.cucumber.core.runner.TimeServiceStub; +import io.cucumber.core.model.CucumberFeature; import gherkin.pickles.PickleLocation; import org.junit.Test; @@ -50,7 +51,7 @@ public void uses_given_when_then_keywords() throws IOException { " Scenario: scenario name\n" + " Given A\n" + " Then B\n"); - feature.sendTestSourceRead(bus); + sendTestSourceRead(bus, feature); tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(4)), asList("**KEYWORD** ^B$")); assertEquals("[Then ^B$]", tracker.getSnippets().toString()); } @@ -66,7 +67,7 @@ public void converts_and_to_previous_step_keyword() throws IOException { " When A\n" + " And B\n" + " But C\n"); - feature.sendTestSourceRead(bus); + sendTestSourceRead(bus, feature); tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(5)), asList("**KEYWORD** ^C$")); assertEquals("[When ^C$]", tracker.getSnippets().toString()); } @@ -83,11 +84,15 @@ public void backtrack_into_background_to_find_step_keyword() throws IOException " Scenario: scenario name\n" + " And B\n" + " But C\n"); - feature.sendTestSourceRead(bus); + sendTestSourceRead(bus, feature); tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(5)), asList("**KEYWORD** ^C$")); assertEquals("[When ^C$]", tracker.getSnippets().toString()); } + private void sendTestSourceRead(EventBus bus, CucumberFeature feature) { + bus.send(new TestSourceRead(bus.getTime(), feature.getUri(), feature.getGherkinSource())); + } + @Test public void doesnt_try_to_use_star_keyword() throws IOException { EventBus bus = new TimeServiceEventBus(new TimeServiceStub(0)); @@ -99,7 +104,7 @@ public void doesnt_try_to_use_star_keyword() throws IOException { " When A\n" + " And B\n" + " * C\n"); - feature.sendTestSourceRead(bus); + sendTestSourceRead(bus, feature); tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(5)), asList("**KEYWORD** ^C$")); assertEquals("[When ^C$]", tracker.getSnippets().toString()); } @@ -113,7 +118,7 @@ public void star_keyword_becomes_given_when_no_previous_step() throws IOExceptio "Feature: feature name\n" + " Scenario: scenario name\n" + " * A\n"); - feature.sendTestSourceRead(bus); + sendTestSourceRead(bus, feature); tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(3)), asList("**KEYWORD** ^A$")); assertEquals("[Given ^A$]", tracker.getSnippets().toString()); } @@ -128,7 +133,7 @@ public void snippets_are_generated_for_correct_locale() throws Exception { "ФункциÑ:\n" + " Сценарий: \n" + " * Б\n"); - feature.sendTestSourceRead(bus); + sendTestSourceRead(bus, feature); tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(4)), asList("**KEYWORD** ^Б$")); assertEquals("[ДопуÑтим ^Б$]", tracker.getSnippets().toString()); } @@ -138,7 +143,7 @@ private List locations(int line) { } private List locations() { - return Collections.emptyList(); + return Collections.emptyList(); } private String uri() { diff --git a/core/src/test/java/cucumber/runtime/formatter/UsageFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java similarity index 99% rename from core/src/test/java/cucumber/runtime/formatter/UsageFormatterTest.java rename to core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java index 8e23c1f875..eb1b0a269c 100644 --- a/core/src/test/java/cucumber/runtime/formatter/UsageFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.formatter; +package io.cucumber.core.plugin; import cucumber.api.PickleStepTestStep; import cucumber.api.Result; diff --git a/core/src/test/java/cucumber/runtime/MethodFormatTest.java b/core/src/test/java/io/cucumber/core/reflection/MethodFormatTest.java similarity index 89% rename from core/src/test/java/cucumber/runtime/MethodFormatTest.java rename to core/src/test/java/io/cucumber/core/reflection/MethodFormatTest.java index c491117e64..7efccef4dc 100644 --- a/core/src/test/java/cucumber/runtime/MethodFormatTest.java +++ b/core/src/test/java/io/cucumber/core/reflection/MethodFormatTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.reflection; import org.junit.Before; import org.junit.Test; @@ -41,6 +41,6 @@ public void shouldUseSimpleFormatWhenMethodHasNoException() { @Test public void prints_code_source() { String format = MethodFormat.FULL.format(methodWithoutArgs); - assertTrue(format.startsWith("cucumber.runtime.MethodFormatTest.methodWithoutArgs() in file:")); + assertTrue(format.startsWith("io.cucumber.core.reflection.MethodFormatTest.methodWithoutArgs() in file:")); } } diff --git a/core/src/test/java/io/cucumber/core/reflection/ReflectionsTest.java b/core/src/test/java/io/cucumber/core/reflection/ReflectionsTest.java new file mode 100644 index 0000000000..be7f9b74f8 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/reflection/ReflectionsTest.java @@ -0,0 +1,25 @@ +package io.cucumber.core.reflection; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class ReflectionsTest { + @Test + public void public_non_static_inner_classes_are_not_instantiable() { + assertFalse(Reflections.isInstantiable(NonStaticInnerClass.class)); + } + + @Test + public void public_static_inner_classes_are_instantiable() { + assertTrue(Reflections.isInstantiable(StaticInnerClass.class)); + } + + public class NonStaticInnerClass { + } + + public static class StaticInnerClass { + } + +} diff --git a/core/src/test/java/cucumber/runner/AmbiguousStepDefinitionMatchsTest.java b/core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java similarity index 97% rename from core/src/test/java/cucumber/runner/AmbiguousStepDefinitionMatchsTest.java rename to core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java index 20c9190596..298c59842a 100644 --- a/core/src/test/java/cucumber/runner/AmbiguousStepDefinitionMatchsTest.java +++ b/core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Scenario; import gherkin.pickles.Argument; diff --git a/core/src/test/java/cucumber/runner/GlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java similarity index 90% rename from core/src/test/java/cucumber/runner/GlueTest.java rename to core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index 115bfdeaf3..78ddcc792c 100644 --- a/core/src/test/java/cucumber/runner/GlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -1,16 +1,16 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.DuplicateStepDefinitionException; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinition; +import io.cucumber.core.backend.DuplicateStepDefinitionException; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; import gherkin.pickles.Argument; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; -import io.cucumber.stepexpression.ArgumentMatcher; -import io.cucumber.stepexpression.ExpressionArgumentMatcher; -import io.cucumber.stepexpression.StepExpression; -import io.cucumber.stepexpression.StepExpressionFactory; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.ArgumentMatcher; +import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; +import io.cucumber.core.stepexpression.StepExpression; +import io.cucumber.core.stepexpression.StepExpressionFactory; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; @@ -28,18 +28,18 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -public class GlueTest { +public class CachingGlueTest { - private Glue glue; + private CachingGlue glue; @Before public void setUp() { - glue = new Glue(); + glue = new CachingGlue(); } @Test public void throws_duplicate_error_on_dupe_stepdefs() { - Glue glue = new Glue(); + CachingGlue glue = new CachingGlue(); StepDefinition a = mock(StepDefinition.class); when(a.getPattern()).thenReturn("hello"); @@ -132,7 +132,7 @@ public void returns_match_from_cache_if_single_found() { verify(stepDefinition2).matchedArguments(pickleStep1); //check cache - Glue.CacheEntry entry = glue.matchedStepDefinitionsCache.get(stepText); + CachingGlue.CacheEntry entry = glue.matchedStepDefinitionsCache.get(stepText); assertEquals(stepDefinition1,entry.stepDefinition); PickleStep pickleStep2 = getPickleStep(stepText); diff --git a/core/src/test/java/cucumber/runner/EventBusTest.java b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java similarity index 97% rename from core/src/test/java/cucumber/runner/EventBusTest.java rename to core/src/test/java/io/cucumber/core/runner/EventBusTest.java index c320753ebb..0fd29825e3 100644 --- a/core/src/test/java/cucumber/runner/EventBusTest.java +++ b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.PickleStepTestStep; import cucumber.api.Result; diff --git a/core/src/test/java/cucumber/runner/FailedStepInstantiationMatchTest.java b/core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java similarity index 97% rename from core/src/test/java/cucumber/runner/FailedStepInstantiationMatchTest.java rename to core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java index 5926ae2641..3df5f3f76a 100644 --- a/core/src/test/java/cucumber/runner/FailedStepInstantiationMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Scenario; import gherkin.pickles.PickleLocation; diff --git a/core/src/test/java/cucumber/runner/HookOrderTest.java b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java similarity index 92% rename from core/src/test/java/cucumber/runner/HookOrderTest.java rename to core/src/test/java/io/cucumber/core/runner/HookOrderTest.java index 47ea997b8f..09904f73ba 100644 --- a/core/src/test/java/cucumber/runner/HookOrderTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java @@ -1,20 +1,17 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Scenario; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.StubStepDefinition; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runtime.StubStepDefinition; import gherkin.events.PickleEvent; import gherkin.pickles.Argument; import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.InOrder; @@ -47,7 +44,7 @@ public void before_hooks_execute_in_order() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override - public void loadGlue(cucumber.runtime.Glue glue, List gluePaths) { + public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(new StubStepDefinition("pattern1", new TypeRegistry(Locale.ENGLISH))); for (HookDefinition hook : hooks) { glue.addBeforeHook(hook); @@ -74,7 +71,7 @@ public void before_step_hooks_execute_in_order() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override - public void loadGlue(cucumber.runtime.Glue glue, List gluePaths) { + public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); for (HookDefinition hook : hooks) { glue.addBeforeStepHook(hook); @@ -101,7 +98,7 @@ public void after_hooks_execute_in_reverse_order() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override - public void loadGlue(cucumber.runtime.Glue glue, List gluePaths) { + public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); for (HookDefinition hook : hooks) { glue.addAfterHook(hook); @@ -128,7 +125,7 @@ public void after_step_hooks_execute_in_reverse_order() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override - public void loadGlue(cucumber.runtime.Glue glue, List gluePaths) { + public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); for (HookDefinition hook : hooks) { glue.addAfterStepHook(hook); diff --git a/core/src/test/java/cucumber/runner/HookTest.java b/core/src/test/java/io/cucumber/core/runner/HookTest.java similarity index 89% rename from core/src/test/java/cucumber/runner/HookTest.java rename to core/src/test/java/io/cucumber/core/runner/HookTest.java index 823d8687a8..2dae2c5312 100644 --- a/core/src/test/java/cucumber/runner/HookTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTest.java @@ -1,10 +1,10 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Scenario; -import cucumber.runtime.Backend; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.RuntimeOptions; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import gherkin.pickles.Argument; import gherkin.pickles.Pickle; @@ -47,7 +47,7 @@ public void after_hooks_execute_before_objects_are_disposed() throws Throwable { doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) { - cucumber.runtime.Glue glue = invocation.getArgument(0); + Glue glue = invocation.getArgument(0); glue.addBeforeHook(hook); return null; } diff --git a/core/src/test/java/cucumber/runner/HookTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java similarity index 96% rename from core/src/test/java/cucumber/runner/HookTestStepTest.java rename to core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java index e04615fb2d..825d3a9797 100644 --- a/core/src/test/java/cucumber/runner/HookTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java @@ -1,11 +1,10 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.HookType; import cucumber.api.Result; import cucumber.api.event.TestStepFinished; import cucumber.api.event.TestStepStarted; -import cucumber.runner.EventBus; -import cucumber.runtime.HookDefinition; +import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; import org.junit.Test; import org.mockito.InOrder; diff --git a/core/src/test/java/cucumber/runner/PickleStepTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java similarity index 99% rename from core/src/test/java/cucumber/runner/PickleStepTestStepTest.java rename to core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java index 805fffe07c..a72d3a922d 100644 --- a/core/src/test/java/cucumber/runner/PickleStepTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java @@ -1,11 +1,11 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.PendingException; import cucumber.api.Result; import cucumber.api.event.TestCaseEvent; import cucumber.api.event.TestStepFinished; import cucumber.api.event.TestStepStarted; -import cucumber.runtime.HookDefinition; +import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; import org.junit.AssumptionViolatedException; diff --git a/core/src/test/java/cucumber/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java similarity index 97% rename from core/src/test/java/cucumber/runner/RunnerTest.java rename to core/src/test/java/io/cucumber/core/runner/RunnerTest.java index b201c6e5d8..e1783d83d6 100644 --- a/core/src/test/java/cucumber/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -1,18 +1,18 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Scenario; -import cucumber.runtime.Backend; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.snippets.FunctionNameGenerator; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.InOrder; @@ -26,7 +26,6 @@ import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyListOf; import static org.mockito.Mockito.doAnswer; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; diff --git a/core/src/test/java/cucumber/runner/ScenarioResultTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java similarity index 99% rename from core/src/test/java/cucumber/runner/ScenarioResultTest.java rename to core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java index 63a9b7670f..2e1f4ecf85 100644 --- a/core/src/test/java/cucumber/runner/ScenarioResultTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Result; import cucumber.api.event.EmbedEvent; diff --git a/core/src/test/java/cucumber/runner/ScenarioTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java similarity index 98% rename from core/src/test/java/cucumber/runner/ScenarioTest.java rename to core/src/test/java/io/cucumber/core/runner/ScenarioTest.java index 5eefe99e8d..16e6475059 100644 --- a/core/src/test/java/cucumber/runner/ScenarioTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; @@ -13,7 +13,6 @@ import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class ScenarioTest { diff --git a/core/src/test/java/cucumber/runner/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runner/SingletonRunnerSupplierTest.java similarity index 80% rename from core/src/test/java/cucumber/runner/SingletonRunnerSupplierTest.java rename to core/src/test/java/io/cucumber/core/runner/SingletonRunnerSupplierTest.java index 477c03403d..c7cf5f8644 100644 --- a/core/src/test/java/cucumber/runner/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runner/SingletonRunnerSupplierTest.java @@ -1,12 +1,12 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.BackendModuleBackendSupplier; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; +import io.cucumber.core.runtime.BackendModuleBackendSupplier; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; import org.junit.Before; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runner/StepDefinitionMatchTest.java b/core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java similarity index 97% rename from core/src/test/java/cucumber/runner/StepDefinitionMatchTest.java rename to core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java index c93c9c7383..09ab99aee7 100644 --- a/core/src/test/java/cucumber/runner/StepDefinitionMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java @@ -1,9 +1,9 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.StepDefinitionMatch; -import cucumber.runtime.StubStepDefinition; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.backend.StepDefinitionMatch; +import io.cucumber.core.runtime.StubStepDefinition; +import io.cucumber.core.stepexpression.TypeRegistry; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleRow; @@ -13,7 +13,7 @@ import io.cucumber.cucumberexpressions.Transformer; import io.cucumber.datatable.DataTableType; import io.cucumber.datatable.TableCellTransformer; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.stepexpression.Argument; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; diff --git a/core/src/test/java/cucumber/runner/StepDurationTimeService.java b/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java similarity index 94% rename from core/src/test/java/cucumber/runner/StepDurationTimeService.java rename to core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java index 1847f017df..dd2b2b5520 100644 --- a/core/src/test/java/cucumber/runner/StepDurationTimeService.java +++ b/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java @@ -1,10 +1,9 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.event.EventHandler; import cucumber.api.event.EventListener; import cucumber.api.event.EventPublisher; import cucumber.api.event.TestStepStarted; -import cucumber.runner.TimeService; public class StepDurationTimeService implements TimeService, EventListener { private long stepDuration; diff --git a/core/src/test/java/cucumber/runner/TestBackendSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java similarity index 78% rename from core/src/test/java/cucumber/runner/TestBackendSupplier.java rename to core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java index b91001a264..5a60c8dd84 100644 --- a/core/src/test/java/cucumber/runner/TestBackendSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java @@ -1,8 +1,8 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.Backend; -import cucumber.runtime.BackendSupplier; -import cucumber.runtime.snippets.FunctionNameGenerator; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; import java.util.Collection; diff --git a/core/src/test/java/cucumber/runner/TestCaseTest.java b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java similarity index 98% rename from core/src/test/java/cucumber/runner/TestCaseTest.java rename to core/src/test/java/io/cucumber/core/runner/TestCaseTest.java index 76efeb2b33..244af946d0 100644 --- a/core/src/test/java/cucumber/runner/TestCaseTest.java +++ b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java @@ -1,9 +1,9 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Scenario; import cucumber.api.event.TestCaseFinished; import cucumber.api.event.TestCaseStarted; -import cucumber.runtime.HookDefinition; +import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; @@ -11,7 +11,6 @@ import org.junit.Test; import org.mockito.InOrder; -import java.util.Arrays; import java.util.Collections; import static cucumber.api.HookType.AfterStep; diff --git a/core/src/test/java/cucumber/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java similarity index 96% rename from core/src/test/java/cucumber/runner/TestHelper.java rename to core/src/test/java/io/cucumber/core/runner/TestHelper.java index 80d9937917..868fcc1a69 100644 --- a/core/src/test/java/cucumber/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.PendingException; import cucumber.api.Plugin; @@ -6,18 +6,15 @@ import cucumber.api.Scenario; import cucumber.api.event.ConcurrentEventListener; import cucumber.api.event.EventListener; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runtime.BackendSupplier; -import cucumber.runtime.FeatureSupplier; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.Runtime; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.StubStepDefinition; -import cucumber.runtime.io.ClasspathResourceLoader; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.runtime.FeatureSupplier; +import io.cucumber.core.runtime.Runtime; +import io.cucumber.core.runtime.StubStepDefinition; +import io.cucumber.core.io.ClasspathResourceLoader; +import io.cucumber.core.model.CucumberFeature; import gherkin.AstBuilder; import gherkin.Parser; import gherkin.TokenMatcher; @@ -29,7 +26,7 @@ import gherkin.pickles.PickleTable; import gherkin.pickles.PickleTag; import io.cucumber.datatable.DataTable; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import junit.framework.AssertionFailedError; import org.mockito.ArgumentMatchers; import org.mockito.invocation.InvocationOnMock; @@ -187,7 +184,7 @@ private static Type[] mapArgumentToTypes(PickleStep step) { return types; } - private static void mockHooks(cucumber.runtime.Glue glue, final List> hooks, + private static void mockHooks(Glue glue, final List> hooks, final List hookLocations, final List> hookActions) throws Throwable { List beforeHooks = new ArrayList<>(); @@ -385,9 +382,9 @@ public Builder withTimeServiceType(TimeServiceType timeServiceType) { } /** - * Specify a formatter under test, Formatter or ConcurrentFormatter + * Specify a plugin under test, Formatter or ConcurrentFormatter * - * @param formatter the formatter under test + * @param formatter the plugin under test * @return this instance */ public Builder withFormatterUnderTest(Object formatter) { diff --git a/core/src/test/java/cucumber/runner/TestRunnerSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java similarity index 64% rename from core/src/test/java/cucumber/runner/TestRunnerSupplier.java rename to core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java index 0d2c9d4fda..239d519c26 100644 --- a/core/src/test/java/cucumber/runner/TestRunnerSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java @@ -1,10 +1,12 @@ -package cucumber.runner; +package io.cucumber.core.runner; -import cucumber.runtime.Backend; -import cucumber.runtime.Glue; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.snippets.FunctionNameGenerator; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; +import io.cucumber.core.stepexpression.TypeRegistry; import java.util.Collections; import java.util.List; @@ -21,6 +23,12 @@ protected TestRunnerSupplier(EventBus bus, RuntimeOptions runtimeOptions) { this.runtimeOptions = runtimeOptions; } + + @SuppressWarnings("unused") // Used by reflection + public TestRunnerSupplier(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + this((EventBus) null, null); + } + @Override public void loadGlue(Glue glue, List gluePaths) { diff --git a/core/src/test/java/cucumber/runner/TimeServiceStub.java b/core/src/test/java/io/cucumber/core/runner/TimeServiceStub.java similarity index 87% rename from core/src/test/java/cucumber/runner/TimeServiceStub.java rename to core/src/test/java/io/cucumber/core/runner/TimeServiceStub.java index 647bc4f922..a70dc5b80d 100644 --- a/core/src/test/java/cucumber/runner/TimeServiceStub.java +++ b/core/src/test/java/io/cucumber/core/runner/TimeServiceStub.java @@ -1,6 +1,4 @@ -package cucumber.runner; - -import cucumber.runner.TimeService; +package io.cucumber.core.runner; public class TimeServiceStub implements TimeService { private final long duration; diff --git a/core/src/test/java/cucumber/runner/TimeServiceTest.java b/core/src/test/java/io/cucumber/core/runner/TimeServiceTest.java similarity index 95% rename from core/src/test/java/cucumber/runner/TimeServiceTest.java rename to core/src/test/java/io/cucumber/core/runner/TimeServiceTest.java index 0cf2f95fc6..cebf275b6e 100644 --- a/core/src/test/java/cucumber/runner/TimeServiceTest.java +++ b/core/src/test/java/io/cucumber/core/runner/TimeServiceTest.java @@ -1,8 +1,7 @@ -package cucumber.runner; +package io.cucumber.core.runner; import static org.junit.Assert.assertNull; -import cucumber.runner.TimeService; import org.junit.Test; public class TimeServiceTest { diff --git a/core/src/test/java/cucumber/runner/UndefinedStepDefinitionMatchTest.java b/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java similarity index 96% rename from core/src/test/java/cucumber/runner/UndefinedStepDefinitionMatchTest.java rename to core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java index 3481aaf72e..2a2a09acfc 100644 --- a/core/src/test/java/cucumber/runner/UndefinedStepDefinitionMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java @@ -1,4 +1,4 @@ -package cucumber.runner; +package io.cucumber.core.runner; import cucumber.api.Scenario; import gherkin.pickles.PickleStep; diff --git a/core/src/test/java/cucumber/runtime/BackendModuleBackendSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java similarity index 71% rename from core/src/test/java/cucumber/runtime/BackendModuleBackendSupplierTest.java rename to core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java index 920eab3312..b8630fa429 100644 --- a/core/src/test/java/cucumber/runtime/BackendModuleBackendSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java @@ -1,14 +1,19 @@ -package cucumber.runtime; - -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; +package io.cucumber.core.runtime; + +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.options.RuntimeOptions; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import java.util.Collections; +import static java.util.Collections.singletonList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; @@ -25,7 +30,7 @@ public void should_create_a_backend() { RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); + BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions, singletonList("io.cucumber.core.backend")); assertThat(backendSupplier.get().iterator().next(), is(notNullValue())); } @@ -35,7 +40,7 @@ public void should_throw_an_exception_when_no_backend_could_be_found() { RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions, Collections.singletonList("no.backend.here")); + BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions, singletonList("no.backend.here")); expectedException.expect(CucumberException.class); assertThat(backendSupplier.get().iterator().next(), is(notNullValue())); diff --git a/core/src/test/java/cucumber/runtime/ExitStatusTest.java b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java similarity index 96% rename from core/src/test/java/cucumber/runtime/ExitStatusTest.java rename to core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java index 356417e40a..e58a945555 100644 --- a/core/src/test/java/cucumber/runtime/ExitStatusTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java @@ -1,12 +1,13 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; import cucumber.api.Result; import cucumber.api.TestCase; import cucumber.api.event.TestCaseFinished; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; +import io.cucumber.core.runner.EventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.options.RuntimeOptions; import org.junit.Test; import static java.util.Arrays.asList; @@ -17,7 +18,7 @@ public class ExitStatusTest { private final static long ANY_TIMESTAMP = 1234567890; private EventBus bus; - private ExitStatus exitStatus; + private Runtime.ExitStatus exitStatus; @Test public void non_strict_wip_with_ambiguous_scenarios() { @@ -38,7 +39,7 @@ private TestCaseFinished testCaseFinishedWithStatus(Result.Type resultStatus) { private void createExitStatus(String... runtimeArgs) { RuntimeOptions runtimeOptions = new RuntimeOptions(asList(runtimeArgs)); this.bus = new TimeServiceEventBus(TimeService.SYSTEM); - exitStatus = new ExitStatus(runtimeOptions); + exitStatus = new Runtime.ExitStatus(runtimeOptions); exitStatus.setEventPublisher(bus); } diff --git a/core/src/test/java/cucumber/runtime/TimeoutTest.java b/core/src/test/java/io/cucumber/core/runtime/InvokerTest.java similarity index 89% rename from core/src/test/java/cucumber/runtime/TimeoutTest.java rename to core/src/test/java/io/cucumber/core/runtime/InvokerTest.java index edc127a567..0a64c020c4 100644 --- a/core/src/test/java/cucumber/runtime/TimeoutTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/InvokerTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; import org.junit.Test; @@ -11,11 +11,11 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -public class TimeoutTest { +public class InvokerTest { @Test public void doesnt_time_out_if_it_doesnt_take_too_long() throws Throwable { final Slow slow = new Slow(); - String what = Timeout.timeout(new Timeout.Callback() { + String what = Invoker.timeout(new Invoker.Callback() { @Override public String call() throws Throwable { return slow.slow(10); @@ -27,7 +27,7 @@ public String call() throws Throwable { @Test(expected = TimeoutException.class) public void times_out_if_it_takes_too_long() throws Throwable { final Slow slow = new Slow(); - Timeout.timeout(new Timeout.Callback() { + Invoker.timeout(new Invoker.Callback() { @Override public String call() throws Throwable { return slow.slow(100); @@ -39,7 +39,7 @@ public String call() throws Throwable { @Test(expected = TimeoutException.class) public void times_out_infinite_loop_if_it_takes_too_long() throws Throwable { final Slow slow = new Slow(); - Timeout.timeout(new Timeout.Callback() { + Invoker.timeout(new Invoker.Callback() { @Override public Void call() throws Throwable { slow.infinite(); @@ -52,7 +52,7 @@ public Void call() throws Throwable { @Test(expected = TimeoutException.class) public void times_out_infinite_latch_wait_if_it_takes_too_long() throws Throwable { final Slow slow = new Slow(); - Timeout.timeout(new Timeout.Callback() { + Invoker.timeout(new Invoker.Callback() { @Override public Void call() throws Throwable { slow.infiniteLatchWait(); @@ -66,7 +66,7 @@ public Void call() throws Throwable { @Test(expected = TimeoutException.class) public void times_out_busy_wait_if_it_takes_too_long() throws Throwable { final Slow slow = new Slow(); - Timeout.timeout(new Timeout.Callback() { + Invoker.timeout(new Invoker.Callback() { @Override public Void call() throws Throwable { slow.busyWait(); @@ -83,7 +83,7 @@ public void doesnt_leak_threads() throws Throwable { boolean cleanedUp = false; for (int i = 0; i < 1000; i++) { - Timeout.timeout(new Timeout.Callback() { + Invoker.timeout(new Invoker.Callback() { @Override public String call() throws Throwable { return null; diff --git a/core/src/test/java/cucumber/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java similarity index 95% rename from core/src/test/java/cucumber/runtime/RuntimeTest.java rename to core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index 0083c7ad67..63e85e90fd 100644 --- a/core/src/test/java/cucumber/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; import cucumber.api.HookType; import cucumber.api.Plugin; @@ -7,21 +7,26 @@ import cucumber.api.StepDefinitionReporter; import cucumber.api.TestCase; import cucumber.api.event.TestCaseFinished; -import cucumber.runner.EventBus; -import cucumber.runner.TestBackendSupplier; -import cucumber.runner.TestHelper; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runtime.formatter.FormatterBuilder; -import cucumber.runtime.formatter.FormatterSpy; -import cucumber.runtime.io.ClasspathResourceLoader; -import cucumber.runtime.io.Resource; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.runner.EventBus; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.runner.TestBackendSupplier; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.plugin.FormatterBuilder; +import io.cucumber.core.plugin.FormatterSpy; +import io.cucumber.core.io.ClasspathResourceLoader; +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.model.CucumberFeature; import gherkin.ast.ScenarioDefinition; import gherkin.ast.Step; import gherkin.pickles.PickleTag; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -36,8 +41,8 @@ import java.util.Locale; import java.util.Map; -import static cucumber.runner.TestHelper.feature; -import static cucumber.runner.TestHelper.result; +import static io.cucumber.core.runner.TestHelper.feature; +import static io.cucumber.core.runner.TestHelper.result; import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; @@ -258,7 +263,7 @@ public void loadGlue(Glue glue, List gluePaths) { Runtime.builder() .withResourceLoader(resourceLoader) - .withArgs("--plugin", "cucumber.runtime.RuntimeTest$StepdefsPrinter") + .withArgs("--plugin", "io.cucumber.core.runtime.RuntimeTest$StepdefsPrinter") .withBackendSupplier(testBackendSupplier) .build() .run(); diff --git a/core/src/test/java/cucumber/runtime/StubStepDefinition.java b/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java similarity index 80% rename from core/src/test/java/cucumber/runtime/StubStepDefinition.java rename to core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java index e2cb7e5767..67f65a497b 100644 --- a/core/src/test/java/cucumber/runtime/StubStepDefinition.java +++ b/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java @@ -1,12 +1,13 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; -import io.cucumber.stepexpression.TypeRegistry; -import io.cucumber.stepexpression.Argument; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.Argument; import gherkin.pickles.PickleStep; -import io.cucumber.stepexpression.ArgumentMatcher; -import io.cucumber.stepexpression.ExpressionArgumentMatcher; -import io.cucumber.stepexpression.StepExpression; -import io.cucumber.stepexpression.StepExpressionFactory; +import io.cucumber.core.stepexpression.ArgumentMatcher; +import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; +import io.cucumber.core.stepexpression.StepExpression; +import io.cucumber.core.stepexpression.StepExpressionFactory; import java.lang.reflect.Type; import java.util.Arrays; diff --git a/core/src/test/java/cucumber/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java similarity index 85% rename from core/src/test/java/cucumber/runtime/ThreadLocalRunnerSupplierTest.java rename to core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 5df7b16c5a..8f61d65e3b 100644 --- a/core/src/test/java/cucumber/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -1,16 +1,18 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; import cucumber.api.event.EventHandler; import cucumber.api.event.TestCaseStarted; -import cucumber.runner.EventBus; -import cucumber.runner.Runner; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; +import io.cucumber.core.runner.EventBus; +import io.cucumber.core.runner.Runner; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.options.RuntimeOptions; import org.junit.Before; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/snippets/ArgumentPatternTest.java b/core/src/test/java/io/cucumber/core/snippets/ArgumentPatternTest.java similarity index 95% rename from core/src/test/java/cucumber/runtime/snippets/ArgumentPatternTest.java rename to core/src/test/java/io/cucumber/core/snippets/ArgumentPatternTest.java index d85ba1d333..a6ed184bde 100644 --- a/core/src/test/java/cucumber/runtime/snippets/ArgumentPatternTest.java +++ b/core/src/test/java/io/cucumber/core/snippets/ArgumentPatternTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; import org.junit.Test; diff --git a/core/src/test/java/cucumber/runtime/snippets/FunctionNameGeneratorTest.java b/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java similarity index 98% rename from core/src/test/java/cucumber/runtime/snippets/FunctionNameGeneratorTest.java rename to core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java index 8d08028732..c0ddc5476d 100644 --- a/core/src/test/java/cucumber/runtime/snippets/FunctionNameGeneratorTest.java +++ b/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.snippets; +package io.cucumber.core.snippets; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/stepexpression/StepExpressionFactoryTest.java b/core/src/test/java/io/cucumber/core/stepexpression/StepExpressionFactoryTest.java similarity index 98% rename from core/src/test/java/io/cucumber/stepexpression/StepExpressionFactoryTest.java rename to core/src/test/java/io/cucumber/core/stepexpression/StepExpressionFactoryTest.java index c488d5c173..0bd7e9aeb9 100644 --- a/core/src/test/java/io/cucumber/stepexpression/StepExpressionFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/stepexpression/StepExpressionFactoryTest.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.datatable.DataTable; import io.cucumber.datatable.DataTableType; diff --git a/core/src/test/java/io/cucumber/stepexpression/TableParser.java b/core/src/test/java/io/cucumber/core/stepexpression/TableParser.java similarity index 90% rename from core/src/test/java/io/cucumber/stepexpression/TableParser.java rename to core/src/test/java/io/cucumber/core/stepexpression/TableParser.java index 028232ad47..2f9fbf911c 100644 --- a/core/src/test/java/io/cucumber/stepexpression/TableParser.java +++ b/core/src/test/java/io/cucumber/core/stepexpression/TableParser.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.datatable.DataTable; import io.cucumber.datatable.DataTable.TableConverter; @@ -11,7 +11,7 @@ import java.util.List; -import static io.cucumber.stepexpression.PickleTableConverter.toTable; +import static io.cucumber.core.stepexpression.PickleTableConverter.toTable; public class TableParser { diff --git a/core/src/test/resources/META-INF/services/cucumber.runtime.io.ResourceIteratorFactory b/core/src/test/resources/META-INF/services/cucumber.runtime.io.ResourceIteratorFactory deleted file mode 100644 index 432208d2b2..0000000000 --- a/core/src/test/resources/META-INF/services/cucumber.runtime.io.ResourceIteratorFactory +++ /dev/null @@ -1 +0,0 @@ -cucumber.runtime.io.TestResourceIteratorFactory diff --git a/core/src/test/resources/META-INF/services/io.cucumber.core.io.ResourceIteratorFactory b/core/src/test/resources/META-INF/services/io.cucumber.core.io.ResourceIteratorFactory new file mode 100644 index 0000000000..870ec1a23c --- /dev/null +++ b/core/src/test/resources/META-INF/services/io.cucumber.core.io.ResourceIteratorFactory @@ -0,0 +1 @@ +io.cucumber.core.io.TestResourceIteratorFactory diff --git a/core/src/test/resources/cucumber/runtime/bar.properties b/core/src/test/resources/io/cucumber/core/io/bar.properties similarity index 100% rename from core/src/test/resources/cucumber/runtime/bar.properties rename to core/src/test/resources/io/cucumber/core/io/bar.properties diff --git a/core/src/test/resources/cucumber/runtime/foo.properties b/core/src/test/resources/io/cucumber/core/io/foo.properties similarity index 100% rename from core/src/test/resources/cucumber/runtime/foo.properties rename to core/src/test/resources/io/cucumber/core/io/foo.properties diff --git a/core/src/test/resources/cucumber/runtime/has spaces.properties b/core/src/test/resources/io/cucumber/core/io/has spaces.properties similarity index 100% rename from core/src/test/resources/cucumber/runtime/has spaces.properties rename to core/src/test/resources/io/cucumber/core/io/has spaces.properties diff --git a/core/src/test/resources/cucumber/runtime/formatter/FormatterInParallel.feature b/core/src/test/resources/io/cucumber/core/plugin/FormatterInParallel.feature similarity index 100% rename from core/src/test/resources/cucumber/runtime/formatter/FormatterInParallel.feature rename to core/src/test/resources/io/cucumber/core/plugin/FormatterInParallel.feature diff --git a/core/src/test/resources/cucumber/runtime/formatter/HTMLFormatterTest.feature b/core/src/test/resources/io/cucumber/core/plugin/HTMLFormatterTest.feature similarity index 100% rename from core/src/test/resources/cucumber/runtime/formatter/HTMLFormatterTest.feature rename to core/src/test/resources/io/cucumber/core/plugin/HTMLFormatterTest.feature diff --git a/core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.feature b/core/src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.feature similarity index 100% rename from core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.feature rename to core/src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.feature diff --git a/core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.json b/core/src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.json similarity index 99% rename from core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.json rename to core/src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.json index edcccf5915..1ee24c5527 100644 --- a/core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.json +++ b/core/src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.json @@ -344,7 +344,7 @@ "type": "scenario" } ], - "uri": "cucumber/runtime/formatter/JSONPrettyFormatterTest.feature", + "uri": "io/cucumber/core/plugin/JSONPrettyFormatterTest.feature", "tags": [] } ] \ No newline at end of file diff --git a/core/src/test/resources/cucumber/runtime/formatter/JUnitFormatterTest_1.feature b/core/src/test/resources/io/cucumber/core/plugin/JUnitFormatterTest_1.feature similarity index 100% rename from core/src/test/resources/cucumber/runtime/formatter/JUnitFormatterTest_1.feature rename to core/src/test/resources/io/cucumber/core/plugin/JUnitFormatterTest_1.feature diff --git a/core/src/test/resources/cucumber/runtime/formatter/JUnitFormatterTest_1.report.xml b/core/src/test/resources/io/cucumber/core/plugin/JUnitFormatterTest_1.report.xml similarity index 88% rename from core/src/test/resources/cucumber/runtime/formatter/JUnitFormatterTest_1.report.xml rename to core/src/test/resources/io/cucumber/core/plugin/JUnitFormatterTest_1.report.xml index 1f37c70ccd..4874af0802 100644 --- a/core/src/test/resources/cucumber/runtime/formatter/JUnitFormatterTest_1.report.xml +++ b/core/src/test/resources/io/cucumber/core/plugin/JUnitFormatterTest_1.report.xml @@ -1,5 +1,5 @@ - + - + - + - + Date: Fri, 31 Aug 2018 19:37:15 +0200 Subject: [PATCH 002/155] [JUnit] Introduce new package structure --- .../java/cucumber/api/junit/Cucumber.java | 58 +++++++++---------- .../cucumber}/junit/Assertions.java | 4 +- .../cucumber}/junit/FeatureRunner.java | 23 ++++---- .../cucumber}/junit/JUnitOptions.java | 8 +-- .../cucumber}/junit/JUnitReporter.java | 8 +-- .../cucumber}/junit/NotificationLevel.java | 2 +- .../cucumber}/junit/PickleRunners.java | 6 +- .../cucumber}/junit/SanityChecker.java | 2 +- .../cucumber}/junit/SkippedThrowable.java | 2 +- .../cucumber}/junit/UndefinedThrowable.java | 2 +- .../cucumber}/junit/CucumberTest.java | 13 ++--- .../cucumber}/junit/DescriptionMatcher.java | 2 +- .../cucumber}/junit/FailureMatcher.java | 2 +- .../cucumber}/junit/FeatureRunnerTest.java | 28 ++++----- .../cucumber}/junit/JUnitReporterTest.java | 10 ++-- ...ickleRunnerWithNoStepDescriptionsTest.java | 6 +- .../PickleRunnerWithStepDescriptionsTest.java | 12 ++-- .../cucumber}/junit/RunCukesTest.java | 2 +- .../RunCukesTestNoStepNotifications.java | 2 +- .../cucumber}/junit/SanityTest.java | 2 +- .../cucumber}/junit/TestPickleBuilder.java | 4 +- .../cucumber/junit}/stub/StubBackend.java | 18 +++--- .../cucumber}/error/lexer_error.feature | 0 .../runtime => io/cucumber}/junit/fa.feature | 0 .../runtime => io/cucumber}/junit/fb.feature | 0 25 files changed, 106 insertions(+), 110 deletions(-) rename junit/src/main/java/{cucumber/runtime => io/cucumber}/junit/Assertions.java (93%) rename junit/src/main/java/{cucumber/runtime => io/cucumber}/junit/FeatureRunner.java (87%) rename junit/src/main/java/{cucumber/runtime => io/cucumber}/junit/JUnitOptions.java (91%) rename junit/src/main/java/{cucumber/runtime => io/cucumber}/junit/JUnitReporter.java (98%) rename junit/src/main/java/{cucumber/runtime => io/cucumber}/junit/NotificationLevel.java (80%) rename junit/src/main/java/{cucumber/runtime => io/cucumber}/junit/PickleRunners.java (98%) rename junit/src/main/java/{cucumber/runtime => io/cucumber}/junit/SanityChecker.java (98%) rename junit/src/main/java/{cucumber/runtime => io/cucumber}/junit/SkippedThrowable.java (89%) rename junit/src/main/java/{cucumber/runtime => io/cucumber}/junit/UndefinedThrowable.java (91%) rename junit/src/test/java/{cucumber/runtime => io/cucumber}/junit/CucumberTest.java (93%) rename junit/src/test/java/{cucumber/runtime => io/cucumber}/junit/DescriptionMatcher.java (92%) rename junit/src/test/java/{cucumber/runtime => io/cucumber}/junit/FailureMatcher.java (92%) rename junit/src/test/java/{cucumber/runtime => io/cucumber}/junit/FeatureRunnerTest.java (96%) rename junit/src/test/java/{cucumber/runtime => io/cucumber}/junit/JUnitReporterTest.java (98%) rename junit/src/test/java/{cucumber/runtime => io/cucumber}/junit/PickleRunnerWithNoStepDescriptionsTest.java (93%) rename junit/src/test/java/{cucumber/runtime => io/cucumber}/junit/PickleRunnerWithStepDescriptionsTest.java (96%) rename junit/src/test/java/{cucumber/runtime => io/cucumber}/junit/RunCukesTest.java (79%) rename junit/src/test/java/{cucumber/runtime => io/cucumber}/junit/RunCukesTestNoStepNotifications.java (87%) rename junit/src/test/java/{cucumber/runtime => io/cucumber}/junit/SanityTest.java (93%) rename junit/src/test/java/{cucumber/runtime => io/cucumber}/junit/TestPickleBuilder.java (93%) rename junit/src/test/java/{cucumber/runtime => io/cucumber/junit}/stub/StubBackend.java (86%) rename junit/src/test/resources/{cucumber/runtime => io/cucumber}/error/lexer_error.feature (100%) rename junit/src/test/resources/{cucumber/runtime => io/cucumber}/junit/fa.feature (100%) rename junit/src/test/resources/{cucumber/runtime => io/cucumber}/junit/fb.feature (100%) diff --git a/junit/src/main/java/cucumber/api/junit/Cucumber.java b/junit/src/main/java/cucumber/api/junit/Cucumber.java index 39b2eeab10..d8c5b795ce 100644 --- a/junit/src/main/java/cucumber/api/junit/Cucumber.java +++ b/junit/src/main/java/cucumber/api/junit/Cucumber.java @@ -4,28 +4,28 @@ import cucumber.api.StepDefinitionReporter; import cucumber.api.event.TestRunFinished; import cucumber.api.event.TestRunStarted; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runtime.BackendModuleBackendSupplier; -import cucumber.runtime.BackendSupplier; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.FeaturePathFeatureSupplier; -import cucumber.runtime.filter.Filters; -import cucumber.runtime.formatter.Plugins; -import cucumber.runtime.filter.RerunFilters; -import cucumber.runtime.formatter.PluginFactory; -import cucumber.runtime.model.FeatureLoader; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.RuntimeOptionsFactory; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; -import cucumber.runtime.junit.Assertions; -import cucumber.runtime.junit.FeatureRunner; -import cucumber.runtime.junit.JUnitOptions; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.junit.Assertions; +import io.cucumber.junit.FeatureRunner; +import io.cucumber.junit.JUnitOptions; +import io.cucumber.core.runner.EventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runtime.BackendModuleBackendSupplier; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.runtime.FeaturePathFeatureSupplier; +import io.cucumber.core.filter.Filters; +import io.cucumber.core.plugin.Plugins; +import io.cucumber.core.filter.RerunFilters; +import io.cucumber.core.plugin.PluginFactory; +import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.options.RuntimeOptionsFactory; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.model.CucumberFeature; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -48,7 +48,7 @@ * @CucumberOptions(plugin = "pretty") * public class RunCukesTest { * } -Fail * + * Fail * *

* Cucumber will look for a {@code .feature} file on the classpath, using the same resource * path as the annotated class ({@code .class} substituted by {@code .feature}). @@ -83,15 +83,14 @@ public Cucumber(Class clazz) throws InitializationError { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(clazz); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); + this.bus = new TimeServiceEventBus(TimeService.SYSTEM); + ResourceLoader resourceLoader = new MultiLoader(classLoader); FeatureLoader featureLoader = new FeatureLoader(resourceLoader); - FeaturePathFeatureSupplier featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions); - // Parse the features early. Don't proceed when there are lexer errors - final List features = featureSupplier.get(); + FeaturePathFeatureSupplier featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions, bus); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); - this.bus = new TimeServiceEventBus(TimeService.SYSTEM); Plugins plugins = new Plugins(classLoader, new PluginFactory(), bus, runtimeOptions); this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); RerunFilters rerunFilters = new RerunFilters(runtimeOptions, featureLoader); @@ -102,11 +101,8 @@ public Cucumber(Class clazz) throws InitializationError { // Start the run before reading the features. // Allows the test source read events to be broadcast properly bus.send(new TestRunStarted(bus.getTime())); - for (CucumberFeature feature : features) { - feature.sendTestSourceRead(bus); - } + addChildren(featureSupplier.get()); runnerSupplier.get().reportStepDefinitions(stepDefinitionReporter); - addChildren(features); } @Override diff --git a/junit/src/main/java/cucumber/runtime/junit/Assertions.java b/junit/src/main/java/io/cucumber/junit/Assertions.java similarity index 93% rename from junit/src/main/java/cucumber/runtime/junit/Assertions.java rename to junit/src/main/java/io/cucumber/junit/Assertions.java index e7cb7d5835..36824bac86 100644 --- a/junit/src/main/java/cucumber/runtime/junit/Assertions.java +++ b/junit/src/main/java/io/cucumber/junit/Assertions.java @@ -1,6 +1,6 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import java.lang.annotation.Annotation; import java.lang.reflect.Method; diff --git a/junit/src/main/java/cucumber/runtime/junit/FeatureRunner.java b/junit/src/main/java/io/cucumber/junit/FeatureRunner.java similarity index 87% rename from junit/src/main/java/cucumber/runtime/junit/FeatureRunner.java rename to junit/src/main/java/io/cucumber/junit/FeatureRunner.java index 61b8686617..4e3b8c77a1 100644 --- a/junit/src/main/java/cucumber/runtime/junit/FeatureRunner.java +++ b/junit/src/main/java/io/cucumber/junit/FeatureRunner.java @@ -1,13 +1,13 @@ -package cucumber.runtime.junit; - -import cucumber.runtime.CucumberException; -import cucumber.runtime.FeatureCompiler; -import cucumber.runtime.filter.Filters; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.junit.PickleRunners.PickleRunner; -import cucumber.runtime.model.CucumberFeature; +package io.cucumber.junit; + import gherkin.ast.Feature; import gherkin.events.PickleEvent; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.filter.Filters; +import io.cucumber.junit.PickleRunners.PickleRunner; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.model.FeatureCompiler; +import io.cucumber.core.runner.ThreadLocalRunnerSupplier; import org.junit.runner.Description; import org.junit.runner.notification.RunNotifier; import org.junit.runners.ParentRunner; @@ -17,11 +17,12 @@ import java.util.ArrayList; import java.util.List; -import static cucumber.runtime.junit.PickleRunners.withNoStepDescriptions; -import static cucumber.runtime.junit.PickleRunners.withStepDescriptions; +import static io.cucumber.junit.PickleRunners.withNoStepDescriptions; +import static io.cucumber.junit.PickleRunners.withStepDescriptions; + public class FeatureRunner extends ParentRunner { - private final List children = new ArrayList(); + private final List children = new ArrayList<>(); private final CucumberFeature cucumberFeature; private Description description; diff --git a/junit/src/main/java/cucumber/runtime/junit/JUnitOptions.java b/junit/src/main/java/io/cucumber/junit/JUnitOptions.java similarity index 91% rename from junit/src/main/java/cucumber/runtime/junit/JUnitOptions.java rename to junit/src/main/java/io/cucumber/junit/JUnitOptions.java index ff012cc6de..8ea80d3562 100644 --- a/junit/src/main/java/cucumber/runtime/junit/JUnitOptions.java +++ b/junit/src/main/java/io/cucumber/junit/JUnitOptions.java @@ -1,7 +1,7 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; -import cucumber.runtime.CucumberException; -import cucumber.util.FixJava; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.util.FixJava; import java.io.InputStreamReader; import java.io.Reader; @@ -26,7 +26,7 @@ public class JUnitOptions { */ public JUnitOptions(boolean strict, List argv) { this.strict = strict; - argv = new ArrayList(argv); // in case the one passed in is unmodifiable. + argv = new ArrayList<>(argv); // in case the one passed in is unmodifiable. parse(argv); } diff --git a/junit/src/main/java/cucumber/runtime/junit/JUnitReporter.java b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java similarity index 98% rename from junit/src/main/java/cucumber/runtime/junit/JUnitReporter.java rename to junit/src/main/java/io/cucumber/junit/JUnitReporter.java index 56dd204fec..87db029adc 100644 --- a/junit/src/main/java/cucumber/runtime/junit/JUnitReporter.java +++ b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; import cucumber.api.Result; import cucumber.api.PickleStepTestStep; @@ -7,8 +7,8 @@ import cucumber.api.event.TestCaseStarted; import cucumber.api.event.TestStepFinished; import cucumber.api.event.TestStepStarted; -import cucumber.runner.EventBus; -import cucumber.runtime.junit.PickleRunners.PickleRunner; +import io.cucumber.junit.PickleRunners.PickleRunner; +import io.cucumber.core.runner.EventBus; import org.junit.runner.Description; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; @@ -16,7 +16,7 @@ import java.util.ArrayList; -public class JUnitReporter { +class JUnitReporter { private final JUnitOptions junitOptions; private final EventBus bus; diff --git a/junit/src/main/java/cucumber/runtime/junit/NotificationLevel.java b/junit/src/main/java/io/cucumber/junit/NotificationLevel.java similarity index 80% rename from junit/src/main/java/cucumber/runtime/junit/NotificationLevel.java rename to junit/src/main/java/io/cucumber/junit/NotificationLevel.java index 0b527e80d2..a3ac37151b 100644 --- a/junit/src/main/java/cucumber/runtime/junit/NotificationLevel.java +++ b/junit/src/main/java/io/cucumber/junit/NotificationLevel.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; public enum NotificationLevel { SCENARIO, diff --git a/junit/src/main/java/cucumber/runtime/junit/PickleRunners.java b/junit/src/main/java/io/cucumber/junit/PickleRunners.java similarity index 98% rename from junit/src/main/java/cucumber/runtime/junit/PickleRunners.java rename to junit/src/main/java/io/cucumber/junit/PickleRunners.java index 7efe1c241a..351d216293 100644 --- a/junit/src/main/java/cucumber/runtime/junit/PickleRunners.java +++ b/junit/src/main/java/io/cucumber/junit/PickleRunners.java @@ -1,7 +1,7 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; -import cucumber.runner.Runner; -import cucumber.runner.RunnerSupplier; +import io.cucumber.core.runner.Runner; +import io.cucumber.core.runner.RunnerSupplier; import gherkin.events.PickleEvent; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; diff --git a/junit/src/main/java/cucumber/runtime/junit/SanityChecker.java b/junit/src/main/java/io/cucumber/junit/SanityChecker.java similarity index 98% rename from junit/src/main/java/cucumber/runtime/junit/SanityChecker.java rename to junit/src/main/java/io/cucumber/junit/SanityChecker.java index 86cde39852..7884d46221 100644 --- a/junit/src/main/java/cucumber/runtime/junit/SanityChecker.java +++ b/junit/src/main/java/io/cucumber/junit/SanityChecker.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; import junit.framework.AssertionFailedError; import junit.framework.JUnit4TestAdapter; diff --git a/junit/src/main/java/cucumber/runtime/junit/SkippedThrowable.java b/junit/src/main/java/io/cucumber/junit/SkippedThrowable.java similarity index 89% rename from junit/src/main/java/cucumber/runtime/junit/SkippedThrowable.java rename to junit/src/main/java/io/cucumber/junit/SkippedThrowable.java index 409de0e3e2..3ddb734e8a 100644 --- a/junit/src/main/java/cucumber/runtime/junit/SkippedThrowable.java +++ b/junit/src/main/java/io/cucumber/junit/SkippedThrowable.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; class SkippedThrowable extends Throwable { private static final long serialVersionUID = 1L; diff --git a/junit/src/main/java/cucumber/runtime/junit/UndefinedThrowable.java b/junit/src/main/java/io/cucumber/junit/UndefinedThrowable.java similarity index 91% rename from junit/src/main/java/cucumber/runtime/junit/UndefinedThrowable.java rename to junit/src/main/java/io/cucumber/junit/UndefinedThrowable.java index e6d687cf1e..4487e4464f 100644 --- a/junit/src/main/java/cucumber/runtime/junit/UndefinedThrowable.java +++ b/junit/src/main/java/io/cucumber/junit/UndefinedThrowable.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; public class UndefinedThrowable extends Throwable { diff --git a/junit/src/test/java/cucumber/runtime/junit/CucumberTest.java b/junit/src/test/java/io/cucumber/junit/CucumberTest.java similarity index 93% rename from junit/src/test/java/cucumber/runtime/junit/CucumberTest.java rename to junit/src/test/java/io/cucumber/junit/CucumberTest.java index e2733cfe22..6aa38ee511 100644 --- a/junit/src/test/java/cucumber/runtime/junit/CucumberTest.java +++ b/junit/src/test/java/io/cucumber/junit/CucumberTest.java @@ -1,9 +1,9 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; import cucumber.annotation.DummyWhen; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -18,7 +18,6 @@ import org.mockito.Mockito; import java.io.File; -import java.io.IOException; import java.util.List; import static java.util.Collections.emptyList; @@ -147,7 +146,7 @@ public void cucumber_can_run_pickles_in_parallel() throws Exception { public void cucumber_returns_description_tree_with_features_and_pickles() throws InitializationError { Description description = new Cucumber(RunCukesTestValidEmpty.class).getDescription(); - assertThat(description.getDisplayName(), is("cucumber.runtime.junit.CucumberTest$RunCukesTestValidEmpty")); + assertThat(description.getDisplayName(), is("io.cucumber.junit.CucumberTest$RunCukesTestValidEmpty")); Description feature = description.getChildren().get(0); assertThat(feature.getDisplayName(), is("Feature: Feature A")); Description pickle = feature.getChildren().get(0); @@ -186,7 +185,7 @@ public void no_stepdefs_in_cucumber_runner_invalid() { public class ImplicitFeatureAndGluePath { } - @CucumberOptions(features = {"classpath:cucumber/runtime/junit"}) + @CucumberOptions(features = {"classpath:io/cucumber/junit"}) public class ExplicitFeaturePath { } @@ -194,12 +193,12 @@ public class ExplicitFeaturePath { public class ExplicitFeaturePathWithNoFeatures { } - @CucumberOptions(features = {"classpath:cucumber/runtime/error/lexer_error.feature"}) + @CucumberOptions(features = {"classpath:io/cucumber/error/lexer_error.feature"}) public class LexerErrorFeature { } - @CucumberOptions(features = {"classpath:cucumber/runtime/error/lexer_error.feature"}, plugin = {"json:lexor_error_feature.json"}) + @CucumberOptions(features = {"classpath:io/cucumber/error/lexer_error.feature"}, plugin = {"json:target/lexor_error_feature.json"}) public class FormatterWithLexerErrorFeature { } diff --git a/junit/src/test/java/cucumber/runtime/junit/DescriptionMatcher.java b/junit/src/test/java/io/cucumber/junit/DescriptionMatcher.java similarity index 92% rename from junit/src/test/java/cucumber/runtime/junit/DescriptionMatcher.java rename to junit/src/test/java/io/cucumber/junit/DescriptionMatcher.java index 1f9647c2e3..bd41aa4fb0 100644 --- a/junit/src/test/java/cucumber/runtime/junit/DescriptionMatcher.java +++ b/junit/src/test/java/io/cucumber/junit/DescriptionMatcher.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; import org.junit.runner.Description; import org.mockito.ArgumentMatcher; diff --git a/junit/src/test/java/cucumber/runtime/junit/FailureMatcher.java b/junit/src/test/java/io/cucumber/junit/FailureMatcher.java similarity index 92% rename from junit/src/test/java/cucumber/runtime/junit/FailureMatcher.java rename to junit/src/test/java/io/cucumber/junit/FailureMatcher.java index c3377221cf..7ff6ae5f87 100644 --- a/junit/src/test/java/cucumber/runtime/junit/FailureMatcher.java +++ b/junit/src/test/java/io/cucumber/junit/FailureMatcher.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; import org.junit.runner.notification.Failure; import org.mockito.ArgumentMatcher; diff --git a/junit/src/test/java/cucumber/runtime/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java similarity index 96% rename from junit/src/test/java/cucumber/runtime/junit/FeatureRunnerTest.java rename to junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index b531914d13..2ab32729f3 100644 --- a/junit/src/test/java/cucumber/runtime/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -1,17 +1,17 @@ -package cucumber.runtime.junit; - -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runtime.Backend; -import cucumber.runtime.BackendSupplier; -import cucumber.runtime.RuntimeOptions; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.filter.Filters; -import cucumber.runtime.filter.RerunFilters; -import cucumber.runtime.io.ClasspathResourceLoader; -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.model.FeatureLoader; +package io.cucumber.junit; + +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.runner.EventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.core.filter.Filters; +import io.cucumber.core.filter.RerunFilters; +import io.cucumber.core.io.ClasspathResourceLoader; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.model.FeatureLoader; import org.junit.Test; import org.junit.runner.Description; import org.junit.runner.notification.RunNotifier; diff --git a/junit/src/test/java/cucumber/runtime/junit/JUnitReporterTest.java b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java similarity index 98% rename from junit/src/test/java/cucumber/runtime/junit/JUnitReporterTest.java rename to junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java index 91fdbe2053..028e6be609 100644 --- a/junit/src/test/java/cucumber/runtime/junit/JUnitReporterTest.java +++ b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java @@ -1,12 +1,12 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; import cucumber.api.PendingException; import cucumber.api.Result; import cucumber.api.PickleStepTestStep; -import cucumber.runner.EventBus; -import cucumber.runtime.junit.JUnitReporter.EachTestNotifier; -import cucumber.runtime.junit.JUnitReporter.NoTestNotifier; -import cucumber.runtime.junit.PickleRunners.PickleRunner; +import io.cucumber.core.runner.EventBus; +import io.cucumber.junit.JUnitReporter.EachTestNotifier; +import io.cucumber.junit.JUnitReporter.NoTestNotifier; +import io.cucumber.junit.PickleRunners.PickleRunner; import gherkin.pickles.PickleStep; import org.junit.AssumptionViolatedException; import org.junit.Test; diff --git a/junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithNoStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java similarity index 93% rename from junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithNoStepDescriptionsTest.java rename to junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java index 835a0e6b51..6839d963d6 100644 --- a/junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithNoStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java @@ -1,10 +1,10 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.junit.PickleRunners.PickleRunner; +import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.junit.PickleRunners.PickleRunner; import gherkin.events.PickleEvent; import org.junit.Test; diff --git a/junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java similarity index 96% rename from junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithStepDescriptionsTest.java rename to junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java index 04989133a3..7a33893416 100644 --- a/junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java @@ -1,14 +1,14 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.mockito.Mockito.mock; -import cucumber.runtime.FeatureCompiler; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.junit.PickleRunners.PickleRunner; -import cucumber.runtime.junit.PickleRunners.WithStepDescriptions; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.model.FeatureCompiler; +import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.junit.PickleRunners.PickleRunner; +import io.cucumber.junit.PickleRunners.WithStepDescriptions; +import io.cucumber.core.model.CucumberFeature; import gherkin.events.PickleEvent; import gherkin.pickles.Compiler; import gherkin.pickles.Pickle; diff --git a/junit/src/test/java/cucumber/runtime/junit/RunCukesTest.java b/junit/src/test/java/io/cucumber/junit/RunCukesTest.java similarity index 79% rename from junit/src/test/java/cucumber/runtime/junit/RunCukesTest.java rename to junit/src/test/java/io/cucumber/junit/RunCukesTest.java index f1bf13352c..6d23149108 100644 --- a/junit/src/test/java/cucumber/runtime/junit/RunCukesTest.java +++ b/junit/src/test/java/io/cucumber/junit/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/junit/src/test/java/cucumber/runtime/junit/RunCukesTestNoStepNotifications.java b/junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java similarity index 87% rename from junit/src/test/java/cucumber/runtime/junit/RunCukesTestNoStepNotifications.java rename to junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java index eb0a4f77d4..ec5dc5fdd1 100644 --- a/junit/src/test/java/cucumber/runtime/junit/RunCukesTestNoStepNotifications.java +++ b/junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; diff --git a/junit/src/test/java/cucumber/runtime/junit/SanityTest.java b/junit/src/test/java/io/cucumber/junit/SanityTest.java similarity index 93% rename from junit/src/test/java/cucumber/runtime/junit/SanityTest.java rename to junit/src/test/java/io/cucumber/junit/SanityTest.java index 0af9c28be6..f0ca993f79 100644 --- a/junit/src/test/java/cucumber/runtime/junit/SanityTest.java +++ b/junit/src/test/java/io/cucumber/junit/SanityTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; import org.junit.Test; diff --git a/junit/src/test/java/cucumber/runtime/junit/TestPickleBuilder.java b/junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java similarity index 93% rename from junit/src/test/java/cucumber/runtime/junit/TestPickleBuilder.java rename to junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java index 214eb2c808..bcf4799b33 100644 --- a/junit/src/test/java/cucumber/runtime/junit/TestPickleBuilder.java +++ b/junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java @@ -1,6 +1,6 @@ -package cucumber.runtime.junit; +package io.cucumber.junit; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.model.CucumberFeature; import gherkin.AstBuilder; import gherkin.Parser; import gherkin.TokenMatcher; diff --git a/junit/src/test/java/cucumber/runtime/stub/StubBackend.java b/junit/src/test/java/io/cucumber/junit/stub/StubBackend.java similarity index 86% rename from junit/src/test/java/cucumber/runtime/stub/StubBackend.java rename to junit/src/test/java/io/cucumber/junit/stub/StubBackend.java index 2f1b2cb691..18855641e4 100644 --- a/junit/src/test/java/cucumber/runtime/stub/StubBackend.java +++ b/junit/src/test/java/io/cucumber/junit/stub/StubBackend.java @@ -1,12 +1,12 @@ -package cucumber.runtime.stub; - -import cucumber.runtime.StepDefinition; -import io.cucumber.stepexpression.Argument; -import io.cucumber.stepexpression.TypeRegistry; -import cucumber.runtime.Backend; -import cucumber.runtime.Glue; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.snippets.FunctionNameGenerator; +package io.cucumber.junit.stub; + +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; import java.util.Collections; diff --git a/junit/src/test/resources/cucumber/runtime/error/lexer_error.feature b/junit/src/test/resources/io/cucumber/error/lexer_error.feature similarity index 100% rename from junit/src/test/resources/cucumber/runtime/error/lexer_error.feature rename to junit/src/test/resources/io/cucumber/error/lexer_error.feature diff --git a/junit/src/test/resources/cucumber/runtime/junit/fa.feature b/junit/src/test/resources/io/cucumber/junit/fa.feature similarity index 100% rename from junit/src/test/resources/cucumber/runtime/junit/fa.feature rename to junit/src/test/resources/io/cucumber/junit/fa.feature diff --git a/junit/src/test/resources/cucumber/runtime/junit/fb.feature b/junit/src/test/resources/io/cucumber/junit/fb.feature similarity index 100% rename from junit/src/test/resources/cucumber/runtime/junit/fb.feature rename to junit/src/test/resources/io/cucumber/junit/fb.feature From a0d2f67d104e0461b5e57f18a82bf437cdfb19f6 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 19:37:35 +0200 Subject: [PATCH 003/155] [Java] Introduce new package structure --- java/src/main/code_generator/I18n.java.txt | 2 +- .../cucumber}/java/AbstractJavaSnippet.java | 4 +- .../java/DefaultJavaObjectFactory.java | 7 +-- .../cucumber}/java/Function.java | 2 +- .../cucumber}/java/Java8Snippet.java | 2 +- .../cucumber}/java/JavaBackend.java | 39 +++++++------ .../cucumber}/java/JavaHookDefinition.java | 14 ++--- .../cucumber}/java/JavaSnippet.java | 2 +- .../cucumber}/java/JavaStepDefinition.java | 22 +++---- .../cucumber}/java/LambdaGlueRegistry.java | 8 +-- .../cucumber}/java/MethodScanner.java | 12 ++-- .../cucumber}/java/ObjectFactoryLoader.java | 14 ++--- .../cucumber}/java/ParameterInfo.java | 2 +- .../java/io/cucumber/java/StaticGlue.java | 57 +++++++++++++++++++ .../cucumber}/java/StepDefAnnotation.java | 2 +- .../SubclassesStepdefs.java | 6 -- .../cucumber}/java/Java8SnippetTest.java | 4 +- .../cucumber}/java/JavaBackendTest.java | 27 ++++----- .../cucumber}/java/JavaHookTest.java | 18 +++--- .../cucumber}/java/JavaObjectFactoryTest.java | 2 +- .../cucumber}/java/JavaSnippetTest.java | 10 ++-- .../java/JavaStepDefinitionTest.java | 30 +++++----- .../java/JavaStepDefinitionTransposeTest.java | 8 +-- .../cucumber}/java/MethodScannerTest.java | 18 +++--- .../cucumber}/java/SingletonFactory.java | 2 +- .../cucumber}/java/StringJoiner.java | 2 +- .../SubclassesStepdefs.java | 6 ++ .../cucumber}/java/stepdefs/Stepdefs.java | 2 +- .../cucumber}/java/test/Authors.java | 2 +- .../cucumber}/java/test/RunCukesTest.java | 2 +- .../cucumber}/java/test/ScenarioStepDefs.java | 2 +- .../cucumber}/java/test/Stepdefs.java | 2 +- .../java/test/SubstitutionStepdefs.java | 2 +- .../java/test/TypeRegistryConfiguration.java | 13 ++--- .../cucumber}/java/test/UnusedGlue.java | 2 +- .../cucumber}/java/test/authors.feature | 0 .../cucumber}/java/test/cukes.feature | 0 .../java/test/french-iso-8859-1-cukes.feature | 0 .../cucumber}/java/test/scenario.feature | 0 .../scenario_outline_substitution.feature | 0 .../java/test/table_conversion.feature | 0 41 files changed, 200 insertions(+), 149 deletions(-) rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/AbstractJavaSnippet.java (95%) rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/DefaultJavaObjectFactory.java (87%) rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/Function.java (64%) rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/Java8Snippet.java (90%) rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/JavaBackend.java (88%) rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/JavaHookDefinition.java (84%) rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/JavaSnippet.java (91%) rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/JavaStepDefinition.java (78%) rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/LambdaGlueRegistry.java (72%) rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/MethodScanner.java (92%) rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/ObjectFactoryLoader.java (86%) rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/ParameterInfo.java (97%) create mode 100644 java/src/main/java/io/cucumber/java/StaticGlue.java rename java/src/main/java/{cucumber/runtime => io/cucumber}/java/StepDefAnnotation.java (89%) delete mode 100644 java/src/test/java/cucumber/runtime/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/Java8SnippetTest.java (94%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/JavaBackendTest.java (77%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/JavaHookTest.java (94%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/JavaObjectFactoryTest.java (96%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/JavaSnippetTest.java (98%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/JavaStepDefinitionTest.java (87%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/JavaStepDefinitionTransposeTest.java (97%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/MethodScannerTest.java (79%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/SingletonFactory.java (95%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/StringJoiner.java (94%) create mode 100644 java/src/test/java/io/cucumber/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/stepdefs/Stepdefs.java (74%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/test/Authors.java (98%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/test/RunCukesTest.java (77%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/test/ScenarioStepDefs.java (95%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/test/Stepdefs.java (91%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/test/SubstitutionStepdefs.java (97%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/test/TypeRegistryConfiguration.java (82%) rename java/src/test/java/{cucumber/runtime => io/cucumber}/java/test/UnusedGlue.java (91%) rename java/src/test/resources/{cucumber/runtime => io/cucumber}/java/test/authors.feature (100%) rename java/src/test/resources/{cucumber/runtime => io/cucumber}/java/test/cukes.feature (100%) rename java/src/test/resources/{cucumber/runtime => io/cucumber}/java/test/french-iso-8859-1-cukes.feature (100%) rename java/src/test/resources/{cucumber/runtime => io/cucumber}/java/test/scenario.feature (100%) rename java/src/test/resources/{cucumber/runtime => io/cucumber}/java/test/scenario_outline_substitution.feature (100%) rename java/src/test/resources/{cucumber/runtime => io/cucumber}/java/test/table_conversion.feature (100%) diff --git a/java/src/main/code_generator/I18n.java.txt b/java/src/main/code_generator/I18n.java.txt index 119b091ec3..6788b4a3fa 100644 --- a/java/src/main/code_generator/I18n.java.txt +++ b/java/src/main/code_generator/I18n.java.txt @@ -1,6 +1,6 @@ package cucumber.api.java.${lang}; -import cucumber.runtime.java.StepDefAnnotation; +import io.cucumber.java.StepDefAnnotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/main/java/cucumber/runtime/java/AbstractJavaSnippet.java b/java/src/main/java/io/cucumber/java/AbstractJavaSnippet.java similarity index 95% rename from java/src/main/java/cucumber/runtime/java/AbstractJavaSnippet.java rename to java/src/main/java/io/cucumber/java/AbstractJavaSnippet.java index 91922e2c76..ed59461ccb 100644 --- a/java/src/main/java/cucumber/runtime/java/AbstractJavaSnippet.java +++ b/java/src/main/java/io/cucumber/java/AbstractJavaSnippet.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import cucumber.runtime.snippets.Snippet; +import io.cucumber.core.snippets.Snippet; import io.cucumber.datatable.DataTable; import java.lang.reflect.Type; diff --git a/java/src/main/java/cucumber/runtime/java/DefaultJavaObjectFactory.java b/java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java similarity index 87% rename from java/src/main/java/cucumber/runtime/java/DefaultJavaObjectFactory.java rename to java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java index 00bcc51b43..ea1bf2104f 100644 --- a/java/src/main/java/cucumber/runtime/java/DefaultJavaObjectFactory.java +++ b/java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java @@ -1,15 +1,14 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; /** - * This class has package scope so it doesn't get loaded by reflection, + * This class has package scope so it doesn't loadGlue loaded by reflection, * thereby colliding with other DI implementations. */ class DefaultJavaObjectFactory implements ObjectFactory { diff --git a/java/src/main/java/cucumber/runtime/java/Function.java b/java/src/main/java/io/cucumber/java/Function.java similarity index 64% rename from java/src/main/java/cucumber/runtime/java/Function.java rename to java/src/main/java/io/cucumber/java/Function.java index fe6ea885e2..5cb1e9c509 100644 --- a/java/src/main/java/cucumber/runtime/java/Function.java +++ b/java/src/main/java/io/cucumber/java/Function.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; public interface Function { diff --git a/java/src/main/java/cucumber/runtime/java/Java8Snippet.java b/java/src/main/java/io/cucumber/java/Java8Snippet.java similarity index 90% rename from java/src/main/java/cucumber/runtime/java/Java8Snippet.java rename to java/src/main/java/io/cucumber/java/Java8Snippet.java index 76f9d1e66e..dc27cbd3d8 100644 --- a/java/src/main/java/cucumber/runtime/java/Java8Snippet.java +++ b/java/src/main/java/io/cucumber/java/Java8Snippet.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; final class Java8Snippet extends AbstractJavaSnippet { diff --git a/java/src/main/java/cucumber/runtime/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java similarity index 88% rename from java/src/main/java/cucumber/runtime/java/JavaBackend.java rename to java/src/main/java/io/cucumber/java/JavaBackend.java index a99111585a..53c0d945fd 100644 --- a/java/src/main/java/cucumber/runtime/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -1,29 +1,29 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import static cucumber.runtime.io.MultiLoader.packageName; -import static cucumber.runtime.java.ObjectFactoryLoader.loadObjectFactory; +import static io.cucumber.core.io.MultiLoader.packageName; +import static io.cucumber.java.ObjectFactoryLoader.loadObjectFactory; import static java.lang.Thread.currentThread; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.runtime.Invoker; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java.After; import cucumber.api.java.AfterStep; import cucumber.api.java.Before; import cucumber.api.java.BeforeStep; import cucumber.api.java.ObjectFactory; import cucumber.api.java8.GlueBase; -import cucumber.runtime.Backend; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.CucumberException; -import cucumber.runtime.Env; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.Utils; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; -import cucumber.runtime.snippets.FunctionNameGenerator; -import cucumber.runtime.snippets.Snippet; -import cucumber.runtime.snippets.SnippetGenerator; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.options.Env; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.snippets.FunctionNameGenerator; +import io.cucumber.core.snippets.Snippet; +import io.cucumber.core.snippets.SnippetGenerator; import gherkin.pickles.PickleStep; import java.lang.annotation.Annotation; @@ -117,7 +117,6 @@ public void buildWorld() { // in the constructor. try { INSTANCE.set(this); - glue.removeScenarioScopedGlue(); for (Class glueBaseClass : glueBaseClasses) { objectFactory.getInstance(glueBaseClass); } @@ -205,12 +204,12 @@ public void addBeforeStepHookDefinition(HookDefinition beforeStepHook) { private String expression(Annotation annotation) throws Throwable { Method expressionMethod = annotation.getClass().getMethod("value"); - return (String) Utils.invoke(annotation, expressionMethod, 0); + return (String) Invoker.invoke(annotation, expressionMethod, 0); } private long timeoutMillis(Annotation annotation) throws Throwable { Method regexpMethod = annotation.getClass().getMethod("timeout"); - return (Long) Utils.invoke(annotation, regexpMethod, 0); + return (Long) Invoker.invoke(annotation, regexpMethod, 0); } } diff --git a/java/src/main/java/cucumber/runtime/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java similarity index 84% rename from java/src/main/java/cucumber/runtime/java/JavaHookDefinition.java rename to java/src/main/java/io/cucumber/java/JavaHookDefinition.java index 3868b87375..005de5fa8f 100644 --- a/java/src/main/java/cucumber/runtime/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -1,13 +1,13 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.Scenario; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.CucumberException; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.MethodFormat; -import cucumber.runtime.Utils; -import cucumber.runtime.filter.TagPredicate; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.reflection.MethodFormat; +import io.cucumber.core.filter.TagPredicate; import gherkin.pickles.PickleTag; +import io.cucumber.core.runtime.Invoker; import java.lang.reflect.Method; import java.util.Collection; @@ -57,7 +57,7 @@ public void execute(Scenario scenario) throws Throwable { throw new CucumberException("Hooks must declare 0 or 1 arguments. " + method.toString()); } - Utils.invoke(objectFactory.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); + Invoker.invoke(objectFactory.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); } @Override diff --git a/java/src/main/java/cucumber/runtime/java/JavaSnippet.java b/java/src/main/java/io/cucumber/java/JavaSnippet.java similarity index 91% rename from java/src/main/java/cucumber/runtime/java/JavaSnippet.java rename to java/src/main/java/io/cucumber/java/JavaSnippet.java index 485973f38a..fd5af70d1d 100644 --- a/java/src/main/java/cucumber/runtime/java/JavaSnippet.java +++ b/java/src/main/java/io/cucumber/java/JavaSnippet.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; final class JavaSnippet extends AbstractJavaSnippet { diff --git a/java/src/main/java/cucumber/runtime/java/JavaStepDefinition.java b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java similarity index 78% rename from java/src/main/java/cucumber/runtime/java/JavaStepDefinition.java rename to java/src/main/java/io/cucumber/java/JavaStepDefinition.java index 5d21272867..68ca065efb 100644 --- a/java/src/main/java/cucumber/runtime/java/JavaStepDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java @@ -1,15 +1,15 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.runtime.Invoker; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java.ObjectFactory; -import io.cucumber.stepexpression.Argument; -import io.cucumber.stepexpression.ArgumentMatcher; -import io.cucumber.stepexpression.ExpressionArgumentMatcher; -import cucumber.runtime.MethodFormat; -import cucumber.runtime.StepDefinition; -import io.cucumber.stepexpression.StepExpression; -import io.cucumber.stepexpression.StepExpressionFactory; -import cucumber.runtime.Utils; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.ArgumentMatcher; +import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; +import io.cucumber.core.reflection.MethodFormat; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.StepExpression; +import io.cucumber.core.stepexpression.StepExpressionFactory; import gherkin.pickles.PickleStep; import java.lang.reflect.Method; @@ -45,7 +45,7 @@ private StepExpression createExpression(String expression, TypeRegistry typeRegi } public void execute(Object[] args) throws Throwable { - Utils.invoke(objectFactory.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); + Invoker.invoke(objectFactory.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); } public List matchedArguments(PickleStep step) { diff --git a/java/src/main/java/cucumber/runtime/java/LambdaGlueRegistry.java b/java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java similarity index 72% rename from java/src/main/java/cucumber/runtime/java/LambdaGlueRegistry.java rename to java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java index b720d6105e..46ad5454a8 100644 --- a/java/src/main/java/cucumber/runtime/java/LambdaGlueRegistry.java +++ b/java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java @@ -1,8 +1,8 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import io.cucumber.stepexpression.TypeRegistry; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinition; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; public interface LambdaGlueRegistry { ThreadLocal INSTANCE = new ThreadLocal(); diff --git a/java/src/main/java/cucumber/runtime/java/MethodScanner.java b/java/src/main/java/io/cucumber/java/MethodScanner.java similarity index 92% rename from java/src/main/java/cucumber/runtime/java/MethodScanner.java rename to java/src/main/java/io/cucumber/java/MethodScanner.java index 5132e43819..e5bbeadec2 100644 --- a/java/src/main/java/cucumber/runtime/java/MethodScanner.java +++ b/java/src/main/java/io/cucumber/java/MethodScanner.java @@ -1,18 +1,18 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.java.After; import cucumber.api.java.AfterStep; import cucumber.api.java.Before; import cucumber.api.java.BeforeStep; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.CucumberException; -import cucumber.runtime.Utils; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.Reflections; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.List; -import static cucumber.runtime.io.MultiLoader.packageName; +import static io.cucumber.core.io.MultiLoader.packageName; class MethodScanner { @@ -31,7 +31,7 @@ public MethodScanner(ClassFinder classFinder) { public void scan(JavaBackend javaBackend, List gluePaths) { for (String gluePath : gluePaths) { for (Class glueCodeClass : classFinder.getDescendants(Object.class, packageName(gluePath))) { - while (glueCodeClass != null && glueCodeClass != Object.class && !Utils.isInstantiable(glueCodeClass)) { + while (glueCodeClass != null && glueCodeClass != Object.class && !Reflections.isInstantiable(glueCodeClass)) { // those can't be instantiated without container class present. glueCodeClass = glueCodeClass.getSuperclass(); } diff --git a/java/src/main/java/cucumber/runtime/java/ObjectFactoryLoader.java b/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java similarity index 86% rename from java/src/main/java/cucumber/runtime/java/ObjectFactoryLoader.java rename to java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java index f4fe0ac325..a83ab0cd53 100644 --- a/java/src/main/java/cucumber/runtime/java/ObjectFactoryLoader.java +++ b/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java @@ -1,11 +1,11 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.CucumberException; -import cucumber.runtime.NoInstancesException; -import cucumber.runtime.Reflections; -import cucumber.runtime.TooManyInstancesException; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.NoInstancesException; +import io.cucumber.core.reflection.Reflections; +import io.cucumber.core.reflection.TooManyInstancesException; import static java.util.Arrays.asList; @@ -30,7 +30,7 @@ public static ObjectFactory loadObjectFactory(ClassFinder classFinder, String ob Class objectFactoryClass = (Class) classFinder.loadClass(objectFactoryClassName); objectFactory = reflections.newInstance(new Class[0], new Object[0], objectFactoryClass); } else { - objectFactory = reflections.instantiateExactlyOneSubclass(ObjectFactory.class, asList("cucumber.runtime"), new Class[0], new Object[0], null); + objectFactory = reflections.instantiateExactlyOneSubclass(ObjectFactory.class, asList("io.cucumber"), new Class[0], new Object[0], null); } } catch (TooManyInstancesException e) { System.out.println(e.getMessage()); diff --git a/java/src/main/java/cucumber/runtime/java/ParameterInfo.java b/java/src/main/java/io/cucumber/java/ParameterInfo.java similarity index 97% rename from java/src/main/java/cucumber/runtime/java/ParameterInfo.java rename to java/src/main/java/io/cucumber/java/ParameterInfo.java index 7c8a0cd1e3..82bf03e659 100644 --- a/java/src/main/java/cucumber/runtime/java/ParameterInfo.java +++ b/java/src/main/java/io/cucumber/java/ParameterInfo.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.Transpose; diff --git a/java/src/main/java/io/cucumber/java/StaticGlue.java b/java/src/main/java/io/cucumber/java/StaticGlue.java new file mode 100644 index 0000000000..e6304007bf --- /dev/null +++ b/java/src/main/java/io/cucumber/java/StaticGlue.java @@ -0,0 +1,57 @@ +package io.cucumber.java; + +import cucumber.api.java.ObjectFactory; +import io.cucumber.core.stepexpression.TypeRegistry; + +public class StaticGlue { + + + + private static interface GlueProvider { + + StaticGlue loadGlue(String glue_paths); + } + + private static class JavaGlueProvider implements GlueProvider{ + + // same constructor as JavaBackend + + @Override + public StaticGlue loadGlue(String glue_paths) { + // create glue instance + + // add glue methods + + return null; + } + } + + + private static class Main { + + public void main(){ + + StaticGlue staticGlue = new JavaGlueProvider().loadGlue("glue paths"); + + staticGlue.buildWorld(); + + + + } + + + } + + private void buildWorld() { + } + + + private TypeRegistry typeRegistry; + private ObjectFactory objectFactory; + + + + +} + + diff --git a/java/src/main/java/cucumber/runtime/java/StepDefAnnotation.java b/java/src/main/java/io/cucumber/java/StepDefAnnotation.java similarity index 89% rename from java/src/main/java/cucumber/runtime/java/StepDefAnnotation.java rename to java/src/main/java/io/cucumber/java/StepDefAnnotation.java index 9d16b0db08..c678bf299b 100644 --- a/java/src/main/java/cucumber/runtime/java/StepDefAnnotation.java +++ b/java/src/main/java/io/cucumber/java/StepDefAnnotation.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/test/java/cucumber/runtime/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java b/java/src/test/java/cucumber/runtime/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java deleted file mode 100644 index 0a81ebbd42..0000000000 --- a/java/src/test/java/cucumber/runtime/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java +++ /dev/null @@ -1,6 +0,0 @@ -package cucumber.runtime.java.incorrectlysubclassedstepdefs; - -import cucumber.runtime.java.stepdefs.Stepdefs; - -public class SubclassesStepdefs extends Stepdefs { -} diff --git a/java/src/test/java/cucumber/runtime/java/Java8SnippetTest.java b/java/src/test/java/io/cucumber/java/Java8SnippetTest.java similarity index 94% rename from java/src/test/java/cucumber/runtime/java/Java8SnippetTest.java rename to java/src/test/java/io/cucumber/java/Java8SnippetTest.java index 6ae8215d72..0d375aa901 100644 --- a/java/src/test/java/cucumber/runtime/java/Java8SnippetTest.java +++ b/java/src/test/java/io/cucumber/java/Java8SnippetTest.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import cucumber.runtime.snippets.SnippetGenerator; +import io.cucumber.core.snippets.SnippetGenerator; import gherkin.pickles.Argument; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; diff --git a/java/src/test/java/cucumber/runtime/java/JavaBackendTest.java b/java/src/test/java/io/cucumber/java/JavaBackendTest.java similarity index 77% rename from java/src/test/java/cucumber/runtime/java/JavaBackendTest.java rename to java/src/test/java/io/cucumber/java/JavaBackendTest.java index b53fe6fd1e..be7ce641e5 100644 --- a/java/src/test/java/cucumber/runtime/java/JavaBackendTest.java +++ b/java/src/test/java/io/cucumber/java/JavaBackendTest.java @@ -1,15 +1,15 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.CucumberException; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; -import cucumber.runtime.java.stepdefs.Stepdefs; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.java.stepdefs.Stepdefs; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Before; import org.junit.Test; @@ -45,7 +45,7 @@ public void finds_step_definitions_by_classpath_url() { @Test public void finds_step_definitions_by_package_name() { GlueStub glue = new GlueStub(); - backend.loadGlue(glue, asList("cucumber.runtime.java.stepdefs")); + backend.loadGlue(glue, asList("io.cucumber.java.stepdefs")); backend.buildWorld(); assertEquals(Stepdefs.class, factory.getInstance(Stepdefs.class).getClass()); } @@ -53,7 +53,7 @@ public void finds_step_definitions_by_package_name() { @Test(expected = CucumberException.class) public void detects_subclassed_glue_and_throws_exception() { GlueStub glue = new GlueStub(); - backend.loadGlue(glue, asList("cucumber.runtime.java.stepdefs", "cucumber.runtime.java.incorrectlysubclassedstepdefs")); + backend.loadGlue(glue, asList("io.cucumber.java.stepdefs", "io.cucumber.java.incorrectlysubclassedstepdefs")); } private class GlueStub implements Glue { @@ -83,8 +83,5 @@ public void addAfterHook(HookDefinition hookDefinition) { throw new UnsupportedOperationException(); } - @Override - public void removeScenarioScopedGlue() { - } } } diff --git a/java/src/test/java/cucumber/runtime/java/JavaHookTest.java b/java/src/test/java/io/cucumber/java/JavaHookTest.java similarity index 94% rename from java/src/test/java/cucumber/runtime/java/JavaHookTest.java rename to java/src/test/java/io/cucumber/java/JavaHookTest.java index 604fef0dd2..50625a3111 100644 --- a/java/src/test/java/cucumber/runtime/java/JavaHookTest.java +++ b/java/src/test/java/io/cucumber/java/JavaHookTest.java @@ -1,19 +1,19 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.Scenario; import cucumber.api.java.After; import cucumber.api.java.AfterStep; import cucumber.api.java.Before; import cucumber.api.java.BeforeStep; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.Glue; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleTag; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -186,7 +186,7 @@ public void fails_if_hook_argument_is_not_scenario_result() throws Throwable { verify(glue).addAfterHook(javaHookDefinitionArgumentCaptor.capture()); HookDefinition bad = javaHookDefinitionArgumentCaptor.getValue(); - expectedException.expectMessage("When a hook declares an argument it must be of type cucumber.api.Scenario. public void cucumber.runtime.java.JavaHookTest$BadHook.after(java.lang.String)"); + expectedException.expectMessage("When a hook declares an argument it must be of type cucumber.api.Scenario. public void io.cucumber.java.JavaHookTest$BadHook.after(java.lang.String)"); bad.execute(mock(Scenario.class)); } diff --git a/java/src/test/java/cucumber/runtime/java/JavaObjectFactoryTest.java b/java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java similarity index 96% rename from java/src/test/java/cucumber/runtime/java/JavaObjectFactoryTest.java rename to java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java index 3f9dbb83b1..e36f4b3e43 100644 --- a/java/src/test/java/cucumber/runtime/java/JavaObjectFactoryTest.java +++ b/java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.java.ObjectFactory; import org.junit.Test; diff --git a/java/src/test/java/cucumber/runtime/java/JavaSnippetTest.java b/java/src/test/java/io/cucumber/java/JavaSnippetTest.java similarity index 98% rename from java/src/test/java/cucumber/runtime/java/JavaSnippetTest.java rename to java/src/test/java/io/cucumber/java/JavaSnippetTest.java index 1d1e125d62..cb4b7e2f4e 100644 --- a/java/src/test/java/cucumber/runtime/java/JavaSnippetTest.java +++ b/java/src/test/java/io/cucumber/java/JavaSnippetTest.java @@ -1,8 +1,8 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import cucumber.runtime.snippets.FunctionNameGenerator; -import cucumber.runtime.snippets.SnippetGenerator; -import cucumber.runtime.snippets.UnderscoreConcatenator; +import io.cucumber.core.snippets.FunctionNameGenerator; +import io.cucumber.core.snippets.SnippetGenerator; +import io.cucumber.core.snippets.UnderscoreConcatenator; import gherkin.pickles.Argument; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleLocation; @@ -82,7 +82,7 @@ public List transform(String... strings) { String expected = "" + "@Given(\"I have {sizes} bellies\")\n" + - "public void i_have_bellies(java.util.List sizes) {\n" + + "public void i_have_bellies(java.util.List sizes) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + " throw new cucumber.api.PendingException();\n" + "}\n"; diff --git a/java/src/test/java/cucumber/runtime/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java similarity index 87% rename from java/src/test/java/cucumber/runtime/java/JavaStepDefinitionTest.java rename to java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 44dbd5fcd2..87064fa06e 100644 --- a/java/src/test/java/cucumber/runtime/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -1,23 +1,23 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.Result; import cucumber.api.event.EventHandler; import cucumber.api.event.TestStepFinished; import cucumber.api.java.ObjectFactory; import cucumber.api.java.en.Given; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.EventBus; -import cucumber.runner.Runner; -import cucumber.runner.TimeService; -import cucumber.runner.AmbiguousStepDefinitionsException; -import cucumber.runtime.Backend; -import cucumber.runtime.BackendSupplier; -import cucumber.runtime.DuplicateStepDefinitionException; -import cucumber.runtime.RuntimeOptions; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.runner.EventBus; +import io.cucumber.core.runner.Runner; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.AmbiguousStepDefinitionsException; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.backend.DuplicateStepDefinitionException; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; import gherkin.events.PickleEvent; import gherkin.pickles.Argument; import gherkin.pickles.Pickle; @@ -32,7 +32,7 @@ import java.util.Collections; import java.util.Locale; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import static java.lang.Thread.currentThread; import static java.util.Arrays.asList; diff --git a/java/src/test/java/cucumber/runtime/java/JavaStepDefinitionTransposeTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java similarity index 97% rename from java/src/test/java/cucumber/runtime/java/JavaStepDefinitionTransposeTest.java rename to java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java index 0fc7f2d404..d640c35c1d 100755 --- a/java/src/test/java/cucumber/runtime/java/JavaStepDefinitionTransposeTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java @@ -1,16 +1,16 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.Transpose; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.StepDefinition; +import io.cucumber.core.backend.StepDefinition; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleRow; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTable; import io.cucumber.datatable.DataTable; -import io.cucumber.stepexpression.Argument; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; diff --git a/java/src/test/java/cucumber/runtime/java/MethodScannerTest.java b/java/src/test/java/io/cucumber/java/MethodScannerTest.java similarity index 79% rename from java/src/test/java/cucumber/runtime/java/MethodScannerTest.java rename to java/src/test/java/io/cucumber/java/MethodScannerTest.java index ba5efe2208..f6d3f2a4c6 100644 --- a/java/src/test/java/cucumber/runtime/java/MethodScannerTest.java +++ b/java/src/test/java/io/cucumber/java/MethodScannerTest.java @@ -1,12 +1,12 @@ -package cucumber.runtime.java; +package io.cucumber.java; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.CucumberException; -import cucumber.runtime.Glue; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; @@ -54,7 +54,7 @@ public void loadGlue_fails_when_class_is_not_method_declaring_class() throws NoS backend.loadGlue(null, BaseStepDefs.class.getMethod("m"), Stepdefs2.class); fail(); } catch (CucumberException e) { - assertEquals("You're not allowed to extend classes that define Step Definitions or hooks. class cucumber.runtime.java.MethodScannerTest$Stepdefs2 extends class cucumber.runtime.java.MethodScannerTest$BaseStepDefs", e.getMessage()); + assertEquals("You're not allowed to extend classes that define Step Definitions or hooks. class io.cucumber.java.MethodScannerTest$Stepdefs2 extends class io.cucumber.java.MethodScannerTest$BaseStepDefs", e.getMessage()); } } @@ -64,7 +64,7 @@ public void loadGlue_fails_when_class_is_not_subclass_of_declaring_class() throw backend.loadGlue(null, BaseStepDefs.class.getMethod("m"), String.class); fail(); } catch (CucumberException e) { - assertEquals("class cucumber.runtime.java.MethodScannerTest$BaseStepDefs isn't assignable from class java.lang.String", e.getMessage()); + assertEquals("class io.cucumber.java.MethodScannerTest$BaseStepDefs isn't assignable from class java.lang.String", e.getMessage()); } } diff --git a/java/src/test/java/cucumber/runtime/java/SingletonFactory.java b/java/src/test/java/io/cucumber/java/SingletonFactory.java similarity index 95% rename from java/src/test/java/cucumber/runtime/java/SingletonFactory.java rename to java/src/test/java/io/cucumber/java/SingletonFactory.java index f07273fdf2..b66cf0265b 100644 --- a/java/src/test/java/cucumber/runtime/java/SingletonFactory.java +++ b/java/src/test/java/io/cucumber/java/SingletonFactory.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; import cucumber.api.java.ObjectFactory; diff --git a/java/src/test/java/cucumber/runtime/java/StringJoiner.java b/java/src/test/java/io/cucumber/java/StringJoiner.java similarity index 94% rename from java/src/test/java/cucumber/runtime/java/StringJoiner.java rename to java/src/test/java/io/cucumber/java/StringJoiner.java index 4f20e32e00..6e7ad782b7 100644 --- a/java/src/test/java/cucumber/runtime/java/StringJoiner.java +++ b/java/src/test/java/io/cucumber/java/StringJoiner.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java; +package io.cucumber.java; public class StringJoiner { public static String join(String delimiter, Iterable strings){ diff --git a/java/src/test/java/io/cucumber/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java b/java/src/test/java/io/cucumber/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java new file mode 100644 index 0000000000..da629b3506 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java @@ -0,0 +1,6 @@ +package io.cucumber.java.incorrectlysubclassedstepdefs; + +import io.cucumber.java.stepdefs.Stepdefs; + +public class SubclassesStepdefs extends Stepdefs { +} diff --git a/java/src/test/java/cucumber/runtime/java/stepdefs/Stepdefs.java b/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java similarity index 74% rename from java/src/test/java/cucumber/runtime/java/stepdefs/Stepdefs.java rename to java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java index bbd62867b5..668c964300 100644 --- a/java/src/test/java/cucumber/runtime/java/stepdefs/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.stepdefs; +package io.cucumber.java.stepdefs; import cucumber.api.java.en.Given; diff --git a/java/src/test/java/cucumber/runtime/java/test/Authors.java b/java/src/test/java/io/cucumber/java/test/Authors.java similarity index 98% rename from java/src/test/java/cucumber/runtime/java/test/Authors.java rename to java/src/test/java/io/cucumber/java/test/Authors.java index 5cb9d2e364..6a7561c3f7 100644 --- a/java/src/test/java/cucumber/runtime/java/test/Authors.java +++ b/java/src/test/java/io/cucumber/java/test/Authors.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.test; +package io.cucumber.java.test; import cucumber.api.Transpose; import cucumber.api.java.en.Given; diff --git a/java/src/test/java/cucumber/runtime/java/test/RunCukesTest.java b/java/src/test/java/io/cucumber/java/test/RunCukesTest.java similarity index 77% rename from java/src/test/java/cucumber/runtime/java/test/RunCukesTest.java rename to java/src/test/java/io/cucumber/java/test/RunCukesTest.java index 19b64b353d..001568e03a 100644 --- a/java/src/test/java/cucumber/runtime/java/test/RunCukesTest.java +++ b/java/src/test/java/io/cucumber/java/test/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.test; +package io.cucumber.java.test; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/java/src/test/java/cucumber/runtime/java/test/ScenarioStepDefs.java b/java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java similarity index 95% rename from java/src/test/java/cucumber/runtime/java/test/ScenarioStepDefs.java rename to java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java index b4585e4321..12f852684b 100644 --- a/java/src/test/java/cucumber/runtime/java/test/ScenarioStepDefs.java +++ b/java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.test; +package io.cucumber.java.test; import cucumber.api.Scenario; import cucumber.api.java.Before; diff --git a/java/src/test/java/cucumber/runtime/java/test/Stepdefs.java b/java/src/test/java/io/cucumber/java/test/Stepdefs.java similarity index 91% rename from java/src/test/java/cucumber/runtime/java/test/Stepdefs.java rename to java/src/test/java/io/cucumber/java/test/Stepdefs.java index a51e4e94ec..f6300dca6f 100644 --- a/java/src/test/java/cucumber/runtime/java/test/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/test/Stepdefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.test; +package io.cucumber.java.test; import cucumber.api.java.en.Given; diff --git a/java/src/test/java/cucumber/runtime/java/test/SubstitutionStepdefs.java b/java/src/test/java/io/cucumber/java/test/SubstitutionStepdefs.java similarity index 97% rename from java/src/test/java/cucumber/runtime/java/test/SubstitutionStepdefs.java rename to java/src/test/java/io/cucumber/java/test/SubstitutionStepdefs.java index 60ff4934e5..dfa289a9e2 100644 --- a/java/src/test/java/cucumber/runtime/java/test/SubstitutionStepdefs.java +++ b/java/src/test/java/io/cucumber/java/test/SubstitutionStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.test; +package io.cucumber.java.test; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/java/src/test/java/cucumber/runtime/java/test/TypeRegistryConfiguration.java b/java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java similarity index 82% rename from java/src/test/java/cucumber/runtime/java/test/TypeRegistryConfiguration.java rename to java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java index 783d5b88e8..0e1cc6d9a4 100644 --- a/java/src/test/java/cucumber/runtime/java/test/TypeRegistryConfiguration.java +++ b/java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java @@ -1,12 +1,11 @@ -package cucumber.runtime.java.test; +package io.cucumber.java.test; import cucumber.api.TypeRegistryConfigurer; import cucumber.api.TypeRegistry; import io.cucumber.datatable.DataTable; import io.cucumber.datatable.DataTableType; import io.cucumber.datatable.TableEntryTransformer; -import cucumber.runtime.java.test.Authors.Author; -import cucumber.runtime.java.test.Stepdefs.Person; +import io.cucumber.java.test.Authors.Author; import io.cucumber.datatable.TableTransformer; import java.util.Locale; @@ -16,10 +15,10 @@ public class TypeRegistryConfiguration implements TypeRegistryConfigurer { - private final TableEntryTransformer personEntryTransformer = new TableEntryTransformer() { + private final TableEntryTransformer personEntryTransformer = new TableEntryTransformer() { @Override - public Person transform(Map tableEntry) { - Person person = new Person(); + public Stepdefs.Person transform(Map tableEntry) { + Stepdefs.Person person = new Stepdefs.Person(); person.first = tableEntry.get("first"); person.last = tableEntry.get("last"); return person; @@ -58,7 +57,7 @@ public void configureTypeRegistry(TypeRegistry typeRegistry) { singleAuthorTransformer)); typeRegistry.defineDataTableType(new DataTableType( - Person.class, + Stepdefs.Person.class, personEntryTransformer)); } } diff --git a/java/src/test/java/cucumber/runtime/java/test/UnusedGlue.java b/java/src/test/java/io/cucumber/java/test/UnusedGlue.java similarity index 91% rename from java/src/test/java/cucumber/runtime/java/test/UnusedGlue.java rename to java/src/test/java/io/cucumber/java/test/UnusedGlue.java index 90bb7ace4b..f1d55e3ec1 100644 --- a/java/src/test/java/cucumber/runtime/java/test/UnusedGlue.java +++ b/java/src/test/java/io/cucumber/java/test/UnusedGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.test; +package io.cucumber.java.test; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/java/src/test/resources/cucumber/runtime/java/test/authors.feature b/java/src/test/resources/io/cucumber/java/test/authors.feature similarity index 100% rename from java/src/test/resources/cucumber/runtime/java/test/authors.feature rename to java/src/test/resources/io/cucumber/java/test/authors.feature diff --git a/java/src/test/resources/cucumber/runtime/java/test/cukes.feature b/java/src/test/resources/io/cucumber/java/test/cukes.feature similarity index 100% rename from java/src/test/resources/cucumber/runtime/java/test/cukes.feature rename to java/src/test/resources/io/cucumber/java/test/cukes.feature diff --git a/java/src/test/resources/cucumber/runtime/java/test/french-iso-8859-1-cukes.feature b/java/src/test/resources/io/cucumber/java/test/french-iso-8859-1-cukes.feature similarity index 100% rename from java/src/test/resources/cucumber/runtime/java/test/french-iso-8859-1-cukes.feature rename to java/src/test/resources/io/cucumber/java/test/french-iso-8859-1-cukes.feature diff --git a/java/src/test/resources/cucumber/runtime/java/test/scenario.feature b/java/src/test/resources/io/cucumber/java/test/scenario.feature similarity index 100% rename from java/src/test/resources/cucumber/runtime/java/test/scenario.feature rename to java/src/test/resources/io/cucumber/java/test/scenario.feature diff --git a/java/src/test/resources/cucumber/runtime/java/test/scenario_outline_substitution.feature b/java/src/test/resources/io/cucumber/java/test/scenario_outline_substitution.feature similarity index 100% rename from java/src/test/resources/cucumber/runtime/java/test/scenario_outline_substitution.feature rename to java/src/test/resources/io/cucumber/java/test/scenario_outline_substitution.feature diff --git a/java/src/test/resources/cucumber/runtime/java/test/table_conversion.feature b/java/src/test/resources/io/cucumber/java/test/table_conversion.feature similarity index 100% rename from java/src/test/resources/cucumber/runtime/java/test/table_conversion.feature rename to java/src/test/resources/io/cucumber/java/test/table_conversion.feature From caba106cedf35d34c7b86f5cf413eb80aa9c442e Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 19:37:45 +0200 Subject: [PATCH 004/155] [Java8] Introduce new package structure --- java8/src/main/code_generator/I18n.java8.txt | 6 ++--- .../cucumber}/java8/Java8HookDefinition.java | 10 +++---- .../cucumber}/java8/Java8StepDefinition.java | 26 +++++++++---------- .../cucumber}/java8/LambdaGlueBase.java | 4 +-- .../cucumber}/java8/ParameterInfo.java | 2 +- ...Java8AnonInnerClassStepDefinitionTest.java | 4 +-- ...efinitionMarksCorrectStackElementTest.java | 12 ++++----- .../java8/Java8LambdaStepDefinitionTest.java | 6 ++--- .../cucumber}/java8/SomeLambdaStepDefs.java | 2 +- .../java8/test/AnonInnerClassStepdefs.java | 12 ++++----- .../cucumber}/java8/test/LambdaStepdefs.java | 2 +- .../cucumber}/java8/test/RunCukesTest.java | 2 +- .../java8/test/TypeRegistryConfiguration.java | 4 +-- .../anon-inner-class-step-definitions.feature | 0 .../test/lambda-step-definitions.feature | 0 15 files changed, 46 insertions(+), 46 deletions(-) rename java8/src/main/java/{cucumber/runtime => io/cucumber}/java8/Java8HookDefinition.java (91%) rename java8/src/main/java/{cucumber/runtime => io/cucumber}/java8/Java8StepDefinition.java (88%) rename java8/src/main/java/{cucumber/runtime => io/cucumber}/java8/LambdaGlueBase.java (99%) rename java8/src/main/java/{cucumber/runtime => io/cucumber}/java8/ParameterInfo.java (96%) rename java8/src/test/java/{cucumber/runtime => io/cucumber}/java8/Java8AnonInnerClassStepDefinitionTest.java (95%) rename java8/src/test/java/{cucumber/runtime => io/cucumber}/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java (89%) rename java8/src/test/java/{cucumber/runtime => io/cucumber}/java8/Java8LambdaStepDefinitionTest.java (93%) rename java8/src/test/java/{cucumber/runtime => io/cucumber}/java8/SomeLambdaStepDefs.java (87%) rename java8/src/test/java/{cucumber/runtime => io/cucumber}/java8/test/AnonInnerClassStepdefs.java (78%) rename java8/src/test/java/{cucumber/runtime => io/cucumber}/java8/test/LambdaStepdefs.java (99%) rename java8/src/test/java/{cucumber/runtime => io/cucumber}/java8/test/RunCukesTest.java (77%) rename java8/src/test/java/{cucumber/runtime => io/cucumber}/java8/test/TypeRegistryConfiguration.java (89%) rename java8/src/test/resources/{cucumber/runtime => io/cucumber}/java8/test/anon-inner-class-step-definitions.feature (100%) rename java8/src/test/resources/{cucumber/runtime => io/cucumber}/java8/test/lambda-step-definitions.feature (100%) diff --git a/java8/src/main/code_generator/I18n.java8.txt b/java8/src/main/code_generator/I18n.java8.txt index 974ca00998..fccf9eec79 100644 --- a/java8/src/main/code_generator/I18n.java8.txt +++ b/java8/src/main/code_generator/I18n.java8.txt @@ -11,9 +11,9 @@ import cucumber.api.java8.StepdefBody.A7; import cucumber.api.java8.StepdefBody.A8; import cucumber.api.java8.StepdefBody.A9; -import cucumber.runtime.java.LambdaGlueRegistry; -import cucumber.runtime.java8.Java8StepDefinition; -import cucumber.runtime.java8.LambdaGlueBase; +import io.cucumber.java.LambdaGlueRegistry; +import io.cucumber.java8.Java8StepDefinition; +import io.cucumber.java8.LambdaGlueBase; /** * To execute steps in a feature file the steps must be diff --git a/java8/src/main/java/cucumber/runtime/java8/Java8HookDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java similarity index 91% rename from java8/src/main/java/cucumber/runtime/java8/Java8HookDefinition.java rename to java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java index 04dab0e791..2b49d98624 100644 --- a/java8/src/main/java/cucumber/runtime/java8/Java8HookDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java @@ -1,14 +1,14 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; import static java.util.Arrays.asList; import cucumber.api.Scenario; import cucumber.api.java8.HookBody; import cucumber.api.java8.HookNoArgsBody; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.filter.TagPredicate; -import cucumber.runtime.Timeout; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.filter.TagPredicate; import gherkin.pickles.PickleTag; +import io.cucumber.core.runtime.Invoker; import java.util.Collection; @@ -44,7 +44,7 @@ public String getLocation(boolean detail) { @Override public void execute(final Scenario scenario) throws Throwable { - Timeout.timeout(() -> { + Invoker.timeout(() -> { if (hookBody != null) { hookBody.accept(scenario); } else { diff --git a/java8/src/main/java/cucumber/runtime/java8/Java8StepDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java similarity index 88% rename from java8/src/main/java/cucumber/runtime/java8/Java8StepDefinition.java rename to java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java index f85ec7c156..de0e9ba60a 100644 --- a/java8/src/main/java/cucumber/runtime/java8/Java8StepDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java @@ -1,21 +1,21 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; -import static cucumber.runtime.java8.ParameterInfo.fromTypes; +import static io.cucumber.java8.ParameterInfo.fromTypes; import static java.lang.String.format; import static net.jodah.typetools.TypeResolver.resolveRawArguments; -import io.cucumber.stepexpression.Argument; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.runtime.Invoker; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java8.StepdefBody; -import io.cucumber.stepexpression.ArgumentMatcher; -import cucumber.runtime.CucumberException; -import io.cucumber.stepexpression.ExpressionArgumentMatcher; -import cucumber.runtime.StepDefinition; -import io.cucumber.stepexpression.StepExpression; -import io.cucumber.stepexpression.StepExpressionFactory; -import cucumber.runtime.Utils; +import io.cucumber.core.stepexpression.ArgumentMatcher; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.StepExpression; +import io.cucumber.core.stepexpression.StepExpressionFactory; import gherkin.pickles.PickleStep; -import io.cucumber.stepexpression.TypeResolver; +import io.cucumber.core.stepexpression.TypeResolver; import java.lang.reflect.Method; import java.lang.reflect.Type; @@ -104,7 +104,7 @@ public Integer getParameterCount() { @Override public void execute(final Object[] args) throws Throwable { - Utils.invoke(body, method, timeoutMillis, args); + Invoker.invoke(body, method, timeoutMillis, args); } @Override diff --git a/java8/src/main/java/cucumber/runtime/java8/LambdaGlueBase.java b/java8/src/main/java/io/cucumber/java8/LambdaGlueBase.java similarity index 99% rename from java8/src/main/java/cucumber/runtime/java8/LambdaGlueBase.java rename to java8/src/main/java/io/cucumber/java8/LambdaGlueBase.java index b42ab674f0..c1110a0a6f 100644 --- a/java8/src/main/java/cucumber/runtime/java8/LambdaGlueBase.java +++ b/java8/src/main/java/io/cucumber/java8/LambdaGlueBase.java @@ -1,9 +1,9 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; import cucumber.api.java8.GlueBase; import cucumber.api.java8.HookBody; import cucumber.api.java8.HookNoArgsBody; -import cucumber.runtime.java.JavaBackend; +import io.cucumber.java.JavaBackend; public interface LambdaGlueBase extends GlueBase { diff --git a/java8/src/main/java/cucumber/runtime/java8/ParameterInfo.java b/java8/src/main/java/io/cucumber/java8/ParameterInfo.java similarity index 96% rename from java8/src/main/java/cucumber/runtime/java8/ParameterInfo.java rename to java8/src/main/java/io/cucumber/java8/ParameterInfo.java index cf25658446..36ed36b789 100644 --- a/java8/src/main/java/cucumber/runtime/java8/ParameterInfo.java +++ b/java8/src/main/java/io/cucumber/java8/ParameterInfo.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; import java.lang.annotation.Annotation; import java.lang.reflect.Type; diff --git a/java8/src/test/java/cucumber/runtime/java8/Java8AnonInnerClassStepDefinitionTest.java b/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java similarity index 95% rename from java8/src/test/java/cucumber/runtime/java8/Java8AnonInnerClassStepDefinitionTest.java rename to java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java index 0a38d0c0fb..8a8e0c55f4 100644 --- a/java8/src/test/java/cucumber/runtime/java8/Java8AnonInnerClassStepDefinitionTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java @@ -1,8 +1,8 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; import static org.junit.Assert.assertEquals; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java8.StepdefBody; import org.junit.Test; diff --git a/java8/src/test/java/cucumber/runtime/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java similarity index 89% rename from java8/src/test/java/cucumber/runtime/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java rename to java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java index 63e79a1cb4..0189e77298 100644 --- a/java8/src/test/java/cucumber/runtime/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java @@ -1,10 +1,10 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; -import io.cucumber.stepexpression.TypeRegistry; -import cucumber.runtime.HookDefinition; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.java.Function; -import cucumber.runtime.java.LambdaGlueRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.java.Function; +import io.cucumber.java.LambdaGlueRegistry; import org.hamcrest.CustomTypeSafeMatcher; import org.junit.Rule; import org.junit.Test; diff --git a/java8/src/test/java/cucumber/runtime/java8/Java8LambdaStepDefinitionTest.java b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java similarity index 93% rename from java8/src/test/java/cucumber/runtime/java8/Java8LambdaStepDefinitionTest.java rename to java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java index 82c96d01cc..6243478ca3 100644 --- a/java8/src/test/java/cucumber/runtime/java8/Java8LambdaStepDefinitionTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java @@ -1,10 +1,10 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; import static org.junit.Assert.assertEquals; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java8.StepdefBody; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import org.junit.Test; import java.util.List; diff --git a/java8/src/test/java/cucumber/runtime/java8/SomeLambdaStepDefs.java b/java8/src/test/java/io/cucumber/java8/SomeLambdaStepDefs.java similarity index 87% rename from java8/src/test/java/cucumber/runtime/java8/SomeLambdaStepDefs.java rename to java8/src/test/java/io/cucumber/java8/SomeLambdaStepDefs.java index 4332765c17..7a182f5531 100644 --- a/java8/src/test/java/cucumber/runtime/java8/SomeLambdaStepDefs.java +++ b/java8/src/test/java/io/cucumber/java8/SomeLambdaStepDefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java8; +package io.cucumber.java8; import cucumber.api.java8.En; diff --git a/java8/src/test/java/cucumber/runtime/java8/test/AnonInnerClassStepdefs.java b/java8/src/test/java/io/cucumber/java8/test/AnonInnerClassStepdefs.java similarity index 78% rename from java8/src/test/java/cucumber/runtime/java8/test/AnonInnerClassStepdefs.java rename to java8/src/test/java/io/cucumber/java8/test/AnonInnerClassStepdefs.java index d302f2c90d..ed0af031de 100644 --- a/java8/src/test/java/cucumber/runtime/java8/test/AnonInnerClassStepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/test/AnonInnerClassStepdefs.java @@ -1,14 +1,14 @@ -package cucumber.runtime.java8.test; +package io.cucumber.java8.test; import static org.junit.Assert.assertEquals; -import io.cucumber.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java8.GlueBase; import cucumber.api.java8.StepdefBody; -import cucumber.runtime.StepDefinition; -import cucumber.runtime.java.Function; -import cucumber.runtime.java.JavaBackend; -import cucumber.runtime.java8.Java8StepDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.java.Function; +import io.cucumber.java.JavaBackend; +import io.cucumber.java8.Java8StepDefinition; public class AnonInnerClassStepdefs implements GlueBase { diff --git a/java8/src/test/java/cucumber/runtime/java8/test/LambdaStepdefs.java b/java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java similarity index 99% rename from java8/src/test/java/cucumber/runtime/java8/test/LambdaStepdefs.java rename to java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java index e702d80b28..6c69f99a52 100644 --- a/java8/src/test/java/cucumber/runtime/java8/test/LambdaStepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java8.test; +package io.cucumber.java8.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; diff --git a/java8/src/test/java/cucumber/runtime/java8/test/RunCukesTest.java b/java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java similarity index 77% rename from java8/src/test/java/cucumber/runtime/java8/test/RunCukesTest.java rename to java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java index 507c5f5e17..fd66ea886a 100644 --- a/java8/src/test/java/cucumber/runtime/java8/test/RunCukesTest.java +++ b/java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java8.test; +package io.cucumber.java8.test; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/java8/src/test/java/cucumber/runtime/java8/test/TypeRegistryConfiguration.java b/java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java similarity index 89% rename from java8/src/test/java/cucumber/runtime/java8/test/TypeRegistryConfiguration.java rename to java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java index 871f8669f3..afc602a72e 100644 --- a/java8/src/test/java/cucumber/runtime/java8/test/TypeRegistryConfiguration.java +++ b/java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java @@ -1,9 +1,9 @@ -package cucumber.runtime.java8.test; +package io.cucumber.java8.test; import cucumber.api.TypeRegistryConfigurer; import cucumber.api.TypeRegistry; import io.cucumber.datatable.DataTableType; -import cucumber.runtime.java8.test.LambdaStepdefs.Person; +import io.cucumber.java8.test.LambdaStepdefs.Person; import java.util.Locale; import java.util.Map; diff --git a/java8/src/test/resources/cucumber/runtime/java8/test/anon-inner-class-step-definitions.feature b/java8/src/test/resources/io/cucumber/java8/test/anon-inner-class-step-definitions.feature similarity index 100% rename from java8/src/test/resources/cucumber/runtime/java8/test/anon-inner-class-step-definitions.feature rename to java8/src/test/resources/io/cucumber/java8/test/anon-inner-class-step-definitions.feature diff --git a/java8/src/test/resources/cucumber/runtime/java8/test/lambda-step-definitions.feature b/java8/src/test/resources/io/cucumber/java8/test/lambda-step-definitions.feature similarity index 100% rename from java8/src/test/resources/cucumber/runtime/java8/test/lambda-step-definitions.feature rename to java8/src/test/resources/io/cucumber/java8/test/lambda-step-definitions.feature From 2d9a68910d7312110ea3f026f139444108983007 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 19:37:59 +0200 Subject: [PATCH 005/155] [Kotlin] Introduce new package structure --- .../kotlin/test => io/cucumber/kotlin}/LambdaStepdefs.kt | 2 +- .../runtime/kotlin/test => io/cucumber/kotlin}/RunCukesTest.kt | 2 +- .../test => io/cucumber/kotlin}/TypeRegistryConfiguration.kt | 2 +- .../runtime/kotlin/test => io/cucumber/kotlin}/kotlin.feature | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename kotlin-java8/src/test/kotlin/{cucumber/runtime/kotlin/test => io/cucumber/kotlin}/LambdaStepdefs.kt (97%) rename kotlin-java8/src/test/kotlin/{cucumber/runtime/kotlin/test => io/cucumber/kotlin}/RunCukesTest.kt (74%) rename kotlin-java8/src/test/kotlin/{cucumber/runtime/kotlin/test => io/cucumber/kotlin}/TypeRegistryConfiguration.kt (95%) rename kotlin-java8/src/test/resources/{cucumber/runtime/kotlin/test => io/cucumber/kotlin}/kotlin.feature (100%) diff --git a/kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/LambdaStepdefs.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt similarity index 97% rename from kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/LambdaStepdefs.kt rename to kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt index 18688a8551..9d66dd11ae 100644 --- a/kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/LambdaStepdefs.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt @@ -1,4 +1,4 @@ -package cucumber.runtime.kotlin.test; +package io.cucumber.runtime.kotlin.test; import cucumber.api.Scenario import io.cucumber.datatable.DataTable diff --git a/kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/RunCukesTest.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt similarity index 74% rename from kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/RunCukesTest.kt rename to kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt index 77e63fff7f..24c891861d 100644 --- a/kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/RunCukesTest.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt @@ -1,4 +1,4 @@ -package cucumber.runtime.kotlin.test +package io.cucumber.runtime.kotlin.test import cucumber.api.junit.Cucumber import org.junit.runner.RunWith diff --git a/kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/TypeRegistryConfiguration.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt similarity index 95% rename from kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/TypeRegistryConfiguration.kt rename to kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt index f0957c7d44..8cdf678b63 100644 --- a/kotlin-java8/src/test/kotlin/cucumber/runtime/kotlin/test/TypeRegistryConfiguration.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt @@ -1,4 +1,4 @@ -package cucumber.runtime.kotlin.test +package io.cucumber.runtime.kotlin.test import cucumber.api.TypeRegistryConfigurer import cucumber.api.TypeRegistry diff --git a/kotlin-java8/src/test/resources/cucumber/runtime/kotlin/test/kotlin.feature b/kotlin-java8/src/test/resources/io/cucumber/kotlin/kotlin.feature similarity index 100% rename from kotlin-java8/src/test/resources/cucumber/runtime/kotlin/test/kotlin.feature rename to kotlin-java8/src/test/resources/io/cucumber/kotlin/kotlin.feature From d40f5932b2bdd8e1a7f26954ae6e10e861df9ec0 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 19:38:13 +0200 Subject: [PATCH 006/155] [TestNG] Introduce new package structure --- testng/README.md | 2 +- .../api/testng/CucumberExceptionWrapper.java | 2 +- .../testng/CucumberFeatureWrapperImpl.java | 2 +- .../api/testng/TestCaseResultListener.java | 4 +- .../api/testng/TestNGCucumberRunner.java | 51 +++++++++---------- .../AbstractTestNGCucumberTestsTest.java | 8 ++- .../testng/TestCaseResultListenerTest.java | 7 ++- .../api/testng/TestNGCucumberRunnerTest.java | 10 ++-- .../cucumber}/testng/RunCukesStrict.java | 2 +- .../cucumber}/testng/RunCukesTest.java | 2 +- .../RunFeatureWithThreeScenariosTest.java | 4 +- .../RunScenarioWithUndefinedStepsStrict.java | 4 +- .../cucumber/testng}/stub/StubBackend.java | 13 +++-- .../runtime => io/cucumber}/testng/fa.feature | 0 .../runtime => io/cucumber}/testng/fb.feature | 0 ..._same_steps_in_different_scenarios.feature | 0 .../cucumber}/testng/three_scenarios.feature | 0 .../cucumber}/testng/undefined_steps.feature | 0 18 files changed, 54 insertions(+), 57 deletions(-) rename testng/src/test/java/{cucumber/runtime => io/cucumber}/testng/RunCukesStrict.java (85%) rename testng/src/test/java/{cucumber/runtime => io/cucumber}/testng/RunCukesTest.java (78%) rename testng/src/test/java/{cucumber/runtime => io/cucumber}/testng/RunFeatureWithThreeScenariosTest.java (65%) rename testng/src/test/java/{cucumber/runtime => io/cucumber}/testng/RunScenarioWithUndefinedStepsStrict.java (67%) rename testng/src/test/java/{cucumber/runtime => io/cucumber/testng}/stub/StubBackend.java (73%) rename testng/src/test/resources/{cucumber/runtime => io/cucumber}/testng/fa.feature (100%) rename testng/src/test/resources/{cucumber/runtime => io/cucumber}/testng/fb.feature (100%) rename testng/src/test/resources/{cucumber/runtime => io/cucumber}/testng/feature_with_same_steps_in_different_scenarios.feature (100%) rename testng/src/test/resources/{cucumber/runtime => io/cucumber}/testng/three_scenarios.feature (100%) rename testng/src/test/resources/{cucumber/runtime => io/cucumber}/testng/undefined_steps.feature (100%) diff --git a/testng/README.md b/testng/README.md index f2305c049d..e6eb21bdb0 100644 --- a/testng/README.md +++ b/testng/README.md @@ -21,7 +21,7 @@ Add the `cucumber-testng` dependency to your pom. Create an empty class that extends the `AbstractTestNGCucumberTests`. ```java -package cucumber.runtime.testng; +package io.cucumber.runtime.testng; import cucumber.api.CucumberOptions; import cucumber.api.testng.AbstractTestNGCucumberTests; diff --git a/testng/src/main/java/cucumber/api/testng/CucumberExceptionWrapper.java b/testng/src/main/java/cucumber/api/testng/CucumberExceptionWrapper.java index ff50fdb7e7..397cef1b5d 100644 --- a/testng/src/main/java/cucumber/api/testng/CucumberExceptionWrapper.java +++ b/testng/src/main/java/cucumber/api/testng/CucumberExceptionWrapper.java @@ -1,6 +1,6 @@ package cucumber.api.testng; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import gherkin.events.PickleEvent; /** diff --git a/testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapperImpl.java b/testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapperImpl.java index 52389757c5..b2a3bee79b 100644 --- a/testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapperImpl.java +++ b/testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapperImpl.java @@ -1,6 +1,6 @@ package cucumber.api.testng; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.model.CucumberFeature; class CucumberFeatureWrapperImpl implements CucumberFeatureWrapper { private final CucumberFeature cucumberFeature; diff --git a/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java b/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java index 8e92460856..940be07045 100644 --- a/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java +++ b/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java @@ -3,8 +3,8 @@ import cucumber.api.Result; import cucumber.api.event.EventHandler; import cucumber.api.event.TestCaseFinished; -import cucumber.runner.EventBus; -import cucumber.runtime.CucumberException; +import io.cucumber.core.runner.EventBus; +import io.cucumber.core.exception.CucumberException; import org.testng.SkipException; class TestCaseResultListener { diff --git a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java b/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java index 3309314dea..874bce02b3 100644 --- a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java @@ -2,28 +2,28 @@ import cucumber.api.event.TestRunFinished; import cucumber.api.event.TestRunStarted; -import cucumber.runner.Runner; -import cucumber.runner.TimeServiceEventBus; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runtime.BackendModuleBackendSupplier; -import cucumber.runtime.ClassFinder; -import cucumber.runtime.CucumberException; -import cucumber.runtime.FeatureCompiler; -import cucumber.runtime.FeaturePathFeatureSupplier; -import cucumber.runtime.filter.Filters; -import cucumber.runtime.formatter.Plugins; -import cucumber.runtime.filter.RerunFilters; -import cucumber.runtime.formatter.PluginFactory; -import cucumber.runtime.model.FeatureLoader; -import cucumber.runner.ThreadLocalRunnerSupplier; -import cucumber.runtime.RuntimeOptions; -import cucumber.runtime.RuntimeOptionsFactory; -import cucumber.runtime.io.MultiLoader; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.io.ResourceLoaderClassFinder; -import cucumber.runtime.model.CucumberFeature; +import io.cucumber.core.runner.Runner; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.runner.EventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runtime.BackendModuleBackendSupplier; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.model.FeatureCompiler; +import io.cucumber.core.filter.Filters; +import io.cucumber.core.plugin.Plugins; +import io.cucumber.core.filter.RerunFilters; +import io.cucumber.core.plugin.PluginFactory; +import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.options.RuntimeOptionsFactory; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.model.CucumberFeature; import gherkin.events.PickleEvent; +import io.cucumber.core.runtime.FeaturePathFeatureSupplier; import java.util.ArrayList; import java.util.List; @@ -58,7 +58,7 @@ public TestNGCucumberRunner(Class clazz) { RerunFilters rerunFilters = new RerunFilters(runtimeOptions, featureLoader); filters = new Filters(runtimeOptions, rerunFilters); this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); - featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions); + featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions, bus); } public void runScenario(PickleEvent pickle) throws Throwable { @@ -103,12 +103,7 @@ public Object[][] provideScenarios() { } List getFeatures() { - - List features = featureSupplier.get(); bus.send(new TestRunStarted(bus.getTime())); - for (CucumberFeature feature : features) { - feature.sendTestSourceRead(bus); - } - return features; + return featureSupplier.get(); } } diff --git a/testng/src/test/java/cucumber/api/testng/AbstractTestNGCucumberTestsTest.java b/testng/src/test/java/cucumber/api/testng/AbstractTestNGCucumberTestsTest.java index 233807c3ed..a5420fd1f3 100644 --- a/testng/src/test/java/cucumber/api/testng/AbstractTestNGCucumberTestsTest.java +++ b/testng/src/test/java/cucumber/api/testng/AbstractTestNGCucumberTestsTest.java @@ -4,8 +4,12 @@ import java.util.List; import java.util.Set; -import cucumber.runtime.testng.RunFeatureWithThreeScenariosTest; +import io.cucumber.testng.RunFeatureWithThreeScenariosTest; import org.testng.Assert; +import org.testng.IInvokedMethod; +import org.testng.IInvokedMethodListener; +import org.testng.ITestNGListener; +import org.testng.ITestResult; import org.testng.TestNG; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -20,7 +24,7 @@ public final class AbstractTestNGCucumberTestsTest { public void setUp() { InvokedMethodListener icml = new InvokedMethodListener(); TestNG testNG = new TestNG(); - testNG.addListener(icml); + testNG.addListener((ITestNGListener)icml); testNG.setGroups("cucumber"); testNG.setTestClasses(new Class[]{RunFeatureWithThreeScenariosTest.class}); testNG.run(); diff --git a/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java b/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java index d4d38b243d..470bc161fd 100644 --- a/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java +++ b/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java @@ -2,14 +2,13 @@ import cucumber.api.PendingException; import cucumber.api.Result; -import cucumber.runner.EventBus; -import cucumber.runner.TimeService; -import cucumber.runner.TimeServiceEventBus; +import io.cucumber.core.runner.EventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; import org.testng.SkipException; import org.testng.annotations.Test; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNull; diff --git a/testng/src/test/java/cucumber/api/testng/TestNGCucumberRunnerTest.java b/testng/src/test/java/cucumber/api/testng/TestNGCucumberRunnerTest.java index b77df0059e..dc4aa10927 100644 --- a/testng/src/test/java/cucumber/api/testng/TestNGCucumberRunnerTest.java +++ b/testng/src/test/java/cucumber/api/testng/TestNGCucumberRunnerTest.java @@ -1,10 +1,10 @@ package cucumber.api.testng; -import cucumber.runtime.CucumberException; -import cucumber.runtime.model.CucumberFeature; -import cucumber.runtime.testng.RunCukesStrict; -import cucumber.runtime.testng.RunCukesTest; -import cucumber.runtime.testng.RunScenarioWithUndefinedStepsStrict; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.testng.RunCukesStrict; +import io.cucumber.testng.RunCukesTest; +import io.cucumber.testng.RunScenarioWithUndefinedStepsStrict; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; diff --git a/testng/src/test/java/cucumber/runtime/testng/RunCukesStrict.java b/testng/src/test/java/io/cucumber/testng/RunCukesStrict.java similarity index 85% rename from testng/src/test/java/cucumber/runtime/testng/RunCukesStrict.java rename to testng/src/test/java/io/cucumber/testng/RunCukesStrict.java index 5e8daee59f..71314ed61a 100644 --- a/testng/src/test/java/cucumber/runtime/testng/RunCukesStrict.java +++ b/testng/src/test/java/io/cucumber/testng/RunCukesStrict.java @@ -1,4 +1,4 @@ -package cucumber.runtime.testng; +package io.cucumber.testng; import cucumber.api.CucumberOptions; import cucumber.api.testng.AbstractTestNGCucumberTests; diff --git a/testng/src/test/java/cucumber/runtime/testng/RunCukesTest.java b/testng/src/test/java/io/cucumber/testng/RunCukesTest.java similarity index 78% rename from testng/src/test/java/cucumber/runtime/testng/RunCukesTest.java rename to testng/src/test/java/io/cucumber/testng/RunCukesTest.java index 7b4b8ed402..ed84a73808 100644 --- a/testng/src/test/java/cucumber/runtime/testng/RunCukesTest.java +++ b/testng/src/test/java/io/cucumber/testng/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.testng; +package io.cucumber.testng; import cucumber.api.testng.AbstractTestNGCucumberTests; diff --git a/testng/src/test/java/cucumber/runtime/testng/RunFeatureWithThreeScenariosTest.java b/testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java similarity index 65% rename from testng/src/test/java/cucumber/runtime/testng/RunFeatureWithThreeScenariosTest.java rename to testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java index 11a2b9138c..f6fbc8b216 100644 --- a/testng/src/test/java/cucumber/runtime/testng/RunFeatureWithThreeScenariosTest.java +++ b/testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java @@ -1,10 +1,10 @@ -package cucumber.runtime.testng; +package io.cucumber.testng; import cucumber.api.CucumberOptions; import cucumber.api.testng.AbstractTestNGCucumberTests; @CucumberOptions( - features = "classpath:cucumber/runtime/testng/three_scenarios.feature" + features = "classpath:io/cucumber/testng/three_scenarios.feature" ) public class RunFeatureWithThreeScenariosTest extends AbstractTestNGCucumberTests { } diff --git a/testng/src/test/java/cucumber/runtime/testng/RunScenarioWithUndefinedStepsStrict.java b/testng/src/test/java/io/cucumber/testng/RunScenarioWithUndefinedStepsStrict.java similarity index 67% rename from testng/src/test/java/cucumber/runtime/testng/RunScenarioWithUndefinedStepsStrict.java rename to testng/src/test/java/io/cucumber/testng/RunScenarioWithUndefinedStepsStrict.java index 44b676cf12..296367a68c 100644 --- a/testng/src/test/java/cucumber/runtime/testng/RunScenarioWithUndefinedStepsStrict.java +++ b/testng/src/test/java/io/cucumber/testng/RunScenarioWithUndefinedStepsStrict.java @@ -1,10 +1,10 @@ -package cucumber.runtime.testng; +package io.cucumber.testng; import cucumber.api.CucumberOptions; import cucumber.api.testng.AbstractTestNGCucumberTests; @CucumberOptions( - features = "classpath:cucumber/runtime/testng/undefined_steps.feature", + features = "classpath:io/cucumber/testng/undefined_steps.feature", strict = true ) public class RunScenarioWithUndefinedStepsStrict extends AbstractTestNGCucumberTests { diff --git a/testng/src/test/java/cucumber/runtime/stub/StubBackend.java b/testng/src/test/java/io/cucumber/testng/stub/StubBackend.java similarity index 73% rename from testng/src/test/java/cucumber/runtime/stub/StubBackend.java rename to testng/src/test/java/io/cucumber/testng/stub/StubBackend.java index f5948390df..0855bbfde6 100644 --- a/testng/src/test/java/cucumber/runtime/stub/StubBackend.java +++ b/testng/src/test/java/io/cucumber/testng/stub/StubBackend.java @@ -1,13 +1,12 @@ -package cucumber.runtime.stub; +package io.cucumber.runtime.stub; -import io.cucumber.stepexpression.TypeRegistry; -import cucumber.runtime.Backend; -import cucumber.runtime.Glue; -import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.snippets.FunctionNameGenerator; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; -import java.util.Collections; import java.util.List; import static java.util.Collections.singletonList; diff --git a/testng/src/test/resources/cucumber/runtime/testng/fa.feature b/testng/src/test/resources/io/cucumber/testng/fa.feature similarity index 100% rename from testng/src/test/resources/cucumber/runtime/testng/fa.feature rename to testng/src/test/resources/io/cucumber/testng/fa.feature diff --git a/testng/src/test/resources/cucumber/runtime/testng/fb.feature b/testng/src/test/resources/io/cucumber/testng/fb.feature similarity index 100% rename from testng/src/test/resources/cucumber/runtime/testng/fb.feature rename to testng/src/test/resources/io/cucumber/testng/fb.feature diff --git a/testng/src/test/resources/cucumber/runtime/testng/feature_with_same_steps_in_different_scenarios.feature b/testng/src/test/resources/io/cucumber/testng/feature_with_same_steps_in_different_scenarios.feature similarity index 100% rename from testng/src/test/resources/cucumber/runtime/testng/feature_with_same_steps_in_different_scenarios.feature rename to testng/src/test/resources/io/cucumber/testng/feature_with_same_steps_in_different_scenarios.feature diff --git a/testng/src/test/resources/cucumber/runtime/testng/three_scenarios.feature b/testng/src/test/resources/io/cucumber/testng/three_scenarios.feature similarity index 100% rename from testng/src/test/resources/cucumber/runtime/testng/three_scenarios.feature rename to testng/src/test/resources/io/cucumber/testng/three_scenarios.feature diff --git a/testng/src/test/resources/cucumber/runtime/testng/undefined_steps.feature b/testng/src/test/resources/io/cucumber/testng/undefined_steps.feature similarity index 100% rename from testng/src/test/resources/cucumber/runtime/testng/undefined_steps.feature rename to testng/src/test/resources/io/cucumber/testng/undefined_steps.feature From e2717c38836401f0fb7f22a1981f91e07d8a6437 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 19:38:23 +0200 Subject: [PATCH 007/155] [Pico] Introduce new package structure --- picocontainer/pom.xml | 2 +- .../src/main/java/cucumber/api/picocontainer/README.java | 5 ----- .../java => io/cucumber}/picocontainer/PicoFactory.java | 6 +++--- .../src/main/java/io/cucumber/picocontainer/README.java | 5 +++++ .../api => io/cucumber}/picocontainer/package.html | 0 .../cucumber}/picocontainer/DisposableCucumberBelly.java | 2 +- .../java => io/cucumber}/picocontainer/PicoFactoryTest.java | 2 +- .../java => io/cucumber}/picocontainer/RunCukesTest.java | 2 +- .../java => io/cucumber}/picocontainer/SanityTest.java | 5 ++--- .../java => io/cucumber}/picocontainer/SomeTest.java | 2 +- .../java => io/cucumber}/picocontainer/StepDefs.java | 2 +- .../java => io/cucumber}/picocontainer/UnusedGlue.java | 2 +- .../java => io/cucumber}/picocontainer/cukes.feature | 0 .../java => io/cucumber}/picocontainer/issue-225.feature | 0 14 files changed, 17 insertions(+), 18 deletions(-) delete mode 100644 picocontainer/src/main/java/cucumber/api/picocontainer/README.java rename picocontainer/src/main/java/{cucumber/runtime/java => io/cucumber}/picocontainer/PicoFactory.java (88%) create mode 100644 picocontainer/src/main/java/io/cucumber/picocontainer/README.java rename picocontainer/src/main/java/{cucumber/api => io/cucumber}/picocontainer/package.html (100%) rename picocontainer/src/test/java/{cucumber/runtime/java => io/cucumber}/picocontainer/DisposableCucumberBelly.java (95%) rename picocontainer/src/test/java/{cucumber/runtime/java => io/cucumber}/picocontainer/PicoFactoryTest.java (96%) rename picocontainer/src/test/java/{cucumber/runtime/java => io/cucumber}/picocontainer/RunCukesTest.java (73%) rename picocontainer/src/test/java/{cucumber/runtime/java => io/cucumber}/picocontainer/SanityTest.java (62%) rename picocontainer/src/test/java/{cucumber/runtime/java => io/cucumber}/picocontainer/SomeTest.java (79%) rename picocontainer/src/test/java/{cucumber/runtime/java => io/cucumber}/picocontainer/StepDefs.java (97%) rename picocontainer/src/test/java/{cucumber/runtime/java => io/cucumber}/picocontainer/UnusedGlue.java (89%) rename picocontainer/src/test/resources/{cucumber/runtime/java => io/cucumber}/picocontainer/cukes.feature (100%) rename picocontainer/src/test/resources/{cucumber/runtime/java => io/cucumber}/picocontainer/issue-225.feature (100%) diff --git a/picocontainer/pom.xml b/picocontainer/pom.xml index 4c77682bf6..8160338b55 100644 --- a/picocontainer/pom.xml +++ b/picocontainer/pom.xml @@ -58,7 +58,7 @@ - + diff --git a/picocontainer/src/main/java/cucumber/api/picocontainer/README.java b/picocontainer/src/main/java/cucumber/api/picocontainer/README.java deleted file mode 100644 index 934bbdb2d2..0000000000 --- a/picocontainer/src/main/java/cucumber/api/picocontainer/README.java +++ /dev/null @@ -1,5 +0,0 @@ -package cucumber.api.picocontainer; - - -public class README { -} diff --git a/picocontainer/src/main/java/cucumber/runtime/java/picocontainer/PicoFactory.java b/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java similarity index 88% rename from picocontainer/src/main/java/cucumber/runtime/java/picocontainer/PicoFactory.java rename to picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java index aeb50dfc1d..a11d9612b0 100644 --- a/picocontainer/src/main/java/cucumber/runtime/java/picocontainer/PicoFactory.java +++ b/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java @@ -1,7 +1,7 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.Utils; +import io.cucumber.core.reflection.Reflections; import org.picocontainer.MutablePicoContainer; import org.picocontainer.PicoBuilder; @@ -30,7 +30,7 @@ public void stop() { } public boolean addClass(Class clazz) { - if (Utils.isInstantiable(clazz) && classes.add(clazz)) { + if (Reflections.isInstantiable(clazz) && classes.add(clazz)) { addConstructorDependencies(clazz); } return true; diff --git a/picocontainer/src/main/java/io/cucumber/picocontainer/README.java b/picocontainer/src/main/java/io/cucumber/picocontainer/README.java new file mode 100644 index 0000000000..80d6123537 --- /dev/null +++ b/picocontainer/src/main/java/io/cucumber/picocontainer/README.java @@ -0,0 +1,5 @@ +package io.cucumber.picocontainer; + + +public class README { +} diff --git a/picocontainer/src/main/java/cucumber/api/picocontainer/package.html b/picocontainer/src/main/java/io/cucumber/picocontainer/package.html similarity index 100% rename from picocontainer/src/main/java/cucumber/api/picocontainer/package.html rename to picocontainer/src/main/java/io/cucumber/picocontainer/package.html diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/DisposableCucumberBelly.java b/picocontainer/src/test/java/io/cucumber/picocontainer/DisposableCucumberBelly.java similarity index 95% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/DisposableCucumberBelly.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/DisposableCucumberBelly.java index c6d8cc465b..09d09e7185 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/DisposableCucumberBelly.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/DisposableCucumberBelly.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; import org.picocontainer.Disposable; diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/PicoFactoryTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java similarity index 96% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/PicoFactoryTest.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java index fbbb6322f2..8ce2ecb797 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/PicoFactoryTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; import cucumber.api.java.ObjectFactory; import org.junit.Test; diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/RunCukesTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java similarity index 73% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/RunCukesTest.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java index cf2aba1dd6..e480d9ed14 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/RunCukesTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/SanityTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/SanityTest.java similarity index 62% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/SanityTest.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/SanityTest.java index d6dc669aa3..cc2a5b2e6f 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/SanityTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/SanityTest.java @@ -1,7 +1,6 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; -import cucumber.runtime.junit.SanityChecker; -import org.junit.Ignore; +import io.cucumber.junit.SanityChecker; import org.junit.Test; public class SanityTest { diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/SomeTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/SomeTest.java similarity index 79% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/SomeTest.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/SomeTest.java index 6782ba74d2..cd7f61c563 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/SomeTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/SomeTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; import org.junit.Test; diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/StepDefs.java b/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java similarity index 97% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/StepDefs.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java index 49302c392e..4c80017940 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/StepDefs.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; import cucumber.api.PendingException; import cucumber.api.Scenario; diff --git a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/UnusedGlue.java b/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java similarity index 89% rename from picocontainer/src/test/java/cucumber/runtime/java/picocontainer/UnusedGlue.java rename to picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java index 613fd27397..ebdd900f52 100644 --- a/picocontainer/src/test/java/cucumber/runtime/java/picocontainer/UnusedGlue.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.picocontainer; +package io.cucumber.picocontainer; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/picocontainer/src/test/resources/cucumber/runtime/java/picocontainer/cukes.feature b/picocontainer/src/test/resources/io/cucumber/picocontainer/cukes.feature similarity index 100% rename from picocontainer/src/test/resources/cucumber/runtime/java/picocontainer/cukes.feature rename to picocontainer/src/test/resources/io/cucumber/picocontainer/cukes.feature diff --git a/picocontainer/src/test/resources/cucumber/runtime/java/picocontainer/issue-225.feature b/picocontainer/src/test/resources/io/cucumber/picocontainer/issue-225.feature similarity index 100% rename from picocontainer/src/test/resources/cucumber/runtime/java/picocontainer/issue-225.feature rename to picocontainer/src/test/resources/io/cucumber/picocontainer/issue-225.feature From 8347f9be6f1d8d0e25d6e81804bc7569bbc40980 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 19:38:40 +0200 Subject: [PATCH 008/155] [Spring] Introduce new package structure --- .../cucumber}/spring/GlueCodeContext.java | 2 +- .../cucumber}/spring/GlueCodeScope.java | 2 +- .../cucumber}/spring/SpringFactory.java | 4 +- .../spring/contextconfig/RunCukesTest.java | 17 --------- .../dirtiescontextconfig/RunCukesTest.java | 12 ------ .../cucumber}/spring/SpringFactoryTest.java | 38 ++++++++++--------- .../cucumber}/spring/beans/Belly.java | 2 +- .../cucumber}/spring/beans/BellyBean.java | 2 +- .../spring/beans/DummyComponent.java | 2 +- .../beans/PlatformTransactionManagerImpl.java | 2 +- .../spring/beans/TestController.java | 2 +- .../spring/commonglue/AnotherStepDef.java | 2 +- .../AutowiresPlatformTransactionManager.java | 2 +- .../commonglue/AutowiresThirdStepDef.java | 2 +- .../spring/commonglue/OneStepDef.java | 2 +- .../spring/commonglue/ThirdStepDef.java | 2 +- .../commonglue/TransactionStepDefs.java | 2 +- .../spring/commonglue}/UnusedGlue.java | 2 +- .../WithComponentAnnotation.java | 6 +-- .../WithControllerAnnotation.java | 5 +-- .../spring/contextconfig/BellyStepdefs.java | 6 +-- .../spring/contextconfig/RunCukesTest.java | 17 +++++++++ .../contextconfig/WithSpringAnnotations.java | 4 +- .../WithContextHierarchyAnnotation.java | 4 +- .../DirtiesContextBellyStepDefs.java | 6 +-- .../dirtiescontextconfig/RunCukesTest.java | 12 ++++++ .../hooks/SpringTransactionHooksTest.java | 12 ++++-- .../DirtiesContextBellyMetaStepDefs.java | 6 +-- .../dirties/DirtiesMetaConfiguration.java | 2 +- .../metaconfig/dirties/RunCukesTest.java | 4 +- .../metaconfig/general/BellyMetaStepdefs.java | 6 +-- .../metaconfig/general/MetaConfiguration.java | 2 +- .../metaconfig/general/RunCukesTest.java | 4 +- .../threading/RunParallelCukesTest.java | 6 +-- .../spring/threading/ThreadingStepDefs.java | 2 +- .../spring/webappconfig/RunCukesTest.java | 4 +- .../webappconfig/SpringInjectionStepDefs.java | 2 +- .../src/test/resources/applicationContext.xml | 6 +-- spring/src/test/resources/cucumber.xml | 2 +- .../cucumber}/spring/dirtyCukes.feature | 0 .../dirtyCukesWithMetaConfiguration.feature | 0 .../spring/springBeanInjection.feature | 0 ...BeanInjectionWithMetaConfiguration.feature | 0 .../spring/springWebContextInjection.feature | 0 .../cucumber}/spring/stepdefInjection.feature | 0 .../cucumber}/spring/threadingCukes.feature | 0 .../cucumber}/spring/transaction.feature | 0 47 files changed, 110 insertions(+), 107 deletions(-) rename spring/src/main/java/{cucumber/runtime/java => io/cucumber}/spring/GlueCodeContext.java (97%) rename spring/src/main/java/{cucumber/runtime/java => io/cucumber}/spring/GlueCodeScope.java (96%) rename spring/src/main/java/{cucumber/runtime/java => io/cucumber}/spring/SpringFactory.java (99%) delete mode 100644 spring/src/test/java/cucumber/runtime/java/spring/contextconfig/RunCukesTest.java delete mode 100644 spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/RunCukesTest.java rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/SpringFactoryTest.java (84%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/beans/Belly.java (84%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/beans/BellyBean.java (80%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/beans/DummyComponent.java (68%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/beans/PlatformTransactionManagerImpl.java (95%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/beans/TestController.java (91%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/commonglue/AnotherStepDef.java (90%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/commonglue/AutowiresPlatformTransactionManager.java (88%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/commonglue/AutowiresThirdStepDef.java (83%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/commonglue/OneStepDef.java (93%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/commonglue/ThirdStepDef.java (87%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/commonglue/TransactionStepDefs.java (96%) rename {guice/src/test/java/cucumber/runtime/java/guice/integration => spring/src/test/java/io/cucumber/spring/commonglue}/UnusedGlue.java (88%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/componentannotation/WithComponentAnnotation.java (62%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/componentannotation/WithControllerAnnotation.java (70%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/contextconfig/BellyStepdefs.java (81%) create mode 100644 spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/contextconfig/WithSpringAnnotations.java (85%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java (83%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java (88%) create mode 100644 spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/hooks/SpringTransactionHooksTest.java (91%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java (87%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/metaconfig/dirties/DirtiesMetaConfiguration.java (88%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/metaconfig/dirties/RunCukesTest.java (60%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/metaconfig/general/BellyMetaStepdefs.java (79%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/metaconfig/general/MetaConfiguration.java (86%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/metaconfig/general/RunCukesTest.java (66%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/threading/RunParallelCukesTest.java (85%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/threading/ThreadingStepDefs.java (97%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/webappconfig/RunCukesTest.java (61%) rename spring/src/test/java/{cucumber/runtime/java => io/cucumber}/spring/webappconfig/SpringInjectionStepDefs.java (96%) rename spring/src/test/resources/{cucumber/runtime/java => io/cucumber}/spring/dirtyCukes.feature (100%) rename spring/src/test/resources/{cucumber/runtime/java => io/cucumber}/spring/dirtyCukesWithMetaConfiguration.feature (100%) rename spring/src/test/resources/{cucumber/runtime/java => io/cucumber}/spring/springBeanInjection.feature (100%) rename spring/src/test/resources/{cucumber/runtime/java => io/cucumber}/spring/springBeanInjectionWithMetaConfiguration.feature (100%) rename spring/src/test/resources/{cucumber/runtime/java => io/cucumber}/spring/springWebContextInjection.feature (100%) rename spring/src/test/resources/{cucumber/runtime/java => io/cucumber}/spring/stepdefInjection.feature (100%) rename spring/src/test/resources/{cucumber/runtime/java => io/cucumber}/spring/threadingCukes.feature (100%) rename spring/src/test/resources/{cucumber/runtime/java => io/cucumber}/spring/transaction.feature (100%) diff --git a/spring/src/main/java/cucumber/runtime/java/spring/GlueCodeContext.java b/spring/src/main/java/io/cucumber/spring/GlueCodeContext.java similarity index 97% rename from spring/src/main/java/cucumber/runtime/java/spring/GlueCodeContext.java rename to spring/src/main/java/io/cucumber/spring/GlueCodeContext.java index e400e0ed58..30765dfdca 100644 --- a/spring/src/main/java/cucumber/runtime/java/spring/GlueCodeContext.java +++ b/spring/src/main/java/io/cucumber/spring/GlueCodeContext.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring; +package io.cucumber.spring; import java.util.HashMap; import java.util.Map; diff --git a/spring/src/main/java/cucumber/runtime/java/spring/GlueCodeScope.java b/spring/src/main/java/io/cucumber/spring/GlueCodeScope.java similarity index 96% rename from spring/src/main/java/cucumber/runtime/java/spring/GlueCodeScope.java rename to spring/src/main/java/io/cucumber/spring/GlueCodeScope.java index 61d2bcc4ae..2c0822bb6c 100644 --- a/spring/src/main/java/cucumber/runtime/java/spring/GlueCodeScope.java +++ b/spring/src/main/java/io/cucumber/spring/GlueCodeScope.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring; +package io.cucumber.spring; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.config.Scope; diff --git a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java b/spring/src/main/java/io/cucumber/spring/SpringFactory.java similarity index 99% rename from spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java rename to spring/src/main/java/io/cucumber/spring/SpringFactory.java index 067654fe30..8466867f3f 100644 --- a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java +++ b/spring/src/main/java/io/cucumber/spring/SpringFactory.java @@ -1,11 +1,11 @@ -package cucumber.runtime.java.spring; +package io.cucumber.spring; import static java.util.Arrays.asList; import static org.springframework.test.context.FixBootstrapUtils.createBootstrapContext; import static org.springframework.test.context.FixBootstrapUtils.resolveTestContextBootstrapper; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/RunCukesTest.java deleted file mode 100644 index 2ca572b61c..0000000000 --- a/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/RunCukesTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package cucumber.runtime.java.spring.contextconfig; - -import cucumber.api.CucumberOptions; - -import cucumber.api.junit.Cucumber; -import org.junit.runner.RunWith; - -@RunWith(Cucumber.class) -@CucumberOptions(glue = {"cucumber.runtime.java.spring.contextconfig", - "cucumber.runtime.java.spring.commonglue", - "cucumber.api.spring"}, - features = {"classpath:cucumber/runtime/java/spring/cukes.feature", - "classpath:cucumber/runtime/java/spring/xmlBasedSpring.feature", - "classpath:cucumber/runtime/java/spring/stepdefInjection.feature", - "classpath:cucumber/runtime/java/spring/transaction.feature"}) -public class RunCukesTest { -} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/RunCukesTest.java deleted file mode 100644 index 11b1548ab9..0000000000 --- a/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/RunCukesTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package cucumber.runtime.java.spring.dirtiescontextconfig; - -import cucumber.api.CucumberOptions; - -import cucumber.api.junit.Cucumber; -import org.junit.runner.RunWith; - -@RunWith(Cucumber.class) -@CucumberOptions(glue = {"cucumber.runtime.java.spring.dirtiescontextconfig"}, - features = {"classpath:cucumber/runtime/java/spring/dirtyCukes.feature"}) -public class RunCukesTest { -} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java b/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java similarity index 84% rename from spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java rename to spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java index f7ac3342b0..2e5ccc5174 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java +++ b/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java @@ -1,20 +1,20 @@ -package cucumber.runtime.java.spring; +package io.cucumber.spring; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.java.spring.beans.BellyBean; -import cucumber.runtime.java.spring.commonglue.AutowiresPlatformTransactionManager; -import cucumber.runtime.java.spring.commonglue.AutowiresThirdStepDef; -import cucumber.runtime.java.spring.commonglue.OneStepDef; -import cucumber.runtime.java.spring.commonglue.ThirdStepDef; -import cucumber.runtime.java.spring.componentannotation.WithComponentAnnotation; -import cucumber.runtime.java.spring.componentannotation.WithControllerAnnotation; -import cucumber.runtime.java.spring.metaconfig.general.BellyMetaStepdefs; -import cucumber.runtime.java.spring.contextconfig.BellyStepdefs; -import cucumber.runtime.java.spring.contextconfig.WithSpringAnnotations; -import cucumber.runtime.java.spring.contexthierarchyconfig.WithContextHierarchyAnnotation; -import cucumber.runtime.java.spring.dirtiescontextconfig.DirtiesContextBellyStepDefs; -import cucumber.runtime.java.spring.metaconfig.dirties.DirtiesContextBellyMetaStepDefs; +import io.cucumber.spring.beans.BellyBean; +import io.cucumber.spring.commonglue.AutowiresPlatformTransactionManager; +import io.cucumber.spring.commonglue.AutowiresThirdStepDef; +import io.cucumber.spring.commonglue.OneStepDef; +import io.cucumber.spring.commonglue.ThirdStepDef; +import io.cucumber.spring.componentannotation.WithComponentAnnotation; +import io.cucumber.spring.componentannotation.WithControllerAnnotation; +import io.cucumber.spring.metaconfig.general.BellyMetaStepdefs; +import io.cucumber.spring.contextconfig.BellyStepdefs; +import io.cucumber.spring.contextconfig.WithSpringAnnotations; +import io.cucumber.spring.contexthierarchyconfig.WithContextHierarchyAnnotation; +import io.cucumber.spring.dirtiescontextconfig.DirtiesContextBellyStepDefs; +import io.cucumber.spring.metaconfig.dirties.DirtiesContextBellyMetaStepDefs; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -243,7 +243,9 @@ public void shouldUseCucumberXmlIfNoClassWithSpringAnnotationIsFound() { @Test public void shouldFailIfMultipleClassesWithSpringAnnotationsAreFound() { expectedException.expect(CucumberException.class); - expectedException.expectMessage("Glue class class cucumber.runtime.java.spring.contextconfig.BellyStepdefs and class cucumber.runtime.java.spring.contextconfig.WithSpringAnnotations both attempt to configure the spring context"); + + + expectedException.expectMessage("Glue class class io.cucumber.spring.contextconfig.BellyStepdefs and class io.cucumber.spring.contextconfig.WithSpringAnnotations both attempt to configure the spring context"); final ObjectFactory factory = new SpringFactory(); factory.addClass(WithSpringAnnotations.class); factory.addClass(BellyStepdefs.class); @@ -252,7 +254,7 @@ public void shouldFailIfMultipleClassesWithSpringAnnotationsAreFound() { @Test public void shouldFailIfClassWithSpringComponentAnnotationsIsFound() { expectedException.expect(CucumberException.class); - expectedException.expectMessage("Glue class cucumber.runtime.java.spring.componentannotation.WithComponentAnnotation was annotated with @Component"); + expectedException.expectMessage("Glue class io.cucumber.spring.componentannotation.WithComponentAnnotation was annotated with @Component"); expectedException.expectMessage("Please remove the @Component annotation"); final ObjectFactory factory = new SpringFactory(); factory.addClass(WithComponentAnnotation.class); @@ -261,7 +263,7 @@ public void shouldFailIfClassWithSpringComponentAnnotationsIsFound() { @Test public void shouldFailIfClassWithAnnotationAnnotatedWithSpringComponentAnnotationsIsFound() { expectedException.expect(CucumberException.class); - expectedException.expectMessage("Glue class cucumber.runtime.java.spring.componentannotation.WithControllerAnnotation was annotated with @Controller"); + expectedException.expectMessage("Glue class io.cucumber.spring.componentannotation.WithControllerAnnotation was annotated with @Controller"); expectedException.expectMessage("Please remove the @Controller annotation"); final ObjectFactory factory = new SpringFactory(); factory.addClass(WithControllerAnnotation.class); diff --git a/spring/src/test/java/cucumber/runtime/java/spring/beans/Belly.java b/spring/src/test/java/io/cucumber/spring/beans/Belly.java similarity index 84% rename from spring/src/test/java/cucumber/runtime/java/spring/beans/Belly.java rename to spring/src/test/java/io/cucumber/spring/beans/Belly.java index 8126b1ef80..697a881f73 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/beans/Belly.java +++ b/spring/src/test/java/io/cucumber/spring/beans/Belly.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.beans; +package io.cucumber.spring.beans; import org.springframework.stereotype.Component; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/beans/BellyBean.java b/spring/src/test/java/io/cucumber/spring/beans/BellyBean.java similarity index 80% rename from spring/src/test/java/cucumber/runtime/java/spring/beans/BellyBean.java rename to spring/src/test/java/io/cucumber/spring/beans/BellyBean.java index 93c59c7abe..fafa3b5d84 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/beans/BellyBean.java +++ b/spring/src/test/java/io/cucumber/spring/beans/BellyBean.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.beans; +package io.cucumber.spring.beans; public class BellyBean { diff --git a/spring/src/test/java/cucumber/runtime/java/spring/beans/DummyComponent.java b/spring/src/test/java/io/cucumber/spring/beans/DummyComponent.java similarity index 68% rename from spring/src/test/java/cucumber/runtime/java/spring/beans/DummyComponent.java rename to spring/src/test/java/io/cucumber/spring/beans/DummyComponent.java index 50fe8cda6e..4cfc741fd6 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/beans/DummyComponent.java +++ b/spring/src/test/java/io/cucumber/spring/beans/DummyComponent.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.beans; +package io.cucumber.spring.beans; import org.springframework.stereotype.Component; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/beans/PlatformTransactionManagerImpl.java b/spring/src/test/java/io/cucumber/spring/beans/PlatformTransactionManagerImpl.java similarity index 95% rename from spring/src/test/java/cucumber/runtime/java/spring/beans/PlatformTransactionManagerImpl.java rename to spring/src/test/java/io/cucumber/spring/beans/PlatformTransactionManagerImpl.java index 9961056a18..2ca3c71f62 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/beans/PlatformTransactionManagerImpl.java +++ b/spring/src/test/java/io/cucumber/spring/beans/PlatformTransactionManagerImpl.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.beans; +package io.cucumber.spring.beans; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.PlatformTransactionManager; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/beans/TestController.java b/spring/src/test/java/io/cucumber/spring/beans/TestController.java similarity index 91% rename from spring/src/test/java/cucumber/runtime/java/spring/beans/TestController.java rename to spring/src/test/java/io/cucumber/spring/beans/TestController.java index 118d30408a..d59fdf8474 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/beans/TestController.java +++ b/spring/src/test/java/io/cucumber/spring/beans/TestController.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.beans; +package io.cucumber.spring.beans; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AnotherStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java similarity index 90% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/AnotherStepDef.java rename to spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java index 473086a530..c4c8e11464 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AnotherStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.spring.commonglue; import cucumber.api.java.en.Then; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresPlatformTransactionManager.java b/spring/src/test/java/io/cucumber/spring/commonglue/AutowiresPlatformTransactionManager.java similarity index 88% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresPlatformTransactionManager.java rename to spring/src/test/java/io/cucumber/spring/commonglue/AutowiresPlatformTransactionManager.java index 8b15b85e87..9cebda154e 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresPlatformTransactionManager.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/AutowiresPlatformTransactionManager.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.spring.commonglue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.PlatformTransactionManager; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresThirdStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/AutowiresThirdStepDef.java similarity index 83% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresThirdStepDef.java rename to spring/src/test/java/io/cucumber/spring/commonglue/AutowiresThirdStepDef.java index 5ed22fda3d..fcac7188ef 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresThirdStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/AutowiresThirdStepDef.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.spring.commonglue; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/OneStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java similarity index 93% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/OneStepDef.java rename to spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java index 0dcb460b2d..9615dbc58a 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/OneStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.spring.commonglue; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/ThirdStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java similarity index 87% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/ThirdStepDef.java rename to spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java index d0cfdce7ff..da60dd40a5 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/ThirdStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.spring.commonglue; import cucumber.api.java.en.Then; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/TransactionStepDefs.java b/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java similarity index 96% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/TransactionStepDefs.java rename to spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java index 849f3bce7c..4e1d25c44e 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/TransactionStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.spring.commonglue; import cucumber.api.java.After; import cucumber.api.java.Before; diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/UnusedGlue.java b/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java similarity index 88% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/UnusedGlue.java rename to spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java index 2847c71ec5..464fab2877 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/UnusedGlue.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.spring.commonglue; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/componentannotation/WithComponentAnnotation.java b/spring/src/test/java/io/cucumber/spring/componentannotation/WithComponentAnnotation.java similarity index 62% rename from spring/src/test/java/cucumber/runtime/java/spring/componentannotation/WithComponentAnnotation.java rename to spring/src/test/java/io/cucumber/spring/componentannotation/WithComponentAnnotation.java index b312d3836a..c0c4b4925b 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/componentannotation/WithComponentAnnotation.java +++ b/spring/src/test/java/io/cucumber/spring/componentannotation/WithComponentAnnotation.java @@ -1,10 +1,8 @@ -package cucumber.runtime.java.spring.componentannotation; +package io.cucumber.spring.componentannotation; -import cucumber.runtime.java.spring.beans.DummyComponent; +import io.cucumber.spring.beans.DummyComponent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.ContextHierarchy; @Component public class WithComponentAnnotation { diff --git a/spring/src/test/java/cucumber/runtime/java/spring/componentannotation/WithControllerAnnotation.java b/spring/src/test/java/io/cucumber/spring/componentannotation/WithControllerAnnotation.java similarity index 70% rename from spring/src/test/java/cucumber/runtime/java/spring/componentannotation/WithControllerAnnotation.java rename to spring/src/test/java/io/cucumber/spring/componentannotation/WithControllerAnnotation.java index 3cf24e485c..ba17c6765e 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/componentannotation/WithControllerAnnotation.java +++ b/spring/src/test/java/io/cucumber/spring/componentannotation/WithControllerAnnotation.java @@ -1,9 +1,8 @@ -package cucumber.runtime.java.spring.componentannotation; +package io.cucumber.spring.componentannotation; -import cucumber.runtime.java.spring.beans.DummyComponent; +import io.cucumber.spring.beans.DummyComponent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.stereotype.Repository; @Controller public class WithControllerAnnotation { diff --git a/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/BellyStepdefs.java b/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java similarity index 81% rename from spring/src/test/java/cucumber/runtime/java/spring/contextconfig/BellyStepdefs.java rename to spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java index 52e1a2e1ab..232bce423d 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/BellyStepdefs.java +++ b/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java @@ -1,8 +1,8 @@ -package cucumber.runtime.java.spring.contextconfig; +package io.cucumber.spring.contextconfig; import cucumber.api.java.en.Then; -import cucumber.runtime.java.spring.beans.Belly; -import cucumber.runtime.java.spring.beans.BellyBean; +import io.cucumber.spring.beans.Belly; +import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; diff --git a/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java new file mode 100644 index 0000000000..399d314609 --- /dev/null +++ b/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java @@ -0,0 +1,17 @@ +package io.cucumber.spring.contextconfig; + +import cucumber.api.CucumberOptions; + +import cucumber.api.junit.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(glue = {"cucumber.runtime.java.spring.contextconfig", + "cucumber.runtime.java.spring.commonglue", + "cucumber.api.spring"}, + features = {"classpath:io/cucumber/spring/cukes.feature", + "classpath:io/cucumber/spring/xmlBasedSpring.feature", + "classpath:io/cucumber/spring/stepdefInjection.feature", + "classpath:io/cucumber/spring/transaction.feature"}) +public class RunCukesTest { +} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/WithSpringAnnotations.java b/spring/src/test/java/io/cucumber/spring/contextconfig/WithSpringAnnotations.java similarity index 85% rename from spring/src/test/java/cucumber/runtime/java/spring/contextconfig/WithSpringAnnotations.java rename to spring/src/test/java/io/cucumber/spring/contextconfig/WithSpringAnnotations.java index a43c91a677..427f578234 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/WithSpringAnnotations.java +++ b/spring/src/test/java/io/cucumber/spring/contextconfig/WithSpringAnnotations.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.spring.contextconfig; +package io.cucumber.spring.contextconfig; -import cucumber.runtime.java.spring.beans.DummyComponent; +import io.cucumber.spring.beans.DummyComponent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.test.context.ContextConfiguration; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java b/spring/src/test/java/io/cucumber/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java similarity index 83% rename from spring/src/test/java/cucumber/runtime/java/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java rename to spring/src/test/java/io/cucumber/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java index 26367de653..8a0b3023ae 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java +++ b/spring/src/test/java/io/cucumber/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.spring.contexthierarchyconfig; +package io.cucumber.spring.contexthierarchyconfig; -import cucumber.runtime.java.spring.beans.DummyComponent; +import io.cucumber.spring.beans.DummyComponent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextHierarchy; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java similarity index 88% rename from spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java rename to spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java index 72b56c1505..bd492d0fed 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java @@ -1,9 +1,9 @@ -package cucumber.runtime.java.spring.dirtiescontextconfig; +package io.cucumber.spring.dirtiescontextconfig; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; -import cucumber.runtime.java.spring.beans.Belly; -import cucumber.runtime.java.spring.beans.BellyBean; +import io.cucumber.spring.beans.Belly; +import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; diff --git a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java new file mode 100644 index 0000000000..a468972d1c --- /dev/null +++ b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java @@ -0,0 +1,12 @@ +package io.cucumber.spring.dirtiescontextconfig; + +import cucumber.api.CucumberOptions; + +import cucumber.api.junit.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(glue = {"io.cucumber.spring.dirtiescontextconfig"}, + features = {"classpath:io/cucumber/spring/dirtyCukes.feature"}) +public class RunCukesTest { +} diff --git a/spring/src/test/java/cucumber/runtime/java/spring/hooks/SpringTransactionHooksTest.java b/spring/src/test/java/io/cucumber/spring/hooks/SpringTransactionHooksTest.java similarity index 91% rename from spring/src/test/java/cucumber/runtime/java/spring/hooks/SpringTransactionHooksTest.java rename to spring/src/test/java/io/cucumber/spring/hooks/SpringTransactionHooksTest.java index b16a98d29b..4d5f50b078 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/hooks/SpringTransactionHooksTest.java +++ b/spring/src/test/java/io/cucumber/spring/hooks/SpringTransactionHooksTest.java @@ -1,11 +1,12 @@ -package cucumber.runtime.java.spring.hooks; +package io.cucumber.spring.hooks; import cucumber.api.spring.SpringTransactionHooks; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.springframework.beans.factory.BeanFactory; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; @@ -15,10 +16,13 @@ import static org.mockito.Mockito.isA; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.mockito.quality.Strictness.STRICT_STUBS; -@RunWith(MockitoJUnitRunner.class) public class SpringTransactionHooksTest { + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule().strictness(STRICT_STUBS); + private SpringTransactionHooks target; @Mock diff --git a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java similarity index 87% rename from spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java rename to spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java index eb2e416f18..22ad364a39 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java @@ -1,9 +1,9 @@ -package cucumber.runtime.java.spring.metaconfig.dirties; +package io.cucumber.spring.metaconfig.dirties; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; -import cucumber.runtime.java.spring.beans.Belly; -import cucumber.runtime.java.spring.beans.BellyBean; +import io.cucumber.spring.beans.Belly; +import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; import static org.junit.Assert.assertEquals; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/DirtiesMetaConfiguration.java b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesMetaConfiguration.java similarity index 88% rename from spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/DirtiesMetaConfiguration.java rename to spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesMetaConfiguration.java index 1b313c1425..952595be9d 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/DirtiesMetaConfiguration.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesMetaConfiguration.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.metaconfig.dirties; +package io.cucumber.spring.metaconfig.dirties; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java similarity index 60% rename from spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/RunCukesTest.java rename to spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java index 15508ac52f..65a203aeed 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/dirties/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.metaconfig.dirties; +package io.cucumber.spring.metaconfig.dirties; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; @@ -6,6 +6,6 @@ @RunWith(Cucumber.class) @CucumberOptions(glue = {"cucumber.runtime.java.spring.metaconfig.dirties"}, - features = {"classpath:cucumber/runtime/java/spring/dirtyCukesWithMetaConfiguration.feature"}) + features = {"classpath:io/cucumber/spring/dirtyCukesWithMetaConfiguration.feature"}) public class RunCukesTest { } diff --git a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/BellyMetaStepdefs.java b/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java similarity index 79% rename from spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/BellyMetaStepdefs.java rename to spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java index 74b7916e0c..a613865994 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/BellyMetaStepdefs.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java @@ -1,8 +1,8 @@ -package cucumber.runtime.java.spring.metaconfig.general; +package io.cucumber.spring.metaconfig.general; import cucumber.api.java.en.Then; -import cucumber.runtime.java.spring.beans.Belly; -import cucumber.runtime.java.spring.beans.BellyBean; +import io.cucumber.spring.beans.Belly; +import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; import static org.junit.Assert.assertNotNull; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/MetaConfiguration.java b/spring/src/test/java/io/cucumber/spring/metaconfig/general/MetaConfiguration.java similarity index 86% rename from spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/MetaConfiguration.java rename to spring/src/test/java/io/cucumber/spring/metaconfig/general/MetaConfiguration.java index f7e82f8c72..c66d492f50 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/MetaConfiguration.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/general/MetaConfiguration.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.metaconfig.general; +package io.cucumber.spring.metaconfig.general; import org.springframework.test.context.ContextConfiguration; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java similarity index 66% rename from spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/RunCukesTest.java rename to spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java index ddb3306432..ee2b1acdd3 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/metaconfig/general/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.metaconfig.general; +package io.cucumber.spring.metaconfig.general; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; @@ -8,6 +8,6 @@ @CucumberOptions(glue = {"cucumber.runtime.java.spring.metaconfig.general", "cucumber.runtime.java.spring.commonglue", "cucumber.api.spring"}, - features = {"classpath:cucumber/runtime/java/spring/springBeanInjectionWithMetaConfiguration.feature"}) + features = {"classpath:io/cucumber/spring/springBeanInjectionWithMetaConfiguration.feature"}) public class RunCukesTest { } diff --git a/spring/src/test/java/cucumber/runtime/java/spring/threading/RunParallelCukesTest.java b/spring/src/test/java/io/cucumber/spring/threading/RunParallelCukesTest.java similarity index 85% rename from spring/src/test/java/cucumber/runtime/java/spring/threading/RunParallelCukesTest.java rename to spring/src/test/java/io/cucumber/spring/threading/RunParallelCukesTest.java index a11673b61b..b51dac867f 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/threading/RunParallelCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/threading/RunParallelCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.threading; +package io.cucumber.spring.threading; import static java.util.concurrent.Executors.newFixedThreadPool; import static org.junit.Assert.assertEquals; @@ -19,8 +19,8 @@ public class RunParallelCukesTest { public Byte call() throws Exception { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); String[] args = { - "--glue", "cucumber.runtime.java.spring.threading", - "classpath:cucumber/runtime/java/spring/threadingCukes.feature", + "--glue", "io.cucumber.spring.threading", + "classpath:io/cucumber/spring/threadingCukes.feature", "--strict" }; return Main.run(args, classLoader); diff --git a/spring/src/test/java/cucumber/runtime/java/spring/threading/ThreadingStepDefs.java b/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java similarity index 97% rename from spring/src/test/java/cucumber/runtime/java/spring/threading/ThreadingStepDefs.java rename to spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java index ad38f9dd90..0680343519 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/threading/ThreadingStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.threading; +package io.cucumber.spring.threading; import static java.lang.Thread.currentThread; import static org.junit.Assert.assertEquals; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java similarity index 61% rename from spring/src/test/java/cucumber/runtime/java/spring/webappconfig/RunCukesTest.java rename to spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java index 8a79f5ff47..662ea1f10a 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.webappconfig; +package io.cucumber.spring.webappconfig; import cucumber.api.CucumberOptions; @@ -7,6 +7,6 @@ @RunWith(Cucumber.class) @CucumberOptions(glue = {"cucumber.runtime.java.spring.webappconfig"}, - features = {"classpath:cucumber/runtime/java/spring/springWebContextInjection.feature"}) + features = {"classpath:io/cucumber/spring/springWebContextInjection.feature"}) public class RunCukesTest { } diff --git a/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/SpringInjectionStepDefs.java b/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java similarity index 96% rename from spring/src/test/java/cucumber/runtime/java/spring/webappconfig/SpringInjectionStepDefs.java rename to spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java index 7a7b41ce5a..85d99ee084 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/SpringInjectionStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.webappconfig; +package io.cucumber.spring.webappconfig; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/spring/src/test/resources/applicationContext.xml b/spring/src/test/resources/applicationContext.xml index 48cde6cacb..4d40134113 100644 --- a/spring/src/test/resources/applicationContext.xml +++ b/spring/src/test/resources/applicationContext.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> - + - + @@ -15,6 +15,6 @@ - + diff --git a/spring/src/test/resources/cucumber.xml b/spring/src/test/resources/cucumber.xml index bcdffd9788..80f004fbc6 100644 --- a/spring/src/test/resources/cucumber.xml +++ b/spring/src/test/resources/cucumber.xml @@ -4,7 +4,7 @@ xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> - + diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/dirtyCukes.feature b/spring/src/test/resources/io/cucumber/spring/dirtyCukes.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/dirtyCukes.feature rename to spring/src/test/resources/io/cucumber/spring/dirtyCukes.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/dirtyCukesWithMetaConfiguration.feature b/spring/src/test/resources/io/cucumber/spring/dirtyCukesWithMetaConfiguration.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/dirtyCukesWithMetaConfiguration.feature rename to spring/src/test/resources/io/cucumber/spring/dirtyCukesWithMetaConfiguration.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/springBeanInjection.feature b/spring/src/test/resources/io/cucumber/spring/springBeanInjection.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/springBeanInjection.feature rename to spring/src/test/resources/io/cucumber/spring/springBeanInjection.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/springBeanInjectionWithMetaConfiguration.feature b/spring/src/test/resources/io/cucumber/spring/springBeanInjectionWithMetaConfiguration.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/springBeanInjectionWithMetaConfiguration.feature rename to spring/src/test/resources/io/cucumber/spring/springBeanInjectionWithMetaConfiguration.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/springWebContextInjection.feature b/spring/src/test/resources/io/cucumber/spring/springWebContextInjection.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/springWebContextInjection.feature rename to spring/src/test/resources/io/cucumber/spring/springWebContextInjection.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/stepdefInjection.feature b/spring/src/test/resources/io/cucumber/spring/stepdefInjection.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/stepdefInjection.feature rename to spring/src/test/resources/io/cucumber/spring/stepdefInjection.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/threadingCukes.feature b/spring/src/test/resources/io/cucumber/spring/threadingCukes.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/threadingCukes.feature rename to spring/src/test/resources/io/cucumber/spring/threadingCukes.feature diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/transaction.feature b/spring/src/test/resources/io/cucumber/spring/transaction.feature similarity index 100% rename from spring/src/test/resources/cucumber/runtime/java/spring/transaction.feature rename to spring/src/test/resources/io/cucumber/spring/transaction.feature From 54ba4b2be5731794e68f11a9d86ffee0d212cff5 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 19:38:51 +0200 Subject: [PATCH 009/155] [Guice] Introduce new package structure --- .../cucumber/api/guice/CucumberModules.java | 6 +-- .../cucumber/api/guice/CucumberScopes.java | 6 +-- .../main/java/cucumber/api/guice/package.html | 12 +++--- .../cucumber}/guice/InjectorSource.java | 4 +- .../cucumber}/guice/ScenarioScope.java | 2 +- .../cucumber}/guice/ScenarioScoped.java | 4 +- .../cucumber}/guice/impl/GuiceFactory.java | 8 ++-- .../guice/impl/InjectorSourceFactory.java | 6 +-- .../InjectorSourceInstantiationFailed.java | 4 +- .../cucumber}/guice/impl/ScenarioModule.java | 6 +-- .../guice/impl/SequentialScenarioScope.java | 4 +- .../integration/ScenarioScopedObject.java | 4 -- .../guice/integration/SingletonObject.java | 4 -- .../guice/integration/UnScopedObject.java | 4 -- .../guice/collection/CollectionUtil.java | 2 +- .../guice/collection/CollectionUtilTest.java | 2 +- .../guice/impl/GuiceFactoryTest.java | 35 +++++++++--------- .../guice/impl/InjectorSourceFactoryTest.java | 18 ++++----- .../impl/LivesInChildClassLoader.java.txt | 4 +- .../guice/integration/HelloWorldSteps.java | 4 +- .../guice/integration/RunCukesTest.java | 2 +- .../integration/ScenarioScopedObject.java | 4 ++ .../integration/ScenarioScopedSteps.java | 10 ++--- .../guice/integration/SingletonObject.java | 4 ++ .../integration/SingletonScopedSteps.java | 8 ++-- .../guice/integration/UnScopedObject.java | 4 ++ .../guice/integration/UnScopedSteps.java | 4 +- .../guice/integration}/UnusedGlue.java | 2 +- .../guice/integration/YourInjectorSource.java | 4 +- .../guice/integration/YourModule.java | 2 +- .../guice/integration/guice-no-scope.feature | 0 .../integration/guice-scenario-scope.feature | 0 .../integration/guice-singleton-scope.feature | 0 .../cucumber}/guice/integration/hello.feature | 0 .../guice/matcher/AbstractMatcherTest.java | 2 +- .../matcher/ElementsAreAllEqualMatcher.java | 2 +- .../ElementsAreAllEqualMatcherTest.java | 6 +-- .../guice/matcher/ElementsAreAllMatcher.java | 2 +- .../matcher/ElementsAreAllUniqueMatcher.java | 2 +- .../ElementsAreAllUniqueMatcherTest.java | 6 +-- guice/src/test/resources/cucumber.properties | 2 +- .../impl/LivesInChildClassLoader.class.bin | Bin 515 -> 0 bytes .../impl/LivesInChildClassLoader.class.bin | Bin 0 -> 485 bytes 43 files changed, 99 insertions(+), 106 deletions(-) rename guice/src/main/java/{cucumber/runtime/java => io/cucumber}/guice/InjectorSource.java (75%) rename guice/src/main/java/{cucumber/runtime/java => io/cucumber}/guice/ScenarioScope.java (87%) rename guice/src/main/java/{cucumber/runtime/java => io/cucumber}/guice/ScenarioScoped.java (83%) rename guice/src/main/java/{cucumber/runtime/java => io/cucumber}/guice/impl/GuiceFactory.java (85%) rename guice/src/main/java/{cucumber/runtime/java => io/cucumber}/guice/impl/InjectorSourceFactory.java (93%) rename guice/src/main/java/{cucumber/runtime/java => io/cucumber}/guice/impl/InjectorSourceInstantiationFailed.java (69%) rename guice/src/main/java/{cucumber/runtime/java => io/cucumber}/guice/impl/ScenarioModule.java (78%) rename guice/src/main/java/{cucumber/runtime/java => io/cucumber}/guice/impl/SequentialScenarioScope.java (96%) delete mode 100644 guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedObject.java delete mode 100644 guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonObject.java delete mode 100644 guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedObject.java rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/collection/CollectionUtil.java (94%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/collection/CollectionUtilTest.java (97%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/impl/GuiceFactoryTest.java (82%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/impl/InjectorSourceFactoryTest.java (92%) rename guice/src/test/{resources/cucumber/runtime/java => java/io/cucumber}/guice/impl/LivesInChildClassLoader.java.txt (64%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/integration/HelloWorldSteps.java (66%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/integration/RunCukesTest.java (90%) create mode 100644 guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedObject.java rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/integration/ScenarioScopedSteps.java (85%) create mode 100644 guice/src/test/java/io/cucumber/guice/integration/SingletonObject.java rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/integration/SingletonScopedSteps.java (88%) create mode 100644 guice/src/test/java/io/cucumber/guice/integration/UnScopedObject.java rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/integration/UnScopedSteps.java (91%) rename {spring/src/test/java/cucumber/runtime/java/spring/commonglue => guice/src/test/java/io/cucumber/guice/integration}/UnusedGlue.java (88%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/integration/YourInjectorSource.java (78%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/integration/YourModule.java (89%) rename guice/src/test/{resources/cucumber/runtime/java => java/io/cucumber}/guice/integration/guice-no-scope.feature (100%) rename guice/src/test/{resources/cucumber/runtime/java => java/io/cucumber}/guice/integration/guice-scenario-scope.feature (100%) rename guice/src/test/{resources/cucumber/runtime/java => java/io/cucumber}/guice/integration/guice-singleton-scope.feature (100%) rename guice/src/test/{resources/cucumber/runtime/java => java/io/cucumber}/guice/integration/hello.feature (100%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/matcher/AbstractMatcherTest.java (98%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/matcher/ElementsAreAllEqualMatcher.java (97%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/matcher/ElementsAreAllEqualMatcherTest.java (91%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/matcher/ElementsAreAllMatcher.java (96%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/matcher/ElementsAreAllUniqueMatcher.java (97%) rename guice/src/test/java/{cucumber/runtime/java => io/cucumber}/guice/matcher/ElementsAreAllUniqueMatcherTest.java (91%) delete mode 100644 guice/src/test/resources/cucumber/runtime/java/guice/impl/LivesInChildClassLoader.class.bin create mode 100644 guice/src/test/resources/io/cucumber/impl/LivesInChildClassLoader.class.bin diff --git a/guice/src/main/java/cucumber/api/guice/CucumberModules.java b/guice/src/main/java/cucumber/api/guice/CucumberModules.java index 8a78912556..2298dc298c 100644 --- a/guice/src/main/java/cucumber/api/guice/CucumberModules.java +++ b/guice/src/main/java/cucumber/api/guice/CucumberModules.java @@ -1,12 +1,12 @@ package cucumber.api.guice; import com.google.inject.Module; -import cucumber.runtime.java.guice.impl.ScenarioModule; +import io.cucumber.guice.impl.ScenarioModule; /** * Provides a convenient com.google.inject.Module instance that contains bindings for - * cucumber.runtime.java.guice.ScenarioScoped annotation and for - * cucumber.runtime.java.guice.ScenarioScope. + * ScenarioScoped annotation and for + * ScenarioScope. */ public class CucumberModules { public static final Module SCENARIO = new ScenarioModule(CucumberScopes.SCENARIO); diff --git a/guice/src/main/java/cucumber/api/guice/CucumberScopes.java b/guice/src/main/java/cucumber/api/guice/CucumberScopes.java index b9dac00415..e0b1edecb6 100644 --- a/guice/src/main/java/cucumber/api/guice/CucumberScopes.java +++ b/guice/src/main/java/cucumber/api/guice/CucumberScopes.java @@ -1,10 +1,10 @@ package cucumber.api.guice; -import cucumber.runtime.java.guice.ScenarioScope; -import cucumber.runtime.java.guice.impl.SequentialScenarioScope; +import io.cucumber.guice.ScenarioScope; +import io.cucumber.guice.impl.SequentialScenarioScope; /** - * Provides a convenient cucumber.runtime.java.guice.ScenarioScope instance for use when declaring bindings + * Provides a convenient ScenarioScope instance for use when declaring bindings * in implementations of com.google.inject.Module. */ public class CucumberScopes { diff --git a/guice/src/main/java/cucumber/api/guice/package.html b/guice/src/main/java/cucumber/api/guice/package.html index 317aaa8a9c..aba2a41be9 100644 --- a/guice/src/main/java/cucumber/api/guice/package.html +++ b/guice/src/main/java/cucumber/api/guice/package.html @@ -61,7 +61,7 @@

Singleton scope

Using scope annotations

This is the easy route if you're new to Guice. To bind a class in scenario scope add the - cucumber.runtime.java.guice.ScenarioScoped annotation to the class definition. The class should have + io.cucumber.guice.ScenarioScoped annotation to the class definition. The class should have a no-args constructor or one constructor that is annotated with javax.inject.Inject. For example:

@@ -117,10 +117,10 @@ 

Using module bindings

As an alternative to using annotations you may prefer to declare Guice bindings in a class that implements com.google.inject.Module. To do this you should create a class that implements - cucumber.runtime.java.guice.InjectorSource. This gives you complete control over how you obtain a + io.cucumber.guice.InjectorSource. This gives you complete control over how you obtain a Guice injector and it's Guice modules. The injector must provide a binding for - cucumber.runtime.java.guice.ScenarioScope. It should also provide a binding for the - cucumber.runtime.java.guice.ScenarioScoped annotation if your classes are using the annotation. The + io.cucumber.guice.ScenarioScope. It should also provide a binding for the + io.cucumber.guice.ScenarioScoped annotation if your classes are using the annotation. The easiest way to do this it to use CucumberModules.SCENARIO. For example:

@@ -139,10 +139,10 @@ 

Using module bindings

}

- Cucumber needs to know where to find the cucumber.runtime.java.guice.InjectorSource that it will use. + Cucumber needs to know where to find the io.cucumber.guice.InjectorSource that it will use. You should create a properties file called cucumber.properties and place it in the root of the classpath. The file should contain a single property key called guice.injector-source with a value - equal to the fully qualified name of the cucumber.runtime.java.guice.InjectorSource. For example: + equal to the fully qualified name of the io.cucumber.guice.InjectorSource. For example:

         guice.injector-source=com.company.YourInjectorSource
diff --git a/guice/src/main/java/cucumber/runtime/java/guice/InjectorSource.java b/guice/src/main/java/io/cucumber/guice/InjectorSource.java
similarity index 75%
rename from guice/src/main/java/cucumber/runtime/java/guice/InjectorSource.java
rename to guice/src/main/java/io/cucumber/guice/InjectorSource.java
index 5f5a9d88d7..e8fe8a6c30 100644
--- a/guice/src/main/java/cucumber/runtime/java/guice/InjectorSource.java
+++ b/guice/src/main/java/io/cucumber/guice/InjectorSource.java
@@ -1,11 +1,11 @@
-package cucumber.runtime.java.guice;
+package io.cucumber.guice;
 
 import com.google.inject.Injector;
 
 /**
  * An implentation of this interface is used to obtain an com.google.inject.Injector that is used to
  * provide instances of all the classes that are used to run the Cucumber tests. The injector should be configured with
- * a binding for cucumber.runtime.java.guice.ScenarioScope.
+ * a binding for ScenarioScope.
  */
 public interface InjectorSource {
     Injector getInjector();
diff --git a/guice/src/main/java/cucumber/runtime/java/guice/ScenarioScope.java b/guice/src/main/java/io/cucumber/guice/ScenarioScope.java
similarity index 87%
rename from guice/src/main/java/cucumber/runtime/java/guice/ScenarioScope.java
rename to guice/src/main/java/io/cucumber/guice/ScenarioScope.java
index 405c8389be..1f0ee4081b 100644
--- a/guice/src/main/java/cucumber/runtime/java/guice/ScenarioScope.java
+++ b/guice/src/main/java/io/cucumber/guice/ScenarioScope.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.guice;
+package io.cucumber.guice;
 
 import com.google.inject.Scope;
 
diff --git a/guice/src/main/java/cucumber/runtime/java/guice/ScenarioScoped.java b/guice/src/main/java/io/cucumber/guice/ScenarioScoped.java
similarity index 83%
rename from guice/src/main/java/cucumber/runtime/java/guice/ScenarioScoped.java
rename to guice/src/main/java/io/cucumber/guice/ScenarioScoped.java
index f11119e081..40d1211cee 100644
--- a/guice/src/main/java/cucumber/runtime/java/guice/ScenarioScoped.java
+++ b/guice/src/main/java/io/cucumber/guice/ScenarioScoped.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.guice;
+package io.cucumber.guice;
 
 import com.google.inject.ScopeAnnotation;
 
@@ -11,7 +11,7 @@
 
 /**
  * A custom Guice scope annotation that is usually bound to an instance of
- * cucumber.runtime.java.guice.ScenarioScope.
+ * ScenarioScope.
  */
 @Target({ TYPE, METHOD }) @Retention(RUNTIME) @ScopeAnnotation
 public @interface ScenarioScoped    {}
\ No newline at end of file
diff --git a/guice/src/main/java/cucumber/runtime/java/guice/impl/GuiceFactory.java b/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java
similarity index 85%
rename from guice/src/main/java/cucumber/runtime/java/guice/impl/GuiceFactory.java
rename to guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java
index 8e0ae75110..f9ff29561f 100644
--- a/guice/src/main/java/cucumber/runtime/java/guice/impl/GuiceFactory.java
+++ b/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java
@@ -1,9 +1,9 @@
-package cucumber.runtime.java.guice.impl;
+package io.cucumber.guice.impl;
 
 import com.google.inject.Injector;
 import cucumber.api.java.ObjectFactory;
-import cucumber.runtime.Env;
-import cucumber.runtime.java.guice.ScenarioScope;
+import io.cucumber.core.options.Env;
+import io.cucumber.guice.ScenarioScope;
 
 /**
  * Guice implementation of the cucumber.api.java.ObjectFactory.
@@ -20,7 +20,7 @@ public GuiceFactory() {
      * Package private constructor that is called by the public constructor at runtime and is also called directly by
      * tests.
      *
-     * @param injector an injector configured with a binding for cucumber.runtime.java.guice.ScenarioScope.
+     * @param injector an injector configured with a binding for ScenarioScope.
      */
     GuiceFactory(Injector injector) {
         this.injector = injector;
diff --git a/guice/src/main/java/cucumber/runtime/java/guice/impl/InjectorSourceFactory.java b/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java
similarity index 93%
rename from guice/src/main/java/cucumber/runtime/java/guice/impl/InjectorSourceFactory.java
rename to guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java
index 59c4dbc9f4..0db5a454fd 100644
--- a/guice/src/main/java/cucumber/runtime/java/guice/impl/InjectorSourceFactory.java
+++ b/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java
@@ -1,10 +1,10 @@
-package cucumber.runtime.java.guice.impl;
+package io.cucumber.guice.impl;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
-import cucumber.runtime.Env;
-import cucumber.runtime.java.guice.InjectorSource;
+import io.cucumber.core.options.Env;
+import io.cucumber.guice.InjectorSource;
 
 import static java.text.MessageFormat.format;
 
diff --git a/guice/src/main/java/cucumber/runtime/java/guice/impl/InjectorSourceInstantiationFailed.java b/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java
similarity index 69%
rename from guice/src/main/java/cucumber/runtime/java/guice/impl/InjectorSourceInstantiationFailed.java
rename to guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java
index 75136939cb..b21760cfd4 100644
--- a/guice/src/main/java/cucumber/runtime/java/guice/impl/InjectorSourceInstantiationFailed.java
+++ b/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java
@@ -1,6 +1,6 @@
-package cucumber.runtime.java.guice.impl;
+package io.cucumber.guice.impl;
 
-import cucumber.runtime.CucumberException;
+import io.cucumber.core.exception.CucumberException;
 
 public class InjectorSourceInstantiationFailed extends CucumberException {
 
diff --git a/guice/src/main/java/cucumber/runtime/java/guice/impl/ScenarioModule.java b/guice/src/main/java/io/cucumber/guice/impl/ScenarioModule.java
similarity index 78%
rename from guice/src/main/java/cucumber/runtime/java/guice/impl/ScenarioModule.java
rename to guice/src/main/java/io/cucumber/guice/impl/ScenarioModule.java
index c5e7bf646a..4acb4b8f5f 100644
--- a/guice/src/main/java/cucumber/runtime/java/guice/impl/ScenarioModule.java
+++ b/guice/src/main/java/io/cucumber/guice/impl/ScenarioModule.java
@@ -1,8 +1,8 @@
-package cucumber.runtime.java.guice.impl;
+package io.cucumber.guice.impl;
 
 import com.google.inject.AbstractModule;
-import cucumber.runtime.java.guice.ScenarioScoped;
-import cucumber.runtime.java.guice.ScenarioScope;
+import io.cucumber.guice.ScenarioScoped;
+import io.cucumber.guice.ScenarioScope;
 
 public class ScenarioModule extends AbstractModule {
 
diff --git a/guice/src/main/java/cucumber/runtime/java/guice/impl/SequentialScenarioScope.java b/guice/src/main/java/io/cucumber/guice/impl/SequentialScenarioScope.java
similarity index 96%
rename from guice/src/main/java/cucumber/runtime/java/guice/impl/SequentialScenarioScope.java
rename to guice/src/main/java/io/cucumber/guice/impl/SequentialScenarioScope.java
index b0b370d1cd..828497a916 100644
--- a/guice/src/main/java/cucumber/runtime/java/guice/impl/SequentialScenarioScope.java
+++ b/guice/src/main/java/io/cucumber/guice/impl/SequentialScenarioScope.java
@@ -1,9 +1,9 @@
-package cucumber.runtime.java.guice.impl;
+package io.cucumber.guice.impl;
 
 import com.google.inject.Key;
 import com.google.inject.OutOfScopeException;
 import com.google.inject.Provider;
-import cucumber.runtime.java.guice.ScenarioScope;
+import io.cucumber.guice.ScenarioScope;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedObject.java b/guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedObject.java
deleted file mode 100644
index 5462ee1b16..0000000000
--- a/guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedObject.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package cucumber.runtime.java.guice.integration;
-
-public class ScenarioScopedObject {
-}
diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonObject.java b/guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonObject.java
deleted file mode 100644
index 0c55f1ace3..0000000000
--- a/guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonObject.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package cucumber.runtime.java.guice.integration;
-
-public class SingletonObject {
-}
diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedObject.java b/guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedObject.java
deleted file mode 100644
index 6da9e483b8..0000000000
--- a/guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedObject.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package cucumber.runtime.java.guice.integration;
-
-public class UnScopedObject {
-}
diff --git a/guice/src/test/java/cucumber/runtime/java/guice/collection/CollectionUtil.java b/guice/src/test/java/io/cucumber/guice/collection/CollectionUtil.java
similarity index 94%
rename from guice/src/test/java/cucumber/runtime/java/guice/collection/CollectionUtil.java
rename to guice/src/test/java/io/cucumber/guice/collection/CollectionUtil.java
index 244461ae54..0fec57755c 100644
--- a/guice/src/test/java/cucumber/runtime/java/guice/collection/CollectionUtil.java
+++ b/guice/src/test/java/io/cucumber/guice/collection/CollectionUtil.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.guice.collection;
+package io.cucumber.guice.collection;
 
 import java.util.List;
 
diff --git a/guice/src/test/java/cucumber/runtime/java/guice/collection/CollectionUtilTest.java b/guice/src/test/java/io/cucumber/guice/collection/CollectionUtilTest.java
similarity index 97%
rename from guice/src/test/java/cucumber/runtime/java/guice/collection/CollectionUtilTest.java
rename to guice/src/test/java/io/cucumber/guice/collection/CollectionUtilTest.java
index f12aef2074..c7a61e54d3 100644
--- a/guice/src/test/java/cucumber/runtime/java/guice/collection/CollectionUtilTest.java
+++ b/guice/src/test/java/io/cucumber/guice/collection/CollectionUtilTest.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.guice.collection;
+package io.cucumber.guice.collection;
 
 import org.junit.Before;
 import org.junit.Test;
diff --git a/guice/src/test/java/cucumber/runtime/java/guice/impl/GuiceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java
similarity index 82%
rename from guice/src/test/java/cucumber/runtime/java/guice/impl/GuiceFactoryTest.java
rename to guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java
index 11ada40622..c17e2c5b2c 100644
--- a/guice/src/test/java/cucumber/runtime/java/guice/impl/GuiceFactoryTest.java
+++ b/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.guice.impl;
+package io.cucumber.guice.impl;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.ConfigurationException;
@@ -10,7 +10,9 @@
 import cucumber.api.guice.CucumberModules;
 import cucumber.api.guice.CucumberScopes;
 import cucumber.api.java.ObjectFactory;
-import cucumber.runtime.java.guice.ScenarioScoped;
+import io.cucumber.guice.ScenarioScoped;
+import io.cucumber.guice.matcher.ElementsAreAllEqualMatcher;
+import io.cucumber.guice.matcher.ElementsAreAllUniqueMatcher;
 import org.junit.After;
 import org.junit.Test;
 
@@ -18,8 +20,6 @@
 import java.util.Arrays;
 import java.util.List;
 
-import static cucumber.runtime.java.guice.matcher.ElementsAreAllEqualMatcher.elementsAreAllEqual;
-import static cucumber.runtime.java.guice.matcher.ElementsAreAllUniqueMatcher.elementsAreAllUnique;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.junit.Assert.assertThat;
@@ -57,7 +57,7 @@ public void factoryStartFailsIfScenarioScopeIsNotBound() {
             fail();
         } catch (ConfigurationException e) {
             assertThat(e.getMessage(),
-                    containsString("No implementation for cucumber.runtime.java.guice.ScenarioScope was bound"));
+                    containsString("No implementation for io.cucumber.guice.ScenarioScope was bound"));
         }
     }
 
@@ -67,30 +67,31 @@ static class UnscopedClass {}
     public void shouldGiveNewInstancesOfUnscopedClassWithinAScenario() {
         factory = new GuiceFactory(injector(CucumberModules.SCENARIO));
         instancesFromSameScenario = getInstancesFromSameScenario(factory, UnscopedClass.class);
-        assertThat(instancesFromSameScenario, elementsAreAllUnique());
+        assertThat(instancesFromSameScenario, ElementsAreAllUniqueMatcher.elementsAreAllUnique());
     }
 
     @Test
     public void shouldGiveNewInstanceOfUnscopedClassForEachScenario() {
         factory = new GuiceFactory(injector(CucumberModules.SCENARIO));
         instancesFromDifferentScenarios = getInstancesFromDifferentScenarios(factory, UnscopedClass.class);
-        assertThat(instancesFromDifferentScenarios, elementsAreAllUnique());
+        assertThat(instancesFromDifferentScenarios, ElementsAreAllUniqueMatcher.elementsAreAllUnique());
     }
 
-    @ScenarioScoped static class AnnotatedScenarioScopedClass {}
+    @ScenarioScoped
+    static class AnnotatedScenarioScopedClass {}
 
     @Test
     public void shouldGiveTheSameInstanceOfAnnotatedScenarioScopedClassWithinAScenario() {
         factory = new GuiceFactory(injector(CucumberModules.SCENARIO));
         instancesFromSameScenario = getInstancesFromSameScenario(factory, AnnotatedScenarioScopedClass.class);
-        assertThat(instancesFromSameScenario, elementsAreAllEqual());
+        assertThat(instancesFromSameScenario, ElementsAreAllEqualMatcher.elementsAreAllEqual());
     }
 
     @Test
     public void shouldGiveNewInstanceOfAnnotatedScenarioScopedClassForEachScenario() {
         factory = new GuiceFactory(injector(CucumberModules.SCENARIO));
         instancesFromDifferentScenarios = getInstancesFromDifferentScenarios(factory, AnnotatedScenarioScopedClass.class);
-        assertThat(instancesFromDifferentScenarios, elementsAreAllUnique());
+        assertThat(instancesFromDifferentScenarios, ElementsAreAllUniqueMatcher.elementsAreAllUnique());
     }
 
     @Singleton static class AnnotatedSingletonClass {}
@@ -99,14 +100,14 @@ public void shouldGiveNewInstanceOfAnnotatedScenarioScopedClassForEachScenario()
     public void shouldGiveTheSameInstanceOfAnnotatedSingletonClassWithinAScenario() {
         factory = new GuiceFactory(injector(CucumberModules.SCENARIO));
         instancesFromSameScenario = getInstancesFromSameScenario(factory, AnnotatedSingletonClass.class);
-        assertThat(instancesFromSameScenario, elementsAreAllEqual());
+        assertThat(instancesFromSameScenario, ElementsAreAllEqualMatcher.elementsAreAllEqual());
     }
 
     @Test
     public void shouldGiveTheSameInstanceOfAnnotatedSingletonClassForEachScenario() {
         factory = new GuiceFactory(injector(CucumberModules.SCENARIO));
         instancesFromDifferentScenarios = getInstancesFromDifferentScenarios(factory, AnnotatedSingletonClass.class);
-        assertThat(instancesFromDifferentScenarios, elementsAreAllEqual());
+        assertThat(instancesFromDifferentScenarios, ElementsAreAllEqualMatcher.elementsAreAllEqual());
     }
 
     static class BoundScenarioScopedClass {}
@@ -121,14 +122,14 @@ static class BoundScenarioScopedClass {}
     public void shouldGiveTheSameInstanceOfBoundScenarioScopedClassWithinAScenario() {
         factory = new GuiceFactory(injector(CucumberModules.SCENARIO, boundScenarioScopedClassModule));
         instancesFromSameScenario = getInstancesFromSameScenario(factory, BoundScenarioScopedClass.class);
-        assertThat(instancesFromSameScenario, elementsAreAllEqual());
+        assertThat(instancesFromSameScenario, ElementsAreAllEqualMatcher.elementsAreAllEqual());
     }
 
     @Test
     public void shouldGiveNewInstanceOfBoundScenarioScopedClassForEachScenario() {
         factory = new GuiceFactory(injector(CucumberModules.SCENARIO, boundScenarioScopedClassModule));
         instancesFromDifferentScenarios = getInstancesFromDifferentScenarios(factory, BoundScenarioScopedClass.class);
-        assertThat(instancesFromDifferentScenarios, elementsAreAllUnique());
+        assertThat(instancesFromDifferentScenarios, ElementsAreAllUniqueMatcher.elementsAreAllUnique());
     }
 
     static class BoundSingletonClass {}
@@ -143,14 +144,14 @@ static class BoundSingletonClass {}
     public void shouldGiveTheSameInstanceOfBoundSingletonClassWithinAScenario() {
         factory = new GuiceFactory(injector(CucumberModules.SCENARIO, boundSingletonClassModule));
         instancesFromSameScenario = getInstancesFromSameScenario(factory, BoundSingletonClass.class);
-        assertThat(instancesFromSameScenario, elementsAreAllEqual());
+        assertThat(instancesFromSameScenario, ElementsAreAllEqualMatcher.elementsAreAllEqual());
     }
 
     @Test
     public void shouldGiveTheSameInstanceOfBoundSingletonClassForEachScenario() {
         factory = new GuiceFactory(injector(CucumberModules.SCENARIO, boundSingletonClassModule));
         instancesFromDifferentScenarios = getInstancesFromDifferentScenarios(factory, BoundSingletonClass.class);
-        assertThat(instancesFromDifferentScenarios, elementsAreAllEqual());
+        assertThat(instancesFromDifferentScenarios, ElementsAreAllEqualMatcher.elementsAreAllEqual());
     }
 
     @Test
@@ -162,7 +163,7 @@ protected void configure() {
             }
         }));
         instancesFromDifferentScenarios = getInstancesFromDifferentScenarios(factory, AnnotatedSingletonClass.class);
-        assertThat(instancesFromDifferentScenarios, elementsAreAllUnique());
+        assertThat(instancesFromDifferentScenarios, ElementsAreAllUniqueMatcher.elementsAreAllUnique());
     }
 
     private Injector injector(Module... module) {
diff --git a/guice/src/test/java/cucumber/runtime/java/guice/impl/InjectorSourceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java
similarity index 92%
rename from guice/src/test/java/cucumber/runtime/java/guice/impl/InjectorSourceFactoryTest.java
rename to guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java
index 61e3a84fda..b235b91b3b 100644
--- a/guice/src/test/java/cucumber/runtime/java/guice/impl/InjectorSourceFactoryTest.java
+++ b/guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java
@@ -1,17 +1,13 @@
-package cucumber.runtime.java.guice.impl;
+package io.cucumber.guice.impl;
 
 import com.google.inject.Injector;
-import cucumber.runtime.Env;
-import cucumber.runtime.java.guice.InjectorSource;
-import org.junit.Assert;
+import io.cucumber.core.options.Env;
+import io.cucumber.guice.InjectorSource;
 import org.junit.Test;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.net.URL;
-import java.net.URLClassLoader;
 import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
@@ -123,7 +119,7 @@ public void failsToInstantiateClassWithNoDefaultConstructor() throws Exception {
    * 
    * 

MyChildClassLoader is the only classloader with knowledge of c.r.j.guice.impl.LivesInChildClassLoader * - *

The bytecode of LivesInChildClassLoader is intentionally renamed to 'LivesInChildClassLoader.class.txt' to prevent + *

The bytecode of LivesInChildClassLoader is intentionally renamed to 'LivesInChildClassLoader.class.bin.txt' to prevent * this test's ClassLoader from resolving it. * *

If InjectorSourceFactory calls Class#forName without an explicit ClassLoader argument, which is the behavior of @@ -139,7 +135,7 @@ public void instantiateClassInChildClassLoader() throws Exception { Thread.currentThread().setContextClassLoader( childClassLoader ); Properties properties = new Properties(); - properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, "cucumber.runtime.java.guice.impl.LivesInChildClassLoader"); + properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, "io.cucumber.guice.impl.LivesInChildClassLoader"); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); assertThat(injectorSourceFactory.create(), is(instanceOf(InjectorSource.class))); @@ -152,8 +148,8 @@ public MyChildClassLoader( ClassLoader parent ) { @Override protected Class loadClass( String name, boolean resolve ) throws ClassNotFoundException { - if( name.equals( "cucumber.runtime.java.guice.impl.LivesInChildClassLoader" ) ) { - String filename = getClass().getClassLoader().getResource("cucumber/runtime/java/guice/impl/LivesInChildClassLoader.class.bin").getFile(); + if( name.equals( "io.cucumber.guice.impl.LivesInChildClassLoader" ) ) { + String filename = getClass().getClassLoader().getResource("io/cucumber/impl/LivesInChildClassLoader.class.bin").getFile(); File file = new File( filename ); try { FileInputStream in = new FileInputStream( file ); diff --git a/guice/src/test/resources/cucumber/runtime/java/guice/impl/LivesInChildClassLoader.java.txt b/guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt similarity index 64% rename from guice/src/test/resources/cucumber/runtime/java/guice/impl/LivesInChildClassLoader.java.txt rename to guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt index 8a789bf33b..29445c721c 100644 --- a/guice/src/test/resources/cucumber/runtime/java/guice/impl/LivesInChildClassLoader.java.txt +++ b/guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt @@ -1,7 +1,7 @@ -package cucumber.runtime.java.guice.impl; +package io.cucumber.guice.impl; import com.google.inject.Injector; -import cucumber.runtime.java.guice.InjectorSource; +import io.cucumber.guice.InjectorSource; public class LivesInChildClassLoader implements InjectorSource { @Override diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/HelloWorldSteps.java b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java similarity index 66% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/HelloWorldSteps.java rename to guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java index 14fbbb3a5d..d7ca574a05 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/HelloWorldSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java @@ -1,7 +1,7 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import cucumber.api.java.en.Given; -import cucumber.runtime.java.guice.ScenarioScoped; +import io.cucumber.guice.ScenarioScoped; @ScenarioScoped public class HelloWorldSteps { diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/RunCukesTest.java b/guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java similarity index 90% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/RunCukesTest.java rename to guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java index ce47997ebf..4031cdd5a1 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/RunCukesTest.java +++ b/guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedObject.java b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedObject.java new file mode 100644 index 0000000000..ef9723e8f8 --- /dev/null +++ b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedObject.java @@ -0,0 +1,4 @@ +package io.cucumber.guice.integration; + +public class ScenarioScopedObject { +} diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java similarity index 85% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedSteps.java rename to guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java index 93dba7fe0a..57ca48e914 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/ScenarioScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java @@ -1,18 +1,18 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; -import cucumber.runtime.java.guice.ScenarioScoped; +import io.cucumber.guice.ScenarioScoped; import javax.inject.Inject; import javax.inject.Provider; import java.util.ArrayList; import java.util.List; -import static cucumber.runtime.java.guice.collection.CollectionUtil.removeAllExceptFirstElement; -import static cucumber.runtime.java.guice.matcher.ElementsAreAllEqualMatcher.elementsAreAllEqual; -import static cucumber.runtime.java.guice.matcher.ElementsAreAllUniqueMatcher.elementsAreAllUnique; +import static io.cucumber.guice.collection.CollectionUtil.removeAllExceptFirstElement; +import static io.cucumber.guice.matcher.ElementsAreAllEqualMatcher.elementsAreAllEqual; +import static io.cucumber.guice.matcher.ElementsAreAllUniqueMatcher.elementsAreAllUnique; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; diff --git a/guice/src/test/java/io/cucumber/guice/integration/SingletonObject.java b/guice/src/test/java/io/cucumber/guice/integration/SingletonObject.java new file mode 100644 index 0000000000..1b4326ae95 --- /dev/null +++ b/guice/src/test/java/io/cucumber/guice/integration/SingletonObject.java @@ -0,0 +1,4 @@ +package io.cucumber.guice.integration; + +public class SingletonObject { +} diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java similarity index 88% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonScopedSteps.java rename to guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java index ad4c324fef..3103b56fed 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/SingletonScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java @@ -1,17 +1,17 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; -import cucumber.runtime.java.guice.ScenarioScoped; +import io.cucumber.guice.ScenarioScoped; import javax.inject.Inject; import javax.inject.Provider; import java.util.ArrayList; import java.util.List; -import static cucumber.runtime.java.guice.collection.CollectionUtil.removeAllExceptFirstElement; -import static cucumber.runtime.java.guice.matcher.ElementsAreAllEqualMatcher.elementsAreAllEqual; +import static io.cucumber.guice.collection.CollectionUtil.removeAllExceptFirstElement; +import static io.cucumber.guice.matcher.ElementsAreAllEqualMatcher.elementsAreAllEqual; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; diff --git a/guice/src/test/java/io/cucumber/guice/integration/UnScopedObject.java b/guice/src/test/java/io/cucumber/guice/integration/UnScopedObject.java new file mode 100644 index 0000000000..992f39e63e --- /dev/null +++ b/guice/src/test/java/io/cucumber/guice/integration/UnScopedObject.java @@ -0,0 +1,4 @@ +package io.cucumber.guice.integration; + +public class UnScopedObject { +} diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java similarity index 91% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedSteps.java rename to guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java index 1909f4855e..8c5f087d33 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/UnScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.List; -import static cucumber.runtime.java.guice.matcher.ElementsAreAllUniqueMatcher.elementsAreAllUnique; +import static io.cucumber.guice.matcher.ElementsAreAllUniqueMatcher.elementsAreAllUnique; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.assertThat; diff --git a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/UnusedGlue.java b/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java similarity index 88% rename from spring/src/test/java/cucumber/runtime/java/spring/commonglue/UnusedGlue.java rename to guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java index e6a965b853..a75dcb5e07 100644 --- a/spring/src/test/java/cucumber/runtime/java/spring/commonglue/UnusedGlue.java +++ b/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.spring.commonglue; +package io.cucumber.guice.integration; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/YourInjectorSource.java b/guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java similarity index 78% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/YourInjectorSource.java rename to guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java index d6be328a3a..3368a6c34a 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/YourInjectorSource.java +++ b/guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java @@ -1,10 +1,10 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Stage; import cucumber.api.guice.CucumberModules; -import cucumber.runtime.java.guice.InjectorSource; +import io.cucumber.guice.InjectorSource; public class YourInjectorSource implements InjectorSource { diff --git a/guice/src/test/java/cucumber/runtime/java/guice/integration/YourModule.java b/guice/src/test/java/io/cucumber/guice/integration/YourModule.java similarity index 89% rename from guice/src/test/java/cucumber/runtime/java/guice/integration/YourModule.java rename to guice/src/test/java/io/cucumber/guice/integration/YourModule.java index 870ee22fea..1eec07ac62 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/integration/YourModule.java +++ b/guice/src/test/java/io/cucumber/guice/integration/YourModule.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.integration; +package io.cucumber.guice.integration; import com.google.inject.AbstractModule; import com.google.inject.Scopes; diff --git a/guice/src/test/resources/cucumber/runtime/java/guice/integration/guice-no-scope.feature b/guice/src/test/java/io/cucumber/guice/integration/guice-no-scope.feature similarity index 100% rename from guice/src/test/resources/cucumber/runtime/java/guice/integration/guice-no-scope.feature rename to guice/src/test/java/io/cucumber/guice/integration/guice-no-scope.feature diff --git a/guice/src/test/resources/cucumber/runtime/java/guice/integration/guice-scenario-scope.feature b/guice/src/test/java/io/cucumber/guice/integration/guice-scenario-scope.feature similarity index 100% rename from guice/src/test/resources/cucumber/runtime/java/guice/integration/guice-scenario-scope.feature rename to guice/src/test/java/io/cucumber/guice/integration/guice-scenario-scope.feature diff --git a/guice/src/test/resources/cucumber/runtime/java/guice/integration/guice-singleton-scope.feature b/guice/src/test/java/io/cucumber/guice/integration/guice-singleton-scope.feature similarity index 100% rename from guice/src/test/resources/cucumber/runtime/java/guice/integration/guice-singleton-scope.feature rename to guice/src/test/java/io/cucumber/guice/integration/guice-singleton-scope.feature diff --git a/guice/src/test/resources/cucumber/runtime/java/guice/integration/hello.feature b/guice/src/test/java/io/cucumber/guice/integration/hello.feature similarity index 100% rename from guice/src/test/resources/cucumber/runtime/java/guice/integration/hello.feature rename to guice/src/test/java/io/cucumber/guice/integration/hello.feature diff --git a/guice/src/test/java/cucumber/runtime/java/guice/matcher/AbstractMatcherTest.java b/guice/src/test/java/io/cucumber/guice/matcher/AbstractMatcherTest.java similarity index 98% rename from guice/src/test/java/cucumber/runtime/java/guice/matcher/AbstractMatcherTest.java rename to guice/src/test/java/io/cucumber/guice/matcher/AbstractMatcherTest.java index 737948f93a..23b827b5b7 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/matcher/AbstractMatcherTest.java +++ b/guice/src/test/java/io/cucumber/guice/matcher/AbstractMatcherTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.matcher; +package io.cucumber.guice.matcher; import junit.framework.TestCase; import org.hamcrest.Description; diff --git a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllEqualMatcher.java b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllEqualMatcher.java similarity index 97% rename from guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllEqualMatcher.java rename to guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllEqualMatcher.java index 6cf8cf4f48..cb69d651a4 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllEqualMatcher.java +++ b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllEqualMatcher.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.matcher; +package io.cucumber.guice.matcher; import org.hamcrest.Description; import org.hamcrest.Factory; diff --git a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllEqualMatcherTest.java b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllEqualMatcherTest.java similarity index 91% rename from guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllEqualMatcherTest.java rename to guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllEqualMatcherTest.java index 1dca321b9b..a5134f02e9 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllEqualMatcherTest.java +++ b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllEqualMatcherTest.java @@ -1,15 +1,13 @@ -package cucumber.runtime.java.guice.matcher; +package io.cucumber.guice.matcher; import org.hamcrest.Matcher; import java.util.Arrays; import java.util.Collection; -import static cucumber.runtime.java.guice.matcher.ElementsAreAllEqualMatcher.elementsAreAllEqual; - public class ElementsAreAllEqualMatcherTest extends AbstractMatcherTest { - private final Matcher> matcher = elementsAreAllEqual(); + private final Matcher> matcher = ElementsAreAllEqualMatcher.elementsAreAllEqual(); @Override protected Matcher createMatcher() { diff --git a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllMatcher.java b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllMatcher.java similarity index 96% rename from guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllMatcher.java rename to guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllMatcher.java index 5e2a3b2e75..f0bd803fc0 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllMatcher.java +++ b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllMatcher.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.matcher; +package io.cucumber.guice.matcher; import org.hamcrest.Description; import org.hamcrest.TypeSafeDiagnosingMatcher; diff --git a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllUniqueMatcher.java b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllUniqueMatcher.java similarity index 97% rename from guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllUniqueMatcher.java rename to guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllUniqueMatcher.java index e9435cd245..9966139e9e 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllUniqueMatcher.java +++ b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllUniqueMatcher.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.guice.matcher; +package io.cucumber.guice.matcher; import org.hamcrest.Description; import org.hamcrest.Factory; diff --git a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllUniqueMatcherTest.java b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllUniqueMatcherTest.java similarity index 91% rename from guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllUniqueMatcherTest.java rename to guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllUniqueMatcherTest.java index ccbf9f557b..2525f4142c 100644 --- a/guice/src/test/java/cucumber/runtime/java/guice/matcher/ElementsAreAllUniqueMatcherTest.java +++ b/guice/src/test/java/io/cucumber/guice/matcher/ElementsAreAllUniqueMatcherTest.java @@ -1,15 +1,13 @@ -package cucumber.runtime.java.guice.matcher; +package io.cucumber.guice.matcher; import org.hamcrest.Matcher; import java.util.Arrays; import java.util.Collection; -import static cucumber.runtime.java.guice.matcher.ElementsAreAllUniqueMatcher.elementsAreAllUnique; - public class ElementsAreAllUniqueMatcherTest extends AbstractMatcherTest { - private final Matcher> matcher = elementsAreAllUnique(); + private final Matcher> matcher = ElementsAreAllUniqueMatcher.elementsAreAllUnique(); @Override protected Matcher createMatcher() { diff --git a/guice/src/test/resources/cucumber.properties b/guice/src/test/resources/cucumber.properties index 5fc09fea75..b3672ffdfa 100644 --- a/guice/src/test/resources/cucumber.properties +++ b/guice/src/test/resources/cucumber.properties @@ -1 +1 @@ -guice.injector-source=cucumber.runtime.java.guice.integration.YourInjectorSource +guice.injector-source=io.cucumber.guice.integration.YourInjectorSource diff --git a/guice/src/test/resources/cucumber/runtime/java/guice/impl/LivesInChildClassLoader.class.bin b/guice/src/test/resources/cucumber/runtime/java/guice/impl/LivesInChildClassLoader.class.bin deleted file mode 100644 index da2c952a67b78b21f50b6c5c79187ebcb5a58a3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515 zcmbVI%Sr=55Uk!j);u&ZdKAH162t*dqT*#i2rPO~a-U3w&4k?@*+;%hPl5+Oz>gAp zHb%YZ!AmvWRn=3|Z|^U!08X*rMh$%*yFLa!_6W^OlbYg+P#cb>gnD4-n$QbPs&C3< zrn7rFi+M5#t&;InX2$iO!+NnWIpI81rK-dtE7QUxS}f&Cil{V73zIy=A~Y+VPtssv z;&~9uJP)m$>+FKiiF7eZms%AzBODG#p|XjHtc_y!R)pB_EN|c0GE@56xKIbbtUYnh zchNwTaQ5G9gnsplSf-JFpp6c9#Qip-GaqwxI*%S5;@jE!;q<wE6(1}c*CGA9}#?POR)qHL;!dYaTP=zY}A});5!Ym)Gh|Ef7<76~9b~dsy%OWRd zI=vvYVx5nZg;u#s35Webq})=(&c&9qr64vs+naZ;NR_@ezRJNLYljQDl5NybCk+4B zh|u+6VPz7F+o|tGIQqR~Q)yiX#|ZeGd^Nspz|3DWhCB&oVy>M$gPuxxi_yy-8;tF> g0Zp`cBA&MyefX5w`vQ9Oi0@?MM>6 Date: Fri, 31 Aug 2018 19:39:01 +0200 Subject: [PATCH 010/155] [Weld] Introduce new package structure --- .../runtime/java => io/cucumber}/weld/WeldFactory.java | 4 ++-- .../src/test/java/io/cucumber/weld}/Belly.java | 2 +- .../runtime/java => io/cucumber}/weld/BellyStepdefs.java | 2 +- .../src/test/java/io/cucumber/weld}/RunCukesTest.java | 2 +- .../src/test/java/io/cucumber/weld}/UnusedGlue.java | 2 +- .../runtime/java => io/cucumber}/weld/WeldFactoryTest.java | 2 +- .../{cucumber/runtime/java => io/cucumber}/weld/cukes.feature | 0 7 files changed, 7 insertions(+), 7 deletions(-) rename weld/src/main/java/{cucumber/runtime/java => io/cucumber}/weld/WeldFactory.java (96%) rename {openejb/src/test/java/cucumber/runtime/java/openejb => weld/src/test/java/io/cucumber/weld}/Belly.java (81%) rename weld/src/test/java/{cucumber/runtime/java => io/cucumber}/weld/BellyStepdefs.java (96%) rename {openejb/src/test/java/cucumber/runtime/java/openejb => weld/src/test/java/io/cucumber/weld}/RunCukesTest.java (76%) rename {openejb/src/test/java/cucumber/runtime/java/openejb => weld/src/test/java/io/cucumber/weld}/UnusedGlue.java (90%) rename weld/src/test/java/{cucumber/runtime/java => io/cucumber}/weld/WeldFactoryTest.java (95%) rename weld/src/test/resources/{cucumber/runtime/java => io/cucumber}/weld/cukes.feature (100%) diff --git a/weld/src/main/java/cucumber/runtime/java/weld/WeldFactory.java b/weld/src/main/java/io/cucumber/weld/WeldFactory.java similarity index 96% rename from weld/src/main/java/cucumber/runtime/java/weld/WeldFactory.java rename to weld/src/main/java/io/cucumber/weld/WeldFactory.java index 723993110a..095a9623e0 100644 --- a/weld/src/main/java/cucumber/runtime/java/weld/WeldFactory.java +++ b/weld/src/main/java/io/cucumber/weld/WeldFactory.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.weld; +package io.cucumber.weld; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import cucumber.api.java.ObjectFactory; import org.jboss.weld.environment.se.Weld; import org.jboss.weld.environment.se.WeldContainer; diff --git a/openejb/src/test/java/cucumber/runtime/java/openejb/Belly.java b/weld/src/test/java/io/cucumber/weld/Belly.java similarity index 81% rename from openejb/src/test/java/cucumber/runtime/java/openejb/Belly.java rename to weld/src/test/java/io/cucumber/weld/Belly.java index 50d2e4e94c..42348f8f95 100644 --- a/openejb/src/test/java/cucumber/runtime/java/openejb/Belly.java +++ b/weld/src/test/java/io/cucumber/weld/Belly.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.openejb; +package io.cucumber.weld; public class Belly { private int cukes; diff --git a/weld/src/test/java/cucumber/runtime/java/weld/BellyStepdefs.java b/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java similarity index 96% rename from weld/src/test/java/cucumber/runtime/java/weld/BellyStepdefs.java rename to weld/src/test/java/io/cucumber/weld/BellyStepdefs.java index 7f18e92c52..879ce2af89 100644 --- a/weld/src/test/java/cucumber/runtime/java/weld/BellyStepdefs.java +++ b/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.weld; +package io.cucumber.weld; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/openejb/src/test/java/cucumber/runtime/java/openejb/RunCukesTest.java b/weld/src/test/java/io/cucumber/weld/RunCukesTest.java similarity index 76% rename from openejb/src/test/java/cucumber/runtime/java/openejb/RunCukesTest.java rename to weld/src/test/java/io/cucumber/weld/RunCukesTest.java index 27c91af1b8..716dd0251c 100644 --- a/openejb/src/test/java/cucumber/runtime/java/openejb/RunCukesTest.java +++ b/weld/src/test/java/io/cucumber/weld/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.openejb; +package io.cucumber.weld; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/openejb/src/test/java/cucumber/runtime/java/openejb/UnusedGlue.java b/weld/src/test/java/io/cucumber/weld/UnusedGlue.java similarity index 90% rename from openejb/src/test/java/cucumber/runtime/java/openejb/UnusedGlue.java rename to weld/src/test/java/io/cucumber/weld/UnusedGlue.java index 4f06280778..3a5a437ad3 100644 --- a/openejb/src/test/java/cucumber/runtime/java/openejb/UnusedGlue.java +++ b/weld/src/test/java/io/cucumber/weld/UnusedGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.openejb; +package io.cucumber.weld; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/weld/src/test/java/cucumber/runtime/java/weld/WeldFactoryTest.java b/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java similarity index 95% rename from weld/src/test/java/cucumber/runtime/java/weld/WeldFactoryTest.java rename to weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java index 81b085b773..59411cb013 100644 --- a/weld/src/test/java/cucumber/runtime/java/weld/WeldFactoryTest.java +++ b/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.weld; +package io.cucumber.weld; import cucumber.api.java.ObjectFactory; import org.junit.Test; diff --git a/weld/src/test/resources/cucumber/runtime/java/weld/cukes.feature b/weld/src/test/resources/io/cucumber/weld/cukes.feature similarity index 100% rename from weld/src/test/resources/cucumber/runtime/java/weld/cukes.feature rename to weld/src/test/resources/io/cucumber/weld/cukes.feature From 96c0ebb6c1659177c5314cd558ac408fd751368a Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 19:39:11 +0200 Subject: [PATCH 011/155] [OpenEJB] Introduce new package structure --- openejb/src/main/java/cucumber/api/openejb/README.java | 5 ----- .../java => io/cucumber}/openejb/OpenEJBObjectFactory.java | 4 ++-- openejb/src/main/java/io/cucumber/openejb/README.java | 5 +++++ .../java/{cucumber/api => io/cucumber}/openejb/package.html | 0 .../src/test/java/io/cucumber/openejb}/Belly.java | 2 +- .../runtime/java => io/cucumber}/openejb/BellyStepdefs.java | 2 +- .../cucumber}/openejb/OpenEJBObjectFactoryTest.java | 2 +- .../src/test/java/io/cucumber/openejb}/RunCukesTest.java | 5 ++--- .../src/test/java/io/cucumber/openejb}/UnusedGlue.java | 2 +- .../runtime/java => io/cucumber}/openejb/cukes.feature | 0 10 files changed, 13 insertions(+), 14 deletions(-) delete mode 100644 openejb/src/main/java/cucumber/api/openejb/README.java rename openejb/src/main/java/{cucumber/runtime/java => io/cucumber}/openejb/OpenEJBObjectFactory.java (95%) create mode 100644 openejb/src/main/java/io/cucumber/openejb/README.java rename openejb/src/main/java/{cucumber/api => io/cucumber}/openejb/package.html (100%) rename {weld/src/test/java/cucumber/runtime/java/weld => openejb/src/test/java/io/cucumber/openejb}/Belly.java (83%) rename openejb/src/test/java/{cucumber/runtime/java => io/cucumber}/openejb/BellyStepdefs.java (92%) rename openejb/src/test/java/{cucumber/runtime/java => io/cucumber}/openejb/OpenEJBObjectFactoryTest.java (94%) rename {needle/src/test/java/cucumber/runtime/java/needle => openejb/src/test/java/io/cucumber/openejb}/RunCukesTest.java (76%) mode change 100755 => 100644 rename {weld/src/test/java/cucumber/runtime/java/weld => openejb/src/test/java/io/cucumber/openejb}/UnusedGlue.java (91%) rename openejb/src/test/resources/{cucumber/runtime/java => io/cucumber}/openejb/cukes.feature (100%) diff --git a/openejb/src/main/java/cucumber/api/openejb/README.java b/openejb/src/main/java/cucumber/api/openejb/README.java deleted file mode 100644 index c11069d2f3..0000000000 --- a/openejb/src/main/java/cucumber/api/openejb/README.java +++ /dev/null @@ -1,5 +0,0 @@ -package cucumber.api.openejb; - - -public class README { -} diff --git a/openejb/src/main/java/cucumber/runtime/java/openejb/OpenEJBObjectFactory.java b/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java similarity index 95% rename from openejb/src/main/java/cucumber/runtime/java/openejb/OpenEJBObjectFactory.java rename to openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java index 6cefde1a7b..54192bcd53 100644 --- a/openejb/src/main/java/cucumber/runtime/java/openejb/OpenEJBObjectFactory.java +++ b/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.openejb; +package io.cucumber.openejb; -import cucumber.runtime.CucumberException; +import io.cucumber.core.exception.CucumberException; import cucumber.api.java.ObjectFactory; import org.apache.openejb.OpenEjbContainer; diff --git a/openejb/src/main/java/io/cucumber/openejb/README.java b/openejb/src/main/java/io/cucumber/openejb/README.java new file mode 100644 index 0000000000..fb47cd4438 --- /dev/null +++ b/openejb/src/main/java/io/cucumber/openejb/README.java @@ -0,0 +1,5 @@ +package io.cucumber.openejb; + + +public class README { +} diff --git a/openejb/src/main/java/cucumber/api/openejb/package.html b/openejb/src/main/java/io/cucumber/openejb/package.html similarity index 100% rename from openejb/src/main/java/cucumber/api/openejb/package.html rename to openejb/src/main/java/io/cucumber/openejb/package.html diff --git a/weld/src/test/java/cucumber/runtime/java/weld/Belly.java b/openejb/src/test/java/io/cucumber/openejb/Belly.java similarity index 83% rename from weld/src/test/java/cucumber/runtime/java/weld/Belly.java rename to openejb/src/test/java/io/cucumber/openejb/Belly.java index 53926230b8..3e903f1290 100644 --- a/weld/src/test/java/cucumber/runtime/java/weld/Belly.java +++ b/openejb/src/test/java/io/cucumber/openejb/Belly.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.weld; +package io.cucumber.openejb; public class Belly { private int cukes; diff --git a/openejb/src/test/java/cucumber/runtime/java/openejb/BellyStepdefs.java b/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java similarity index 92% rename from openejb/src/test/java/cucumber/runtime/java/openejb/BellyStepdefs.java rename to openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java index 5d28c77245..4e42281038 100644 --- a/openejb/src/test/java/cucumber/runtime/java/openejb/BellyStepdefs.java +++ b/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.openejb; +package io.cucumber.openejb; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/openejb/src/test/java/cucumber/runtime/java/openejb/OpenEJBObjectFactoryTest.java b/openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java similarity index 94% rename from openejb/src/test/java/cucumber/runtime/java/openejb/OpenEJBObjectFactoryTest.java rename to openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java index 4809af1979..0840c05093 100644 --- a/openejb/src/test/java/cucumber/runtime/java/openejb/OpenEJBObjectFactoryTest.java +++ b/openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.openejb; +package io.cucumber.openejb; import cucumber.api.java.ObjectFactory; import org.junit.Test; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/RunCukesTest.java b/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java old mode 100755 new mode 100644 similarity index 76% rename from needle/src/test/java/cucumber/runtime/java/needle/RunCukesTest.java rename to openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java index 2762e074b5..09fbc6a54c --- a/needle/src/test/java/cucumber/runtime/java/needle/RunCukesTest.java +++ b/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java @@ -1,8 +1,7 @@ -package cucumber.runtime.java.needle; - -import org.junit.runner.RunWith; +package io.cucumber.openejb; import cucumber.api.junit.Cucumber; +import org.junit.runner.RunWith; @RunWith(Cucumber.class) public class RunCukesTest { diff --git a/weld/src/test/java/cucumber/runtime/java/weld/UnusedGlue.java b/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java similarity index 91% rename from weld/src/test/java/cucumber/runtime/java/weld/UnusedGlue.java rename to openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java index 8ea276ac90..87f9e18d55 100644 --- a/weld/src/test/java/cucumber/runtime/java/weld/UnusedGlue.java +++ b/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.weld; +package io.cucumber.openejb; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/openejb/src/test/resources/cucumber/runtime/java/openejb/cukes.feature b/openejb/src/test/resources/io/cucumber/openejb/cukes.feature similarity index 100% rename from openejb/src/test/resources/cucumber/runtime/java/openejb/cukes.feature rename to openejb/src/test/resources/io/cucumber/openejb/cukes.feature From bd5eac095576a5f7fb16a19ed596c74c9485601d Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 19:39:25 +0200 Subject: [PATCH 012/155] [Needle] Introduce new package structure --- .../needle/InjectionProviderInstancesSupplier.java | 2 +- .../java => io/cucumber}/needle/NeedleFactory.java | 11 +++++------ ...CollectInjectionProvidersFromStepsInstance.java | 4 ++-- .../config/CreateInstanceByDefaultConstructor.java | 2 +- .../needle/config/CucumberNeedleConfiguration.java | 2 +- .../needle/config/LoadResourceBundle.java | 2 +- .../config/ReadInjectionProviderClassNames.java | 2 +- .../needle/test/injectionprovider/NameGetter.java | 7 ------- .../needle/test/injectionprovider/ValueGetter.java | 7 ------- .../cucumber}/needle/NeedleFactoryTest.java | 6 +++--- .../java/io/cucumber/needle}/RunCukesTest.java | 5 +++-- ...ectInjectionProvidersFromStepsInstanceTest.java | 4 ++-- .../CreateInstanceByDefaultConstructorTest.java | 2 +- .../config/CucumberNeedleConfigurationTest.java | 14 ++++++-------- .../LoadCucumberNeedleResourceBundleTest.java | 8 ++++---- .../ReadInjectionProviderClassNamesTest.java | 7 +++---- .../DefaultInstanceInjectionProvider.java | 2 +- .../needle/injection/NamedInjectionProvider.java | 2 +- .../cucumber}/needle/test/AtmWithdrawalGlue.java | 6 +++--- .../cucumber}/needle/test/AtmWithdrawalSteps.java | 12 ++++++------ .../cucumber}/needle/test/MoreSteps.java | 4 ++-- .../cucumber}/needle/test/atm/AtmService.java | 2 +- .../cucumber}/needle/test/atm/AtmServiceBean.java | 5 ++--- .../needle/test/atm/AtmServiceBeanTest.java | 2 +- .../cucumber}/needle/test/atm/BicGetter.java | 2 +- .../needle/test/injectionprovider/NameGetter.java | 7 +++++++ .../SimpleNameGetterProvider.java | 2 +- .../needle/test/injectionprovider/ValueGetter.java | 7 +++++++ .../injectionprovider/ValueInjectionProvider.java | 4 ++-- .../src/test/resources/cucumber-needle.properties | 2 +- .../java => io/cucumber}/needle/atm.feature | 0 31 files changed, 70 insertions(+), 74 deletions(-) rename needle/src/main/java/{cucumber/runtime/java => io/cucumber}/needle/NeedleFactory.java (89%) rename needle/src/main/java/{cucumber/runtime/java => io/cucumber}/needle/config/CollectInjectionProvidersFromStepsInstance.java (96%) rename needle/src/main/java/{cucumber/runtime/java => io/cucumber}/needle/config/CreateInstanceByDefaultConstructor.java (94%) rename needle/src/main/java/{cucumber/runtime/java => io/cucumber}/needle/config/CucumberNeedleConfiguration.java (98%) rename needle/src/main/java/{cucumber/runtime/java => io/cucumber}/needle/config/LoadResourceBundle.java (97%) rename needle/src/main/java/{cucumber/runtime/java => io/cucumber}/needle/config/ReadInjectionProviderClassNames.java (95%) delete mode 100755 needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/NameGetter.java delete mode 100755 needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueGetter.java rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/NeedleFactoryTest.java (79%) rename {weld/src/test/java/cucumber/runtime/java/weld => needle/src/test/java/io/cucumber/needle}/RunCukesTest.java (77%) mode change 100644 => 100755 rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java (94%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/config/CreateInstanceByDefaultConstructorTest.java (95%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/config/CucumberNeedleConfigurationTest.java (60%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/config/LoadCucumberNeedleResourceBundleTest.java (85%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/config/ReadInjectionProviderClassNamesTest.java (89%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/injection/DefaultInstanceInjectionProvider.java (97%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/injection/NamedInjectionProvider.java (97%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/test/AtmWithdrawalGlue.java (67%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/test/AtmWithdrawalSteps.java (87%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/test/MoreSteps.java (89%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/test/atm/AtmService.java (75%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/test/atm/AtmServiceBean.java (80%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/test/atm/AtmServiceBeanTest.java (92%) rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/test/atm/BicGetter.java (53%) create mode 100755 needle/src/test/java/io/cucumber/needle/test/injectionprovider/NameGetter.java rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/test/injectionprovider/SimpleNameGetterProvider.java (93%) create mode 100755 needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueGetter.java rename needle/src/test/java/{cucumber/runtime/java => io/cucumber}/needle/test/injectionprovider/ValueInjectionProvider.java (71%) rename needle/src/test/resources/{cucumber/runtime/java => io/cucumber}/needle/atm.feature (100%) diff --git a/needle/src/main/java/cucumber/api/needle/InjectionProviderInstancesSupplier.java b/needle/src/main/java/cucumber/api/needle/InjectionProviderInstancesSupplier.java index 271f1dd9d1..58b2318593 100644 --- a/needle/src/main/java/cucumber/api/needle/InjectionProviderInstancesSupplier.java +++ b/needle/src/main/java/cucumber/api/needle/InjectionProviderInstancesSupplier.java @@ -1,6 +1,6 @@ package cucumber.api.needle; -import cucumber.runtime.java.needle.NeedleFactory; +import io.cucumber.needle.NeedleFactory; import de.akquinet.jbosscc.needle.NeedleTestcase; import de.akquinet.jbosscc.needle.injection.InjectionProvider; diff --git a/needle/src/main/java/cucumber/runtime/java/needle/NeedleFactory.java b/needle/src/main/java/io/cucumber/needle/NeedleFactory.java similarity index 89% rename from needle/src/main/java/cucumber/runtime/java/needle/NeedleFactory.java rename to needle/src/main/java/io/cucumber/needle/NeedleFactory.java index 78efaa861b..88e2190613 100644 --- a/needle/src/main/java/cucumber/runtime/java/needle/NeedleFactory.java +++ b/needle/src/main/java/io/cucumber/needle/NeedleFactory.java @@ -1,9 +1,9 @@ -package cucumber.runtime.java.needle; +package io.cucumber.needle; import cucumber.api.java.ObjectFactory; -import cucumber.runtime.java.needle.config.CollectInjectionProvidersFromStepsInstance; -import cucumber.runtime.java.needle.config.CreateInstanceByDefaultConstructor; -import cucumber.runtime.java.needle.config.CucumberNeedleConfiguration; +import io.cucumber.needle.config.CollectInjectionProvidersFromStepsInstance; +import io.cucumber.needle.config.CreateInstanceByDefaultConstructor; +import io.cucumber.needle.config.CucumberNeedleConfiguration; import de.akquinet.jbosscc.needle.NeedleTestcase; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import org.slf4j.Logger; @@ -12,7 +12,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import static cucumber.runtime.java.needle.config.CucumberNeedleConfiguration.RESOURCE_CUCUMBER_NEEDLE; import static java.lang.String.format; /** @@ -26,7 +25,7 @@ public class NeedleFactory extends NeedleTestcase implements ObjectFactory { private final CollectInjectionProvidersFromStepsInstance collectInjectionProvidersFromStepsInstance = CollectInjectionProvidersFromStepsInstance.INSTANCE; public NeedleFactory() { - super(setUpInjectionProviders(RESOURCE_CUCUMBER_NEEDLE)); + super(setUpInjectionProviders(CucumberNeedleConfiguration.RESOURCE_CUCUMBER_NEEDLE)); } @Override diff --git a/needle/src/main/java/cucumber/runtime/java/needle/config/CollectInjectionProvidersFromStepsInstance.java b/needle/src/main/java/io/cucumber/needle/config/CollectInjectionProvidersFromStepsInstance.java similarity index 96% rename from needle/src/main/java/cucumber/runtime/java/needle/config/CollectInjectionProvidersFromStepsInstance.java rename to needle/src/main/java/io/cucumber/needle/config/CollectInjectionProvidersFromStepsInstance.java index 3ac2b0d39a..533126b48d 100755 --- a/needle/src/main/java/cucumber/runtime/java/needle/config/CollectInjectionProvidersFromStepsInstance.java +++ b/needle/src/main/java/io/cucumber/needle/config/CollectInjectionProvidersFromStepsInstance.java @@ -1,8 +1,8 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle.config; import cucumber.api.needle.InjectionProviderInstancesSupplier; import cucumber.api.needle.NeedleInjectionProvider; -import cucumber.runtime.java.needle.NeedleFactory; +import io.cucumber.needle.NeedleFactory; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import de.akquinet.jbosscc.needle.reflection.ReflectionUtil; import org.slf4j.Logger; diff --git a/needle/src/main/java/cucumber/runtime/java/needle/config/CreateInstanceByDefaultConstructor.java b/needle/src/main/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructor.java similarity index 94% rename from needle/src/main/java/cucumber/runtime/java/needle/config/CreateInstanceByDefaultConstructor.java rename to needle/src/main/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructor.java index b3d2e42078..5a7373df82 100644 --- a/needle/src/main/java/cucumber/runtime/java/needle/config/CreateInstanceByDefaultConstructor.java +++ b/needle/src/main/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructor.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/needle/src/main/java/cucumber/runtime/java/needle/config/CucumberNeedleConfiguration.java b/needle/src/main/java/io/cucumber/needle/config/CucumberNeedleConfiguration.java similarity index 98% rename from needle/src/main/java/cucumber/runtime/java/needle/config/CucumberNeedleConfiguration.java rename to needle/src/main/java/io/cucumber/needle/config/CucumberNeedleConfiguration.java index cc15d9b948..7f1f941504 100644 --- a/needle/src/main/java/cucumber/runtime/java/needle/config/CucumberNeedleConfiguration.java +++ b/needle/src/main/java/io/cucumber/needle/config/CucumberNeedleConfiguration.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle.config; import cucumber.api.needle.InjectionProviderInstancesSupplier; import de.akquinet.jbosscc.needle.injection.InjectionProvider; diff --git a/needle/src/main/java/cucumber/runtime/java/needle/config/LoadResourceBundle.java b/needle/src/main/java/io/cucumber/needle/config/LoadResourceBundle.java similarity index 97% rename from needle/src/main/java/cucumber/runtime/java/needle/config/LoadResourceBundle.java rename to needle/src/main/java/io/cucumber/needle/config/LoadResourceBundle.java index f79fc52b8f..5dfbcefa82 100644 --- a/needle/src/main/java/cucumber/runtime/java/needle/config/LoadResourceBundle.java +++ b/needle/src/main/java/io/cucumber/needle/config/LoadResourceBundle.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/needle/src/main/java/cucumber/runtime/java/needle/config/ReadInjectionProviderClassNames.java b/needle/src/main/java/io/cucumber/needle/config/ReadInjectionProviderClassNames.java similarity index 95% rename from needle/src/main/java/cucumber/runtime/java/needle/config/ReadInjectionProviderClassNames.java rename to needle/src/main/java/io/cucumber/needle/config/ReadInjectionProviderClassNames.java index dbab929ca3..ebfdd0d3a1 100644 --- a/needle/src/main/java/cucumber/runtime/java/needle/config/ReadInjectionProviderClassNames.java +++ b/needle/src/main/java/io/cucumber/needle/config/ReadInjectionProviderClassNames.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle.config; import java.util.LinkedHashSet; import java.util.ResourceBundle; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/NameGetter.java b/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/NameGetter.java deleted file mode 100755 index feff9b2d35..0000000000 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/NameGetter.java +++ /dev/null @@ -1,7 +0,0 @@ -package cucumber.runtime.java.needle.test.injectionprovider; - -public interface NameGetter { - - String getName(); - -} diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueGetter.java b/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueGetter.java deleted file mode 100755 index 96a98496bb..0000000000 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueGetter.java +++ /dev/null @@ -1,7 +0,0 @@ -package cucumber.runtime.java.needle.test.injectionprovider; - -public interface ValueGetter { - - String getValue(); - -} diff --git a/needle/src/test/java/cucumber/runtime/java/needle/NeedleFactoryTest.java b/needle/src/test/java/io/cucumber/needle/NeedleFactoryTest.java similarity index 79% rename from needle/src/test/java/cucumber/runtime/java/needle/NeedleFactoryTest.java rename to needle/src/test/java/io/cucumber/needle/NeedleFactoryTest.java index 9a84c3266e..a6dcd5cbee 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/NeedleFactoryTest.java +++ b/needle/src/test/java/io/cucumber/needle/NeedleFactoryTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle; +package io.cucumber.needle; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertNotNull; @@ -6,8 +6,8 @@ import org.junit.Test; -import cucumber.runtime.java.needle.config.CucumberNeedleConfiguration; -import cucumber.runtime.java.needle.test.injectionprovider.SimpleNameGetterProvider; +import io.cucumber.needle.config.CucumberNeedleConfiguration; +import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider; import de.akquinet.jbosscc.needle.injection.InjectionProvider; public class NeedleFactoryTest { diff --git a/weld/src/test/java/cucumber/runtime/java/weld/RunCukesTest.java b/needle/src/test/java/io/cucumber/needle/RunCukesTest.java old mode 100644 new mode 100755 similarity index 77% rename from weld/src/test/java/cucumber/runtime/java/weld/RunCukesTest.java rename to needle/src/test/java/io/cucumber/needle/RunCukesTest.java index 8dd2b6095d..253e4e95f0 --- a/weld/src/test/java/cucumber/runtime/java/weld/RunCukesTest.java +++ b/needle/src/test/java/io/cucumber/needle/RunCukesTest.java @@ -1,8 +1,9 @@ -package cucumber.runtime.java.weld; +package io.cucumber.needle; -import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; +import cucumber.api.junit.Cucumber; + @RunWith(Cucumber.class) public class RunCukesTest { } diff --git a/needle/src/test/java/cucumber/runtime/java/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java b/needle/src/test/java/io/cucumber/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java similarity index 94% rename from needle/src/test/java/cucumber/runtime/java/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java rename to needle/src/test/java/io/cucumber/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java index 8ba0781364..6855ebf838 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java +++ b/needle/src/test/java/io/cucumber/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle.config; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -9,11 +9,11 @@ import javax.inject.Inject; import javax.inject.Named; +import io.cucumber.needle.injection.NamedInjectionProvider; import org.junit.Test; import cucumber.api.needle.InjectionProviderInstancesSupplier; import cucumber.api.needle.NeedleInjectionProvider; -import cucumber.runtime.java.needle.injection.NamedInjectionProvider; import de.akquinet.jbosscc.needle.NeedleTestcase; import de.akquinet.jbosscc.needle.annotation.ObjectUnderTest; import de.akquinet.jbosscc.needle.injection.InjectionProvider; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/config/CreateInstanceByDefaultConstructorTest.java b/needle/src/test/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructorTest.java similarity index 95% rename from needle/src/test/java/cucumber/runtime/java/needle/config/CreateInstanceByDefaultConstructorTest.java rename to needle/src/test/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructorTest.java index 0c86050b9f..be3fa56677 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/config/CreateInstanceByDefaultConstructorTest.java +++ b/needle/src/test/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructorTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle.config; import static org.junit.Assert.assertNotNull; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/config/CucumberNeedleConfigurationTest.java b/needle/src/test/java/io/cucumber/needle/config/CucumberNeedleConfigurationTest.java similarity index 60% rename from needle/src/test/java/cucumber/runtime/java/needle/config/CucumberNeedleConfigurationTest.java rename to needle/src/test/java/io/cucumber/needle/config/CucumberNeedleConfigurationTest.java index 758e42d0c3..1e2909baae 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/config/CucumberNeedleConfigurationTest.java +++ b/needle/src/test/java/io/cucumber/needle/config/CucumberNeedleConfigurationTest.java @@ -1,7 +1,5 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle.config; -import static cucumber.runtime.java.needle.config.CucumberNeedleConfiguration.isInjectionProvider; -import static cucumber.runtime.java.needle.config.CucumberNeedleConfiguration.isInjectionProviderInstanceSupplier; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -11,7 +9,7 @@ import org.junit.Test; import cucumber.api.needle.InjectionProviderInstancesSupplier; -import cucumber.runtime.java.needle.test.injectionprovider.SimpleNameGetterProvider; +import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider; import de.akquinet.jbosscc.needle.injection.InjectionProvider; public class CucumberNeedleConfigurationTest { @@ -29,9 +27,9 @@ public void shouldReturnEmptyInstances() { @Test public void shouldEvaluateIfTypeIsInjectionProviderOrSupplier() throws Exception { - assertTrue(isInjectionProvider(SimpleNameGetterProvider.class)); - assertFalse(isInjectionProviderInstanceSupplier(SimpleNameGetterProvider.class)); - assertFalse(isInjectionProvider(A.class)); - assertTrue(isInjectionProviderInstanceSupplier(A.class)); + assertTrue(CucumberNeedleConfiguration.isInjectionProvider(SimpleNameGetterProvider.class)); + assertFalse(CucumberNeedleConfiguration.isInjectionProviderInstanceSupplier(SimpleNameGetterProvider.class)); + assertFalse(CucumberNeedleConfiguration.isInjectionProvider(A.class)); + assertTrue(CucumberNeedleConfiguration.isInjectionProviderInstanceSupplier(A.class)); } } diff --git a/needle/src/test/java/cucumber/runtime/java/needle/config/LoadCucumberNeedleResourceBundleTest.java b/needle/src/test/java/io/cucumber/needle/config/LoadCucumberNeedleResourceBundleTest.java similarity index 85% rename from needle/src/test/java/cucumber/runtime/java/needle/config/LoadCucumberNeedleResourceBundleTest.java rename to needle/src/test/java/io/cucumber/needle/config/LoadCucumberNeedleResourceBundleTest.java index b8b15ccecb..4ec5d6868c 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/config/LoadCucumberNeedleResourceBundleTest.java +++ b/needle/src/test/java/io/cucumber/needle/config/LoadCucumberNeedleResourceBundleTest.java @@ -1,6 +1,5 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle.config; -import static cucumber.runtime.java.needle.config.LoadResourceBundle.EMPTY_RESOURCE_BUNDLE; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -9,6 +8,7 @@ import java.util.ResourceBundle; +import org.hamcrest.CoreMatchers; import org.junit.Test; public class LoadCucumberNeedleResourceBundleTest { @@ -19,7 +19,7 @@ public class LoadCucumberNeedleResourceBundleTest { public void shouldReturnEmptyResourceBundleWhenResourceDoesNotExist() throws Exception { final ResourceBundle resourceBundle = function.apply("does-not-exist"); assertNotNull(resourceBundle); - assertThat(resourceBundle, is(EMPTY_RESOURCE_BUNDLE)); + assertThat(resourceBundle, CoreMatchers.is(LoadResourceBundle.EMPTY_RESOURCE_BUNDLE)); } @Test @@ -31,7 +31,7 @@ public void shouldReturnExistingResourceBundle() throws Exception { @Test public void shouldAlwaysReturnEmptyForEmptyResourceBundle() throws Exception { - final ResourceBundle resourceBundle = EMPTY_RESOURCE_BUNDLE; + final ResourceBundle resourceBundle = LoadResourceBundle.EMPTY_RESOURCE_BUNDLE; assertNotNull(resourceBundle.getObject("foo")); assertThat(resourceBundle.getString("foo"), is("")); diff --git a/needle/src/test/java/cucumber/runtime/java/needle/config/ReadInjectionProviderClassNamesTest.java b/needle/src/test/java/io/cucumber/needle/config/ReadInjectionProviderClassNamesTest.java similarity index 89% rename from needle/src/test/java/cucumber/runtime/java/needle/config/ReadInjectionProviderClassNamesTest.java rename to needle/src/test/java/io/cucumber/needle/config/ReadInjectionProviderClassNamesTest.java index 3a6dddcb91..b3ce6bbeb6 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/config/ReadInjectionProviderClassNamesTest.java +++ b/needle/src/test/java/io/cucumber/needle/config/ReadInjectionProviderClassNamesTest.java @@ -1,6 +1,5 @@ -package cucumber.runtime.java.needle.config; +package io.cucumber.needle.config; -import static cucumber.runtime.java.needle.config.CucumberNeedleConfiguration.RESOURCE_CUCUMBER_NEEDLE; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.core.IsCollectionContaining.hasItems; import static org.junit.Assert.assertNotNull; @@ -11,7 +10,7 @@ import org.junit.Test; -import cucumber.runtime.java.needle.test.injectionprovider.SimpleNameGetterProvider; +import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider; public class ReadInjectionProviderClassNamesTest { @@ -19,7 +18,7 @@ public class ReadInjectionProviderClassNamesTest { @Test public void shouldReturnProviderFromCucumberNeedleProperties() throws Exception { - final Set classNames = function.apply(loadBundle(RESOURCE_CUCUMBER_NEEDLE)); + final Set classNames = function.apply(loadBundle(CucumberNeedleConfiguration.RESOURCE_CUCUMBER_NEEDLE)); assertNotNull(classNames); assertThat(classNames.size(), is(1)); assertThat(classNames.iterator().next(), is(SimpleNameGetterProvider.class.getCanonicalName())); diff --git a/needle/src/test/java/cucumber/runtime/java/needle/injection/DefaultInstanceInjectionProvider.java b/needle/src/test/java/io/cucumber/needle/injection/DefaultInstanceInjectionProvider.java similarity index 97% rename from needle/src/test/java/cucumber/runtime/java/needle/injection/DefaultInstanceInjectionProvider.java rename to needle/src/test/java/io/cucumber/needle/injection/DefaultInstanceInjectionProvider.java index 877dd77f76..61a199f971 100755 --- a/needle/src/test/java/cucumber/runtime/java/needle/injection/DefaultInstanceInjectionProvider.java +++ b/needle/src/test/java/io/cucumber/needle/injection/DefaultInstanceInjectionProvider.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.injection; +package io.cucumber.needle.injection; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import de.akquinet.jbosscc.needle.injection.InjectionTargetInformation; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/injection/NamedInjectionProvider.java b/needle/src/test/java/io/cucumber/needle/injection/NamedInjectionProvider.java similarity index 97% rename from needle/src/test/java/cucumber/runtime/java/needle/injection/NamedInjectionProvider.java rename to needle/src/test/java/io/cucumber/needle/injection/NamedInjectionProvider.java index 1f588ba7b0..1142f77862 100755 --- a/needle/src/test/java/cucumber/runtime/java/needle/injection/NamedInjectionProvider.java +++ b/needle/src/test/java/io/cucumber/needle/injection/NamedInjectionProvider.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.injection; +package io.cucumber.needle.injection; import javax.inject.Named; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/AtmWithdrawalGlue.java b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java similarity index 67% rename from needle/src/test/java/cucumber/runtime/java/needle/test/AtmWithdrawalGlue.java rename to needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java index a3f0bf8d1f..4662d9456b 100755 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/AtmWithdrawalGlue.java +++ b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.test; +package io.cucumber.needle.test; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -6,8 +6,8 @@ import javax.inject.Inject; import cucumber.api.java.Before; -import cucumber.runtime.java.needle.test.injectionprovider.NameGetter; -import cucumber.runtime.java.needle.test.injectionprovider.SimpleNameGetterProvider; +import io.cucumber.needle.test.injectionprovider.NameGetter; +import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider; public class AtmWithdrawalGlue { diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/AtmWithdrawalSteps.java b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java similarity index 87% rename from needle/src/test/java/cucumber/runtime/java/needle/test/AtmWithdrawalSteps.java rename to needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java index 674cbc646d..88146d22f4 100755 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/AtmWithdrawalSteps.java +++ b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.test; +package io.cucumber.needle.test; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertNotNull; @@ -12,11 +12,11 @@ import cucumber.api.java.en.When; import cucumber.api.needle.InjectionProviderInstancesSupplier; import cucumber.api.needle.NeedleInjectionProvider; -import cucumber.runtime.java.needle.injection.DefaultInstanceInjectionProvider; -import cucumber.runtime.java.needle.test.atm.AtmService; -import cucumber.runtime.java.needle.test.atm.AtmServiceBean; -import cucumber.runtime.java.needle.test.atm.BicGetter; -import cucumber.runtime.java.needle.test.injectionprovider.ValueInjectionProvider; +import io.cucumber.needle.injection.DefaultInstanceInjectionProvider; +import io.cucumber.needle.test.atm.AtmService; +import io.cucumber.needle.test.atm.AtmServiceBean; +import io.cucumber.needle.test.atm.BicGetter; +import io.cucumber.needle.test.injectionprovider.ValueInjectionProvider; import de.akquinet.jbosscc.needle.annotation.ObjectUnderTest; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import org.hamcrest.core.Is; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/MoreSteps.java b/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java similarity index 89% rename from needle/src/test/java/cucumber/runtime/java/needle/test/MoreSteps.java rename to needle/src/test/java/io/cucumber/needle/test/MoreSteps.java index dbe9f27171..2d51c1a1c4 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/MoreSteps.java +++ b/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java @@ -1,11 +1,11 @@ -package cucumber.runtime.java.needle.test; +package io.cucumber.needle.test; import static org.junit.Assert.assertTrue; import cucumber.api.java.Before; import cucumber.api.java.en.Given; import cucumber.api.needle.NeedleInjectionProvider; -import cucumber.runtime.java.needle.injection.DefaultInstanceInjectionProvider; +import io.cucumber.needle.injection.DefaultInstanceInjectionProvider; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import javax.inject.Inject; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmService.java b/needle/src/test/java/io/cucumber/needle/test/atm/AtmService.java similarity index 75% rename from needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmService.java rename to needle/src/test/java/io/cucumber/needle/test/atm/AtmService.java index 1718e7dc3e..498855d5a1 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmService.java +++ b/needle/src/test/java/io/cucumber/needle/test/atm/AtmService.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.test.atm; +package io.cucumber.needle.test.atm; public interface AtmService { diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmServiceBean.java b/needle/src/test/java/io/cucumber/needle/test/atm/AtmServiceBean.java similarity index 80% rename from needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmServiceBean.java rename to needle/src/test/java/io/cucumber/needle/test/atm/AtmServiceBean.java index 9116e6d868..bfa17178a4 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmServiceBean.java +++ b/needle/src/test/java/io/cucumber/needle/test/atm/AtmServiceBean.java @@ -1,11 +1,10 @@ -package cucumber.runtime.java.needle.test.atm; +package io.cucumber.needle.test.atm; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.inject.Inject; -import cucumber.runtime.java.needle.test.injectionprovider.ValueGetter; -import cucumber.runtime.java.needle.test.injectionprovider.ValueGetter; +import io.cucumber.needle.test.injectionprovider.ValueGetter; @Stateless public class AtmServiceBean implements AtmService { diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmServiceBeanTest.java b/needle/src/test/java/io/cucumber/needle/test/atm/AtmServiceBeanTest.java similarity index 92% rename from needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmServiceBeanTest.java rename to needle/src/test/java/io/cucumber/needle/test/atm/AtmServiceBeanTest.java index d411a1d91f..54e77fc4a8 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/AtmServiceBeanTest.java +++ b/needle/src/test/java/io/cucumber/needle/test/atm/AtmServiceBeanTest.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.test.atm; +package io.cucumber.needle.test.atm; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/BicGetter.java b/needle/src/test/java/io/cucumber/needle/test/atm/BicGetter.java similarity index 53% rename from needle/src/test/java/cucumber/runtime/java/needle/test/atm/BicGetter.java rename to needle/src/test/java/io/cucumber/needle/test/atm/BicGetter.java index cf8c1c6627..45880bc706 100644 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/atm/BicGetter.java +++ b/needle/src/test/java/io/cucumber/needle/test/atm/BicGetter.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.test.atm; +package io.cucumber.needle.test.atm; public interface BicGetter { diff --git a/needle/src/test/java/io/cucumber/needle/test/injectionprovider/NameGetter.java b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/NameGetter.java new file mode 100755 index 0000000000..b0f6ccc93f --- /dev/null +++ b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/NameGetter.java @@ -0,0 +1,7 @@ +package io.cucumber.needle.test.injectionprovider; + +public interface NameGetter { + + String getName(); + +} diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/SimpleNameGetterProvider.java b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/SimpleNameGetterProvider.java similarity index 93% rename from needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/SimpleNameGetterProvider.java rename to needle/src/test/java/io/cucumber/needle/test/injectionprovider/SimpleNameGetterProvider.java index 39c80974ef..87bae925a8 100755 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/SimpleNameGetterProvider.java +++ b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/SimpleNameGetterProvider.java @@ -1,4 +1,4 @@ -package cucumber.runtime.java.needle.test.injectionprovider; +package io.cucumber.needle.test.injectionprovider; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import de.akquinet.jbosscc.needle.injection.InjectionTargetInformation; diff --git a/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueGetter.java b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueGetter.java new file mode 100755 index 0000000000..f6229d426a --- /dev/null +++ b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueGetter.java @@ -0,0 +1,7 @@ +package io.cucumber.needle.test.injectionprovider; + +public interface ValueGetter { + + String getValue(); + +} diff --git a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueInjectionProvider.java b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueInjectionProvider.java similarity index 71% rename from needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueInjectionProvider.java rename to needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueInjectionProvider.java index 83c2c12e53..09272b1323 100755 --- a/needle/src/test/java/cucumber/runtime/java/needle/test/injectionprovider/ValueInjectionProvider.java +++ b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueInjectionProvider.java @@ -1,6 +1,6 @@ -package cucumber.runtime.java.needle.test.injectionprovider; +package io.cucumber.needle.test.injectionprovider; -import cucumber.runtime.java.needle.injection.DefaultInstanceInjectionProvider; +import io.cucumber.needle.injection.DefaultInstanceInjectionProvider; /** * Returns a value provider returning the value given in constructor. diff --git a/needle/src/test/resources/cucumber-needle.properties b/needle/src/test/resources/cucumber-needle.properties index a0066dea76..2ddd102324 100644 --- a/needle/src/test/resources/cucumber-needle.properties +++ b/needle/src/test/resources/cucumber-needle.properties @@ -1 +1 @@ -custom.injection.provider.classes = cucumber.runtime.java.needle.test.injectionprovider.SimpleNameGetterProvider +custom.injection.provider.classes = io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider diff --git a/needle/src/test/resources/cucumber/runtime/java/needle/atm.feature b/needle/src/test/resources/io/cucumber/needle/atm.feature similarity index 100% rename from needle/src/test/resources/cucumber/runtime/java/needle/atm.feature rename to needle/src/test/resources/io/cucumber/needle/atm.feature From 6c675a11212b13429d187a5448cbc3bd7f197e17 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 19:39:36 +0200 Subject: [PATCH 013/155] [Examples] Introduce new package structure --- .../examples/java/calculator/DateCalculator.java | 2 +- .../examples/java/calculator/RpnCalculator.java | 2 +- .../examples/java/calculator/DateStepdefs.java | 2 +- .../examples/java/calculator/ParameterTypes.java | 8 ++++---- .../java/calculator/RpnCalculatorStepdefs.java | 2 +- .../java/calculator/RunCukesByCompositionBase.java | 2 +- .../java/calculator/RunCukesByCompositionTest.java | 2 +- .../examples/java/calculator/RunCukesTest.java | 2 +- .../examples/java/calculator/ShoppingStepdefs.java | 2 +- .../java/calculator/basic_arithmetic.feature | 0 .../java/calculator/date_calculator.feature | 0 .../examples/java/calculator/shopping.feature | 0 examples/java-calculator/pom.xml | 2 +- .../examples/java/calculator/DateCalculator.java | 2 +- .../examples/java/calculator/RpnCalculator.java | 2 +- .../cucumber/examples/java/calculator/Example.java | 4 ---- .../examples/java/calculator/DateStepdefs.java | 2 +- .../cucumber/examples/java/calculator/Example.java | 4 ++++ .../examples/java/calculator/ParameterTypes.java | 6 +++--- .../java/calculator/RpnCalculatorStepdefs.java | 2 +- .../examples/java/calculator/RunCukesTest.java | 5 +---- .../examples/java/calculator/ShoppingStepdefs.java | 2 +- .../java/calculator/basic_arithmetic.feature | 0 .../java/calculator/date_calculator.feature | 0 .../examples/java/calculator/shopping.feature | 0 .../cucumber/examples/java/wicket/Application.java | 14 +++++++------- .../examples/java/wicket/model/dao/CarDAO.java | 4 ++-- .../java/wicket/model/dao/InMemoryCarDAO.java | 4 ++-- .../examples/java/wicket/model/entity/Car.java | 2 +- .../examples/java/wicket/view/Available.java | 4 ++-- .../cucumber/examples/java/wicket/view/Create.java | 4 ++-- .../cucumber/examples/java/wicket/view/Rent.java | 4 ++-- .../examples/java/wicket/view/Available.html | 0 .../cucumber/examples/java/wicket/view/Create.html | 0 .../cucumber/examples/java/wicket/view/Rent.html | 0 .../src/main/webapp/WEB-INF/web.xml | 2 +- .../cucumber/examples/java/wicket/RentCarTest.java | 8 ++++---- .../cucumber/examples/java/wicket/RunCukesIT.java | 2 +- .../java/wicket/steps/RentACarSupport.java | 2 +- .../examples/java/wicket/steps/RentStepdefs.java | 2 +- .../cucumber/examples/java/wicket/Rent.feature | 0 .../examples/java/calculator/RpnCalculator.java | 2 +- .../java/calculator/RpnCalculatorStepdefs.java | 2 +- .../examples/java/calculator/RunCukesTest.java | 2 +- .../examples/java/calculator/ShoppingStepdefs.java | 2 +- .../java/calculator/TypeRegistryConfiguration.java | 6 +++--- .../java/calculator/basic_arithmetic.feature | 0 .../examples/java/calculator/shopping.feature | 0 .../cucumber/examples/spring/txn/Message.java | 2 +- .../examples/spring/txn/MessageRepository.java | 2 +- .../cucumber/examples/spring/txn/User.java | 2 +- .../examples/spring/txn/UserRepository.java | 2 +- .../examples/spring/txn/web/UserController.java | 6 +++--- .../webapp/WEB-INF/spring/persistenceContext.xml | 4 ++-- .../spring/txn/CucumberContextConfiguration.java | 2 +- .../cucumber/examples/spring/txn/RunCukesTest.java | 2 +- .../examples/spring/txn/SeeMessagesStepdefs.java | 4 +--- .../spring/txn/TypeRegistryConfiguration.java | 2 +- .../cucumber/examples/spring/txn/UserStepdefs.java | 4 +--- .../spring/txn/mock/SpringMockFactory.java | 2 +- .../cucumber/examples/spring/txn/search.feature | 0 .../examples/spring/txn/see_messages.feature | 0 .../spring-txn/src/test/resources/mockContext.xml | 2 +- 63 files changed, 75 insertions(+), 82 deletions(-) rename examples/java-calculator-testng/src/main/java/{ => io}/cucumber/examples/java/calculator/DateCalculator.java (84%) rename examples/java-calculator-testng/src/main/java/{ => io}/cucumber/examples/java/calculator/RpnCalculator.java (96%) rename examples/java-calculator-testng/src/test/java/{ => io}/cucumber/examples/java/calculator/DateStepdefs.java (93%) rename examples/java-calculator-testng/src/test/java/{ => io}/cucumber/examples/java/calculator/ParameterTypes.java (86%) rename examples/java-calculator-testng/src/test/java/{ => io}/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java (97%) rename examples/java-calculator-testng/src/test/java/{ => io}/cucumber/examples/java/calculator/RunCukesByCompositionBase.java (87%) rename examples/java-calculator-testng/src/test/java/{ => io}/cucumber/examples/java/calculator/RunCukesByCompositionTest.java (96%) rename examples/java-calculator-testng/src/test/java/{ => io}/cucumber/examples/java/calculator/RunCukesTest.java (82%) rename examples/java-calculator-testng/src/test/java/{ => io}/cucumber/examples/java/calculator/ShoppingStepdefs.java (96%) rename examples/java-calculator-testng/src/test/resources/{ => io}/cucumber/examples/java/calculator/basic_arithmetic.feature (100%) rename examples/java-calculator-testng/src/test/resources/{ => io}/cucumber/examples/java/calculator/date_calculator.feature (100%) rename examples/java-calculator-testng/src/test/resources/{ => io}/cucumber/examples/java/calculator/shopping.feature (100%) rename examples/java-calculator/src/main/java/{ => io}/cucumber/examples/java/calculator/DateCalculator.java (84%) rename examples/java-calculator/src/main/java/{ => io}/cucumber/examples/java/calculator/RpnCalculator.java (96%) delete mode 100644 examples/java-calculator/src/test/java/cucumber/examples/java/calculator/Example.java rename examples/java-calculator/src/test/java/{ => io}/cucumber/examples/java/calculator/DateStepdefs.java (93%) create mode 100644 examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/Example.java rename examples/java-calculator/src/test/java/{ => io}/cucumber/examples/java/calculator/ParameterTypes.java (90%) rename examples/java-calculator/src/test/java/{ => io}/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java (97%) rename examples/java-calculator/src/test/java/{ => io}/cucumber/examples/java/calculator/RunCukesTest.java (62%) rename examples/java-calculator/src/test/java/{ => io}/cucumber/examples/java/calculator/ShoppingStepdefs.java (96%) rename examples/java-calculator/src/test/resources/{ => io}/cucumber/examples/java/calculator/basic_arithmetic.feature (100%) rename examples/java-calculator/src/test/resources/{ => io}/cucumber/examples/java/calculator/date_calculator.feature (100%) rename examples/java-calculator/src/test/resources/{ => io}/cucumber/examples/java/calculator/shopping.feature (100%) rename examples/java-wicket/java-wicket-main/src/main/java/{ => io}/cucumber/examples/java/wicket/Application.java (65%) rename examples/java-wicket/java-wicket-main/src/main/java/{ => io}/cucumber/examples/java/wicket/model/dao/CarDAO.java (53%) rename examples/java-wicket/java-wicket-main/src/main/java/{ => io}/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java (88%) rename examples/java-wicket/java-wicket-main/src/main/java/{ => io}/cucumber/examples/java/wicket/model/entity/Car.java (75%) rename examples/java-wicket/java-wicket-main/src/main/java/{ => io}/cucumber/examples/java/wicket/view/Available.java (81%) rename examples/java-wicket/java-wicket-main/src/main/java/{ => io}/cucumber/examples/java/wicket/view/Create.java (93%) rename examples/java-wicket/java-wicket-main/src/main/java/{ => io}/cucumber/examples/java/wicket/view/Rent.java (88%) rename examples/java-wicket/java-wicket-main/src/main/resources/{ => io}/cucumber/examples/java/wicket/view/Available.html (100%) rename examples/java-wicket/java-wicket-main/src/main/resources/{ => io}/cucumber/examples/java/wicket/view/Create.html (100%) rename examples/java-wicket/java-wicket-main/src/main/resources/{ => io}/cucumber/examples/java/wicket/view/Rent.html (100%) rename examples/java-wicket/java-wicket-main/src/test/java/{ => io}/cucumber/examples/java/wicket/RentCarTest.java (81%) rename examples/java-wicket/java-wicket-test/src/test/java/{ => io}/cucumber/examples/java/wicket/RunCukesIT.java (74%) rename examples/java-wicket/java-wicket-test/src/test/java/{ => io}/cucumber/examples/java/wicket/steps/RentACarSupport.java (96%) rename examples/java-wicket/java-wicket-test/src/test/java/{ => io}/cucumber/examples/java/wicket/steps/RentStepdefs.java (95%) rename examples/java-wicket/java-wicket-test/src/test/resources/{ => io}/cucumber/examples/java/wicket/Rent.feature (100%) rename examples/java8-calculator/src/main/java/{ => io}/cucumber/examples/java/calculator/RpnCalculator.java (96%) rename examples/java8-calculator/src/test/java/{ => io}/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java (97%) rename examples/java8-calculator/src/test/java/{ => io}/cucumber/examples/java/calculator/RunCukesTest.java (83%) rename examples/java8-calculator/src/test/java/{ => io}/cucumber/examples/java/calculator/ShoppingStepdefs.java (96%) rename examples/java8-calculator/src/test/java/{ => io}/cucumber/examples/java/calculator/TypeRegistryConfiguration.java (84%) rename examples/java8-calculator/src/test/resources/{ => io}/cucumber/examples/java/calculator/basic_arithmetic.feature (100%) rename examples/java8-calculator/src/test/resources/{ => io}/cucumber/examples/java/calculator/shopping.feature (100%) rename examples/spring-txn/src/main/java/{ => io}/cucumber/examples/spring/txn/Message.java (96%) rename examples/spring-txn/src/main/java/{ => io}/cucumber/examples/spring/txn/MessageRepository.java (77%) rename examples/spring-txn/src/main/java/{ => io}/cucumber/examples/spring/txn/User.java (96%) rename examples/spring-txn/src/main/java/{ => io}/cucumber/examples/spring/txn/UserRepository.java (76%) rename examples/spring-txn/src/main/java/{ => io}/cucumber/examples/spring/txn/web/UserController.java (81%) rename examples/spring-txn/src/test/java/{ => io}/cucumber/examples/spring/txn/CucumberContextConfiguration.java (91%) rename examples/spring-txn/src/test/java/{ => io}/cucumber/examples/spring/txn/RunCukesTest.java (85%) rename examples/spring-txn/src/test/java/{ => io}/cucumber/examples/spring/txn/SeeMessagesStepdefs.java (90%) rename examples/spring-txn/src/test/java/{ => io}/cucumber/examples/spring/txn/TypeRegistryConfiguration.java (95%) rename examples/spring-txn/src/test/java/{ => io}/cucumber/examples/spring/txn/UserStepdefs.java (85%) rename examples/spring-txn/src/test/java/{ => io}/cucumber/examples/spring/txn/mock/SpringMockFactory.java (93%) rename examples/spring-txn/src/test/resources/{ => io}/cucumber/examples/spring/txn/search.feature (100%) rename examples/spring-txn/src/test/resources/{ => io}/cucumber/examples/spring/txn/see_messages.feature (100%) diff --git a/examples/java-calculator-testng/src/main/java/cucumber/examples/java/calculator/DateCalculator.java b/examples/java-calculator-testng/src/main/java/io/cucumber/examples/java/calculator/DateCalculator.java similarity index 84% rename from examples/java-calculator-testng/src/main/java/cucumber/examples/java/calculator/DateCalculator.java rename to examples/java-calculator-testng/src/main/java/io/cucumber/examples/java/calculator/DateCalculator.java index 4ab3eb3816..fc2d67b371 100644 --- a/examples/java-calculator-testng/src/main/java/cucumber/examples/java/calculator/DateCalculator.java +++ b/examples/java-calculator-testng/src/main/java/io/cucumber/examples/java/calculator/DateCalculator.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import java.util.Date; diff --git a/examples/java-calculator-testng/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java b/examples/java-calculator-testng/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java similarity index 96% rename from examples/java-calculator-testng/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java rename to examples/java-calculator-testng/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java index c28c15e9cf..88ee9803b2 100644 --- a/examples/java-calculator-testng/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java +++ b/examples/java-calculator-testng/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import java.util.Deque; import java.util.LinkedList; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/DateStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java similarity index 93% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/DateStepdefs.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java index e2ed09ce10..41a8efe958 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/DateStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/ParameterTypes.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java similarity index 86% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/ParameterTypes.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java index 66a69e5d0f..c7d071ec65 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/ParameterTypes.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java @@ -1,10 +1,10 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.TypeRegistryConfigurer; import cucumber.api.TypeRegistry; -import cucumber.examples.java.calculator.ShoppingStepdefs.Price; +import io.cucumber.examples.java.calculator.ShoppingStepdefs.Price; import io.cucumber.datatable.DataTableType; -import cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; +import io.cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; import io.cucumber.cucumberexpressions.ParameterType; import java.text.SimpleDateFormat; @@ -12,7 +12,7 @@ import java.util.Locale; import java.util.Map; -import static cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; +import static io.cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; import static java.text.DateFormat.MEDIUM; import static java.text.DateFormat.getDateInstance; import static java.util.Locale.ENGLISH; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java similarity index 97% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index aeadb38019..faa18bb85b 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.Scenario; import cucumber.api.java.After; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionBase.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionBase.java similarity index 87% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionBase.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionBase.java index 9169346a2e..5569411564 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionBase.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionBase.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionTest.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java similarity index 96% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionTest.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java index 51ceacc89e..7df7291b7a 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionTest.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.CucumberOptions; import cucumber.api.testng.CucumberFeatureWrapper; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java similarity index 82% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index bca451620b..6b29f42214 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.CucumberOptions; import cucumber.api.testng.AbstractTestNGCucumberTests; diff --git a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java similarity index 96% rename from examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java rename to examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index 4b20c10899..e0045ffb58 100644 --- a/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/examples/java-calculator-testng/src/test/resources/cucumber/examples/java/calculator/basic_arithmetic.feature b/examples/java-calculator-testng/src/test/resources/io/cucumber/examples/java/calculator/basic_arithmetic.feature similarity index 100% rename from examples/java-calculator-testng/src/test/resources/cucumber/examples/java/calculator/basic_arithmetic.feature rename to examples/java-calculator-testng/src/test/resources/io/cucumber/examples/java/calculator/basic_arithmetic.feature diff --git a/examples/java-calculator-testng/src/test/resources/cucumber/examples/java/calculator/date_calculator.feature b/examples/java-calculator-testng/src/test/resources/io/cucumber/examples/java/calculator/date_calculator.feature similarity index 100% rename from examples/java-calculator-testng/src/test/resources/cucumber/examples/java/calculator/date_calculator.feature rename to examples/java-calculator-testng/src/test/resources/io/cucumber/examples/java/calculator/date_calculator.feature diff --git a/examples/java-calculator-testng/src/test/resources/cucumber/examples/java/calculator/shopping.feature b/examples/java-calculator-testng/src/test/resources/io/cucumber/examples/java/calculator/shopping.feature similarity index 100% rename from examples/java-calculator-testng/src/test/resources/cucumber/examples/java/calculator/shopping.feature rename to examples/java-calculator-testng/src/test/resources/io/cucumber/examples/java/calculator/shopping.feature diff --git a/examples/java-calculator/pom.xml b/examples/java-calculator/pom.xml index 3174a36773..dab6006e6e 100644 --- a/examples/java-calculator/pom.xml +++ b/examples/java-calculator/pom.xml @@ -41,7 +41,7 @@ maven-surefire-plugin - cucumber.examples.java.calculator.Example + io.cucumber.examples.java.calculator.Example never diff --git a/examples/java-calculator/src/main/java/cucumber/examples/java/calculator/DateCalculator.java b/examples/java-calculator/src/main/java/io/cucumber/examples/java/calculator/DateCalculator.java similarity index 84% rename from examples/java-calculator/src/main/java/cucumber/examples/java/calculator/DateCalculator.java rename to examples/java-calculator/src/main/java/io/cucumber/examples/java/calculator/DateCalculator.java index 4ab3eb3816..fc2d67b371 100644 --- a/examples/java-calculator/src/main/java/cucumber/examples/java/calculator/DateCalculator.java +++ b/examples/java-calculator/src/main/java/io/cucumber/examples/java/calculator/DateCalculator.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import java.util.Date; diff --git a/examples/java-calculator/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java b/examples/java-calculator/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java similarity index 96% rename from examples/java-calculator/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java rename to examples/java-calculator/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java index c28c15e9cf..88ee9803b2 100644 --- a/examples/java-calculator/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java +++ b/examples/java-calculator/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import java.util.Deque; import java.util.LinkedList; diff --git a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/Example.java b/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/Example.java deleted file mode 100644 index e1fcd4ff89..0000000000 --- a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/Example.java +++ /dev/null @@ -1,4 +0,0 @@ -package cucumber.examples.java.calculator; - -public interface Example { -} diff --git a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/DateStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java similarity index 93% rename from examples/java-calculator/src/test/java/cucumber/examples/java/calculator/DateStepdefs.java rename to examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java index 9e162b934a..50b230be0a 100644 --- a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/DateStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/Example.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/Example.java new file mode 100644 index 0000000000..b5be1f3072 --- /dev/null +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/Example.java @@ -0,0 +1,4 @@ +package io.cucumber.examples.java.calculator; + +public interface Example { +} diff --git a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/ParameterTypes.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java similarity index 90% rename from examples/java-calculator/src/test/java/cucumber/examples/java/calculator/ParameterTypes.java rename to examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java index 63c5d0011c..641a16e327 100644 --- a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/ParameterTypes.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java @@ -1,10 +1,10 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.TypeRegistryConfigurer; import cucumber.api.TypeRegistry; import io.cucumber.datatable.DataTableType; -import cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; -import cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; +import io.cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; +import io.cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; import io.cucumber.cucumberexpressions.ParameterType; import java.text.SimpleDateFormat; diff --git a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java similarity index 97% rename from examples/java-calculator/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java rename to examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index c69beb7fd8..f100ce1491 100644 --- a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.Scenario; import cucumber.api.java.After; diff --git a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java similarity index 62% rename from examples/java-calculator/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java rename to examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index 5a9978aa29..ac97a316e4 100644 --- a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,14 +1,11 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; -import org.junit.Test; -import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; @RunWith(Cucumber.class) @CucumberOptions(plugin = {"progress", "json:target/cucumber-report.json"}) -@Category(Example.class) public class RunCukesTest { } diff --git a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java similarity index 96% rename from examples/java-calculator/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java rename to examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index 60e87c1a67..917e3101f9 100644 --- a/examples/java-calculator/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/examples/java-calculator/src/test/resources/cucumber/examples/java/calculator/basic_arithmetic.feature b/examples/java-calculator/src/test/resources/io/cucumber/examples/java/calculator/basic_arithmetic.feature similarity index 100% rename from examples/java-calculator/src/test/resources/cucumber/examples/java/calculator/basic_arithmetic.feature rename to examples/java-calculator/src/test/resources/io/cucumber/examples/java/calculator/basic_arithmetic.feature diff --git a/examples/java-calculator/src/test/resources/cucumber/examples/java/calculator/date_calculator.feature b/examples/java-calculator/src/test/resources/io/cucumber/examples/java/calculator/date_calculator.feature similarity index 100% rename from examples/java-calculator/src/test/resources/cucumber/examples/java/calculator/date_calculator.feature rename to examples/java-calculator/src/test/resources/io/cucumber/examples/java/calculator/date_calculator.feature diff --git a/examples/java-calculator/src/test/resources/cucumber/examples/java/calculator/shopping.feature b/examples/java-calculator/src/test/resources/io/cucumber/examples/java/calculator/shopping.feature similarity index 100% rename from examples/java-calculator/src/test/resources/cucumber/examples/java/calculator/shopping.feature rename to examples/java-calculator/src/test/resources/io/cucumber/examples/java/calculator/shopping.feature diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/Application.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/Application.java similarity index 65% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/Application.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/Application.java index bdaa2ce043..8bffccd318 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/Application.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/Application.java @@ -1,11 +1,11 @@ -package cucumber.examples.java.wicket; +package io.cucumber.examples.java.wicket; -import cucumber.examples.java.wicket.model.dao.CarDAO; -import cucumber.examples.java.wicket.model.dao.InMemoryCarDAO; -import cucumber.examples.java.wicket.model.entity.Car; -import cucumber.examples.java.wicket.view.Available; -import cucumber.examples.java.wicket.view.Create; -import cucumber.examples.java.wicket.view.Rent; +import io.cucumber.examples.java.wicket.model.dao.CarDAO; +import io.cucumber.examples.java.wicket.model.dao.InMemoryCarDAO; +import io.cucumber.examples.java.wicket.model.entity.Car; +import io.cucumber.examples.java.wicket.view.Available; +import io.cucumber.examples.java.wicket.view.Create; +import io.cucumber.examples.java.wicket.view.Rent; import org.apache.wicket.protocol.http.WebApplication; public class Application extends WebApplication { diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/dao/CarDAO.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/dao/CarDAO.java similarity index 53% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/dao/CarDAO.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/dao/CarDAO.java index ec200546f8..54429a0bb5 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/dao/CarDAO.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/dao/CarDAO.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.wicket.model.dao; +package io.cucumber.examples.java.wicket.model.dao; -import cucumber.examples.java.wicket.model.entity.Car; +import io.cucumber.examples.java.wicket.model.entity.Car; public interface CarDAO { public void add(Car car); diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java similarity index 88% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java index 500ad6218f..ab0d2e4cbf 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/dao/InMemoryCarDAO.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.wicket.model.dao; +package io.cucumber.examples.java.wicket.model.dao; -import cucumber.examples.java.wicket.model.entity.Car; +import io.cucumber.examples.java.wicket.model.entity.Car; import java.util.LinkedList; import java.util.List; diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/entity/Car.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/entity/Car.java similarity index 75% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/entity/Car.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/entity/Car.java index 243e8fd099..2940d4b99a 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/model/entity/Car.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/model/entity/Car.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.wicket.model.entity; +package io.cucumber.examples.java.wicket.model.entity; public class Car { private boolean rented; diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Available.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Available.java similarity index 81% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Available.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Available.java index 28c0265b2a..1c5c81e217 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Available.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Available.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.wicket.view; +package io.cucumber.examples.java.wicket.view; -import cucumber.examples.java.wicket.Application; +import io.cucumber.examples.java.wicket.Application; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Create.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Create.java similarity index 93% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Create.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Create.java index 4b3e644696..51a431e0e1 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Create.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Create.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.wicket.view; +package io.cucumber.examples.java.wicket.view; -import cucumber.examples.java.wicket.Application; +import io.cucumber.examples.java.wicket.Application; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponent; diff --git a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Rent.java b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Rent.java similarity index 88% rename from examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Rent.java rename to examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Rent.java index 70da7ec18c..a3e2c12270 100644 --- a/examples/java-wicket/java-wicket-main/src/main/java/cucumber/examples/java/wicket/view/Rent.java +++ b/examples/java-wicket/java-wicket-main/src/main/java/io/cucumber/examples/java/wicket/view/Rent.java @@ -1,6 +1,6 @@ -package cucumber.examples.java.wicket.view; +package io.cucumber.examples.java.wicket.view; -import cucumber.examples.java.wicket.Application; +import io.cucumber.examples.java.wicket.Application; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.model.CompoundPropertyModel; diff --git a/examples/java-wicket/java-wicket-main/src/main/resources/cucumber/examples/java/wicket/view/Available.html b/examples/java-wicket/java-wicket-main/src/main/resources/io/cucumber/examples/java/wicket/view/Available.html similarity index 100% rename from examples/java-wicket/java-wicket-main/src/main/resources/cucumber/examples/java/wicket/view/Available.html rename to examples/java-wicket/java-wicket-main/src/main/resources/io/cucumber/examples/java/wicket/view/Available.html diff --git a/examples/java-wicket/java-wicket-main/src/main/resources/cucumber/examples/java/wicket/view/Create.html b/examples/java-wicket/java-wicket-main/src/main/resources/io/cucumber/examples/java/wicket/view/Create.html similarity index 100% rename from examples/java-wicket/java-wicket-main/src/main/resources/cucumber/examples/java/wicket/view/Create.html rename to examples/java-wicket/java-wicket-main/src/main/resources/io/cucumber/examples/java/wicket/view/Create.html diff --git a/examples/java-wicket/java-wicket-main/src/main/resources/cucumber/examples/java/wicket/view/Rent.html b/examples/java-wicket/java-wicket-main/src/main/resources/io/cucumber/examples/java/wicket/view/Rent.html similarity index 100% rename from examples/java-wicket/java-wicket-main/src/main/resources/cucumber/examples/java/wicket/view/Rent.html rename to examples/java-wicket/java-wicket-main/src/main/resources/io/cucumber/examples/java/wicket/view/Rent.html diff --git a/examples/java-wicket/java-wicket-main/src/main/webapp/WEB-INF/web.xml b/examples/java-wicket/java-wicket-main/src/main/webapp/WEB-INF/web.xml index f982d5e917..81194cac23 100644 --- a/examples/java-wicket/java-wicket-main/src/main/webapp/WEB-INF/web.xml +++ b/examples/java-wicket/java-wicket-main/src/main/webapp/WEB-INF/web.xml @@ -7,7 +7,7 @@ org.apache.wicket.protocol.http.WicketFilter applicationClassName - cucumber.examples.java.wicket.Application + io.cucumber.examples.java.wicket.Application diff --git a/examples/java-wicket/java-wicket-main/src/test/java/cucumber/examples/java/wicket/RentCarTest.java b/examples/java-wicket/java-wicket-main/src/test/java/io/cucumber/examples/java/wicket/RentCarTest.java similarity index 81% rename from examples/java-wicket/java-wicket-main/src/test/java/cucumber/examples/java/wicket/RentCarTest.java rename to examples/java-wicket/java-wicket-main/src/test/java/io/cucumber/examples/java/wicket/RentCarTest.java index 369329909f..68bae27248 100644 --- a/examples/java-wicket/java-wicket-main/src/test/java/cucumber/examples/java/wicket/RentCarTest.java +++ b/examples/java-wicket/java-wicket-main/src/test/java/io/cucumber/examples/java/wicket/RentCarTest.java @@ -1,8 +1,8 @@ -package cucumber.examples.java.wicket; +package io.cucumber.examples.java.wicket; -import cucumber.examples.java.wicket.view.Available; -import cucumber.examples.java.wicket.view.Create; -import cucumber.examples.java.wicket.view.Rent; +import io.cucumber.examples.java.wicket.view.Available; +import io.cucumber.examples.java.wicket.view.Create; +import io.cucumber.examples.java.wicket.view.Rent; import org.apache.wicket.util.tester.WicketTester; import org.junit.Test; diff --git a/examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/RunCukesIT.java b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java similarity index 74% rename from examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/RunCukesIT.java rename to examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java index 79251a9699..d99ad5e2e3 100644 --- a/examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/RunCukesIT.java +++ b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.wicket; +package io.cucumber.examples.java.wicket; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/steps/RentACarSupport.java b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentACarSupport.java similarity index 96% rename from examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/steps/RentACarSupport.java rename to examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentACarSupport.java index 98bf6f4565..8eabaf7b35 100644 --- a/examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/steps/RentACarSupport.java +++ b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentACarSupport.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.wicket.steps; +package io.cucumber.examples.java.wicket.steps; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; diff --git a/examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/steps/RentStepdefs.java b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java similarity index 95% rename from examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/steps/RentStepdefs.java rename to examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java index 7d9d933118..2c7205e81f 100644 --- a/examples/java-wicket/java-wicket-test/src/test/java/cucumber/examples/java/wicket/steps/RentStepdefs.java +++ b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.wicket.steps; +package io.cucumber.examples.java.wicket.steps; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/examples/java-wicket/java-wicket-test/src/test/resources/cucumber/examples/java/wicket/Rent.feature b/examples/java-wicket/java-wicket-test/src/test/resources/io/cucumber/examples/java/wicket/Rent.feature similarity index 100% rename from examples/java-wicket/java-wicket-test/src/test/resources/cucumber/examples/java/wicket/Rent.feature rename to examples/java-wicket/java-wicket-test/src/test/resources/io/cucumber/examples/java/wicket/Rent.feature diff --git a/examples/java8-calculator/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java b/examples/java8-calculator/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java similarity index 96% rename from examples/java8-calculator/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java rename to examples/java8-calculator/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java index c28c15e9cf..88ee9803b2 100644 --- a/examples/java8-calculator/src/main/java/cucumber/examples/java/calculator/RpnCalculator.java +++ b/examples/java8-calculator/src/main/java/io/cucumber/examples/java/calculator/RpnCalculator.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import java.util.Deque; import java.util.LinkedList; diff --git a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java similarity index 97% rename from examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java rename to examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index 00f3417006..4d839968fa 100644 --- a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.Scenario; import io.cucumber.datatable.DataTable; diff --git a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java similarity index 83% rename from examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java rename to examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index be1a9a65cf..1b9e0f83de 100644 --- a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; diff --git a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java similarity index 96% rename from examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java rename to examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index c49d4c3fc9..3ee4fde537 100644 --- a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,4 +1,4 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import io.cucumber.datatable.DataTable; import cucumber.api.java8.En; diff --git a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/TypeRegistryConfiguration.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/TypeRegistryConfiguration.java similarity index 84% rename from examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/TypeRegistryConfiguration.java rename to examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/TypeRegistryConfiguration.java index 6f277ef1a3..026f77333f 100644 --- a/examples/java8-calculator/src/test/java/cucumber/examples/java/calculator/TypeRegistryConfiguration.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/TypeRegistryConfiguration.java @@ -1,10 +1,10 @@ -package cucumber.examples.java.calculator; +package io.cucumber.examples.java.calculator; import cucumber.api.TypeRegistryConfigurer; import cucumber.api.TypeRegistry; import io.cucumber.datatable.DataTableType; -import cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; -import cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; +import io.cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; +import io.cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; import java.util.Locale; import java.util.Map; diff --git a/examples/java8-calculator/src/test/resources/cucumber/examples/java/calculator/basic_arithmetic.feature b/examples/java8-calculator/src/test/resources/io/cucumber/examples/java/calculator/basic_arithmetic.feature similarity index 100% rename from examples/java8-calculator/src/test/resources/cucumber/examples/java/calculator/basic_arithmetic.feature rename to examples/java8-calculator/src/test/resources/io/cucumber/examples/java/calculator/basic_arithmetic.feature diff --git a/examples/java8-calculator/src/test/resources/cucumber/examples/java/calculator/shopping.feature b/examples/java8-calculator/src/test/resources/io/cucumber/examples/java/calculator/shopping.feature similarity index 100% rename from examples/java8-calculator/src/test/resources/cucumber/examples/java/calculator/shopping.feature rename to examples/java8-calculator/src/test/resources/io/cucumber/examples/java/calculator/shopping.feature diff --git a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/Message.java b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/Message.java similarity index 96% rename from examples/spring-txn/src/main/java/cucumber/examples/spring/txn/Message.java rename to examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/Message.java index ab252c8cc9..65d8017d5f 100644 --- a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/Message.java +++ b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/Message.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import javax.persistence.Access; import javax.persistence.AccessType; diff --git a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/MessageRepository.java b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/MessageRepository.java similarity index 77% rename from examples/spring-txn/src/main/java/cucumber/examples/spring/txn/MessageRepository.java rename to examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/MessageRepository.java index 18a8fe0b40..b73c09459a 100644 --- a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/MessageRepository.java +++ b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/MessageRepository.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import org.springframework.data.repository.CrudRepository; diff --git a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/User.java b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/User.java similarity index 96% rename from examples/spring-txn/src/main/java/cucumber/examples/spring/txn/User.java rename to examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/User.java index 44c37e8bad..95e0dbf7c1 100644 --- a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/User.java +++ b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/User.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import javax.persistence.Access; import javax.persistence.AccessType; diff --git a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/UserRepository.java b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/UserRepository.java similarity index 76% rename from examples/spring-txn/src/main/java/cucumber/examples/spring/txn/UserRepository.java rename to examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/UserRepository.java index 2a10d4084f..4251b5ed9b 100644 --- a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/UserRepository.java +++ b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/UserRepository.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import org.springframework.data.repository.CrudRepository; diff --git a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/web/UserController.java b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/web/UserController.java similarity index 81% rename from examples/spring-txn/src/main/java/cucumber/examples/spring/txn/web/UserController.java rename to examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/web/UserController.java index f81683a247..3e123da9a7 100644 --- a/examples/spring-txn/src/main/java/cucumber/examples/spring/txn/web/UserController.java +++ b/examples/spring-txn/src/main/java/io/cucumber/examples/spring/txn/web/UserController.java @@ -1,7 +1,7 @@ -package cucumber.examples.spring.txn.web; +package io.cucumber.examples.spring.txn.web; -import cucumber.examples.spring.txn.User; -import cucumber.examples.spring.txn.UserRepository; +import io.cucumber.examples.spring.txn.User; +import io.cucumber.examples.spring.txn.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; diff --git a/examples/spring-txn/src/main/webapp/WEB-INF/spring/persistenceContext.xml b/examples/spring-txn/src/main/webapp/WEB-INF/spring/persistenceContext.xml index 21d3585df4..e6d32c0fdf 100644 --- a/examples/spring-txn/src/main/webapp/WEB-INF/spring/persistenceContext.xml +++ b/examples/spring-txn/src/main/webapp/WEB-INF/spring/persistenceContext.xml @@ -28,7 +28,7 @@ class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> - + @@ -46,6 +46,6 @@ - + diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/CucumberContextConfiguration.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java similarity index 91% rename from examples/spring-txn/src/test/java/cucumber/examples/spring/txn/CucumberContextConfiguration.java rename to examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java index 4676aaa13e..7bb030872d 100644 --- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/CucumberContextConfiguration.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import cucumber.api.java.Before; import org.springframework.test.context.ContextConfiguration; diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/RunCukesTest.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java similarity index 85% rename from examples/spring-txn/src/test/java/cucumber/examples/spring/txn/RunCukesTest.java rename to examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java index 81226bd46e..b946fdbae9 100644 --- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/RunCukesTest.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/SeeMessagesStepdefs.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java similarity index 90% rename from examples/spring-txn/src/test/java/cucumber/examples/spring/txn/SeeMessagesStepdefs.java rename to examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java index 6536071920..7a255cf23a 100644 --- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/SeeMessagesStepdefs.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java @@ -1,11 +1,9 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/TypeRegistryConfiguration.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/TypeRegistryConfiguration.java similarity index 95% rename from examples/spring-txn/src/test/java/cucumber/examples/spring/txn/TypeRegistryConfiguration.java rename to examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/TypeRegistryConfiguration.java index 607b8acc08..bb7da9c6d4 100644 --- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/TypeRegistryConfiguration.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/TypeRegistryConfiguration.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import cucumber.api.TypeRegistryConfigurer; import cucumber.api.TypeRegistry; diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/UserStepdefs.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java similarity index 85% rename from examples/spring-txn/src/test/java/cucumber/examples/spring/txn/UserStepdefs.java rename to examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java index ac3b73d9b1..e0f55c29b2 100644 --- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/UserStepdefs.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java @@ -1,9 +1,7 @@ -package cucumber.examples.spring.txn; +package io.cucumber.examples.spring.txn; import cucumber.api.java.en.Given; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.transaction.support.TransactionSynchronizationManager; import static org.junit.Assert.assertTrue; diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/mock/SpringMockFactory.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/mock/SpringMockFactory.java similarity index 93% rename from examples/spring-txn/src/test/java/cucumber/examples/spring/txn/mock/SpringMockFactory.java rename to examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/mock/SpringMockFactory.java index 68645c6922..b6f8607a16 100644 --- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/mock/SpringMockFactory.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/mock/SpringMockFactory.java @@ -1,4 +1,4 @@ -package cucumber.examples.spring.txn.mock; +package io.cucumber.examples.spring.txn.mock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/examples/spring-txn/src/test/resources/cucumber/examples/spring/txn/search.feature b/examples/spring-txn/src/test/resources/io/cucumber/examples/spring/txn/search.feature similarity index 100% rename from examples/spring-txn/src/test/resources/cucumber/examples/spring/txn/search.feature rename to examples/spring-txn/src/test/resources/io/cucumber/examples/spring/txn/search.feature diff --git a/examples/spring-txn/src/test/resources/cucumber/examples/spring/txn/see_messages.feature b/examples/spring-txn/src/test/resources/io/cucumber/examples/spring/txn/see_messages.feature similarity index 100% rename from examples/spring-txn/src/test/resources/cucumber/examples/spring/txn/see_messages.feature rename to examples/spring-txn/src/test/resources/io/cucumber/examples/spring/txn/see_messages.feature diff --git a/examples/spring-txn/src/test/resources/mockContext.xml b/examples/spring-txn/src/test/resources/mockContext.xml index 69f38704dd..94949ac606 100644 --- a/examples/spring-txn/src/test/resources/mockContext.xml +++ b/examples/spring-txn/src/test/resources/mockContext.xml @@ -5,6 +5,6 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> - + From b616993b46641b59d269636bf7622fd5d07fe316 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 21:22:23 +0200 Subject: [PATCH 014/155] [Core] Make packages final and package private where possible --- .../java/cucumber/api/PendingException.java | 2 +- .../main/java/cucumber/api/SnippetType.java | 95 ++++++++++++++++--- core/src/main/java/cucumber/api/cli/Main.java | 2 +- .../cucumber/api/formatter/AnsiEscapes.java | 2 +- .../api/formatter/NiceAppendable.java | 2 +- .../io/cucumber/core/backend/Backend.java | 4 +- .../DuplicateStepDefinitionException.java | 2 +- .../java/io/cucumber/core/filter/Filters.java | 4 +- .../cucumber/core/filter/LinePredicate.java | 2 +- .../cucumber/core/filter/NamePredicate.java | 2 +- .../io/cucumber/core/filter/RerunFilters.java | 2 +- .../core/filter/TagExpressionOld.java | 2 +- .../io/cucumber/core/filter/TagPredicate.java | 2 +- .../core/io/ClasspathResourceIterable.java | 4 +- .../core/io/ClasspathResourceLoader.java | 4 +- .../io/DelegatingResourceIteratorFactory.java | 4 +- .../io/cucumber/core/io/FileResource.java | 6 +- .../core/io/FileResourceIterable.java | 4 +- .../core/io/FileResourceIterator.java | 6 +- .../core/io/FileResourceIteratorFactory.java | 2 +- .../cucumber/core/io/FileResourceLoader.java | 2 +- .../cucumber/core/io/FlatteningIterator.java | 2 +- .../java/io/cucumber/core/io/Helpers.java | 2 +- .../java/io/cucumber/core/io/MultiLoader.java | 2 +- .../core/io/ResourceIteratorFactory.java | 2 +- .../core/io/ResourceLoaderClassFinder.java | 5 +- .../core/io/UTF8OutputStreamWriter.java | 12 --- .../java/io/cucumber/core/io/ZipResource.java | 4 +- .../cucumber/core/io/ZipResourceIterator.java | 4 +- .../core/io/ZipResourceIteratorFactory.java | 2 +- .../ZipThenFileResourceIteratorFactory.java | 2 +- .../cucumber/core/model/CucumberFeature.java | 8 +- .../java/io/cucumber/core/model/Encoding.java | 2 +- .../cucumber/core/model/FeatureBuilder.java | 13 ++- .../io/cucumber/core/model/PathWithLines.java | 11 +-- .../java/io/cucumber/core/options/Env.java | 2 +- .../cucumber/core/options/RuntimeOptions.java | 6 +- .../core/options/RuntimeOptionsFactory.java | 2 +- .../{Shellwords.java => ShellWords.java} | 6 +- .../core/plugin/DefaultSummaryPrinter.java | 2 +- .../cucumber/core/plugin/HTMLFormatter.java | 1 - .../cucumber/core/plugin/JUnitFormatter.java | 2 - .../core/plugin/NullSummaryPrinter.java | 2 +- .../cucumber/core/plugin/PluginFactory.java | 2 - .../java/io/cucumber/core/plugin/Plugins.java | 4 +- .../java/io/cucumber/core/plugin/Stats.java | 4 +- .../cucumber/core/plugin/TestNGFormatter.java | 4 +- .../core/plugin/TimelineFormatter.java | 3 +- .../core/{io => plugin}/URLOutputStream.java | 9 +- .../core/plugin/UTF8OutputStreamWriter.java | 11 +++ .../core/plugin/UndefinedStepsTracker.java | 2 +- .../core/reflection/MethodFormat.java | 2 +- .../core/reflection/NoInstancesException.java | 2 +- .../cucumber/core/reflection/Reflections.java | 13 +-- .../reflection/TooManyInstancesException.java | 4 +- .../core/runner/AbstractEventPublisher.java | 2 +- .../runner/CanonicalOrderEventPublisher.java | 2 +- .../core/runner/DefinitionArgument.java | 4 +- .../cucumber/core/runner/HookComparator.java | 2 +- .../java/io/cucumber/core/runner/Match.java | 9 +- .../runner/PickleStepDefinitionMatch.java | 2 +- .../core/runner/PickleStepTestStep.java | 2 +- .../core/runner/SingletonRunnerSupplier.java | 4 +- .../runner/ThreadLocalRunnerSupplier.java | 2 +- .../UndefinedPickleStepDefinitionMatch.java | 2 +- .../core/runner/UndefinedStepException.java | 9 -- .../runtime/BackendModuleBackendSupplier.java | 14 +++ .../DefaultTypeRegistryConfiguration.java | 20 ---- .../runtime/FeaturePathFeatureSupplier.java | 2 +- .../io/cucumber/core/runtime/Invoker.java | 8 +- .../io/cucumber/core/runtime/Runtime.java | 21 ++-- .../core/snippets/ArgumentPattern.java | 2 +- .../core/snippets/CamelCaseConcatenator.java | 22 ----- .../cucumber/core/snippets/Concatenator.java | 5 - .../core/snippets/FunctionNameGenerator.java | 35 ------- .../core/snippets/SnippetGenerator.java | 7 +- .../core/snippets/UnderscoreConcatenator.java | 19 ---- .../stepexpression/PickleTableConverter.java | 7 +- .../io/cucumber/core/backend/StubBackend.java | 4 +- .../core/io/TestClasspathResourceLoader.java | 10 ++ .../options/RuntimeOptionsFactoryTest.java | 8 +- .../core/options/RuntimeOptionsTest.java | 24 ++--- ...hellwordsTest.java => ShellWordsTest.java} | 10 +- .../core/plugin/JSONFormatterTest.java | 13 +-- .../core/plugin/PluginFactoryTest.java | 1 - .../core/plugin/PrettyFormatterTest.java | 8 +- .../plugin/TestUTF8OutputStreamWriter.java | 12 +++ .../{io => plugin}/URLOutputStreamTest.java | 25 ++--- .../io/cucumber/core/runner/RunnerTest.java | 4 +- .../core/runner/TestBackendSupplier.java | 4 +- .../core/runner/TestDefinitionArgument.java | 12 +++ .../io/cucumber/core/runner/TestHelper.java | 5 +- .../core/runner/TestRunnerSupplier.java | 4 +- .../io/cucumber/core/runtime/RuntimeTest.java | 4 +- .../snippets/FunctionNameGeneratorTest.java | 5 +- 95 files changed, 329 insertions(+), 335 deletions(-) delete mode 100644 core/src/main/java/io/cucumber/core/io/UTF8OutputStreamWriter.java rename core/src/main/java/io/cucumber/core/options/{Shellwords.java => ShellWords.java} (86%) rename core/src/main/java/io/cucumber/core/{io => plugin}/URLOutputStream.java (94%) create mode 100644 core/src/main/java/io/cucumber/core/plugin/UTF8OutputStreamWriter.java delete mode 100644 core/src/main/java/io/cucumber/core/runner/UndefinedStepException.java delete mode 100644 core/src/main/java/io/cucumber/core/runtime/DefaultTypeRegistryConfiguration.java delete mode 100644 core/src/main/java/io/cucumber/core/snippets/CamelCaseConcatenator.java delete mode 100644 core/src/main/java/io/cucumber/core/snippets/Concatenator.java delete mode 100644 core/src/main/java/io/cucumber/core/snippets/FunctionNameGenerator.java delete mode 100644 core/src/main/java/io/cucumber/core/snippets/UnderscoreConcatenator.java create mode 100644 core/src/test/java/io/cucumber/core/io/TestClasspathResourceLoader.java rename core/src/test/java/io/cucumber/core/options/{ShellwordsTest.java => ShellWordsTest.java} (70%) create mode 100644 core/src/test/java/io/cucumber/core/plugin/TestUTF8OutputStreamWriter.java rename core/src/test/java/io/cucumber/core/{io => plugin}/URLOutputStreamTest.java (91%) create mode 100644 core/src/test/java/io/cucumber/core/runner/TestDefinitionArgument.java diff --git a/core/src/main/java/cucumber/api/PendingException.java b/core/src/main/java/cucumber/api/PendingException.java index be30dd1c65..e91973c3aa 100644 --- a/core/src/main/java/cucumber/api/PendingException.java +++ b/core/src/main/java/cucumber/api/PendingException.java @@ -2,7 +2,7 @@ // We're deliberately not extending CucumberException (which is used to signal fatal errors) @Pending -public class PendingException extends RuntimeException { +public final class PendingException extends RuntimeException { public PendingException() { this("TODO: implement me"); } diff --git a/core/src/main/java/cucumber/api/SnippetType.java b/core/src/main/java/cucumber/api/SnippetType.java index a7bc666c6c..9b5f86ff4a 100644 --- a/core/src/main/java/cucumber/api/SnippetType.java +++ b/core/src/main/java/cucumber/api/SnippetType.java @@ -1,20 +1,15 @@ package cucumber.api; -import io.cucumber.core.snippets.CamelCaseConcatenator; -import io.cucumber.core.snippets.Concatenator; -import io.cucumber.core.snippets.FunctionNameGenerator; -import io.cucumber.core.snippets.UnderscoreConcatenator; - public enum SnippetType { - UNDERSCORE("underscore", new UnderscoreConcatenator()), - CAMELCASE("camelcase", new CamelCaseConcatenator()); + UNDERSCORE("underscore", new UnderscoreJoiner()), + CAMELCASE("camelcase", new CamelCaseJoiner()); private final String name; - private final Concatenator concatenator; + private final Joiner joiner; - SnippetType(String name, Concatenator concatenator) { + SnippetType(String name, Joiner joiner) { this.name = name; - this.concatenator = concatenator; + this.joiner = joiner; } public static SnippetType fromString(String name) { @@ -27,6 +22,84 @@ public static SnippetType fromString(String name) { } public FunctionNameGenerator getFunctionNameGenerator() { - return new FunctionNameGenerator(concatenator); + return new FunctionNameGenerator(joiner); + } + + private static final class CamelCaseJoiner implements Joiner { + + @Override + public String concatenate(String[] words) { + StringBuilder functionName = new StringBuilder(); + boolean firstWord = true; + for (String word : words) { + if (firstWord) { + functionName.append(word.toLowerCase()); + firstWord = false; + } else { + functionName.append(capitalize(word)); + } + } + return functionName.toString(); + } + + private String capitalize(String line) { + return Character.toUpperCase(line.charAt(0)) + line.substring(1); + } + } + + private static class UnderscoreJoiner implements Joiner { + @Override + public String concatenate(String[] words) { + StringBuilder functionName = new StringBuilder(); + boolean firstWord = true; + for (String word : words) { + if (firstWord) { + word = word.toLowerCase(); + } else { + functionName.append('_'); + } + functionName.append(word); + firstWord = false; + } + return functionName.toString(); + } + } + + private interface Joiner { + String concatenate(String[] words); + } + + public static final class FunctionNameGenerator { + private static final Character SUBST = ' '; + private final Joiner joiner; + + private FunctionNameGenerator(Joiner joiner) { + this.joiner = joiner; + } + + public String generateFunctionName(String sentence) { + + sentence = removeIllegalCharacters(sentence); + sentence = sentence.trim(); + String[] words = sentence.split("\\s"); + + return joiner.concatenate(words); + } + + private String removeIllegalCharacters(String sentence) { + if (sentence.isEmpty()) { + throw new IllegalArgumentException("Cannot create function name from empty sentence"); + } + StringBuilder sanitized = new StringBuilder(); + sanitized.append(Character.isJavaIdentifierStart(sentence.charAt(0)) ? sentence.charAt(0) : SUBST); + for (int i = 1; i < sentence.length(); i++) { + if (Character.isJavaIdentifierPart(sentence.charAt(i))) { + sanitized.append(sentence.charAt(i)); + } else if (sanitized.charAt(sanitized.length() - 1) != SUBST && i != sentence.length() - 1) { + sanitized.append(SUBST); + } + } + return sanitized.toString(); + } } } diff --git a/core/src/main/java/cucumber/api/cli/Main.java b/core/src/main/java/cucumber/api/cli/Main.java index f4007d2550..5207eb26dc 100644 --- a/core/src/main/java/cucumber/api/cli/Main.java +++ b/core/src/main/java/cucumber/api/cli/Main.java @@ -2,7 +2,7 @@ import io.cucumber.core.runtime.Runtime; -public class Main { +public final class Main { public static void main(String[] argv) { byte exitStatus = run(argv, Thread.currentThread().getContextClassLoader()); diff --git a/core/src/main/java/cucumber/api/formatter/AnsiEscapes.java b/core/src/main/java/cucumber/api/formatter/AnsiEscapes.java index 389488a4e3..70362f5528 100644 --- a/core/src/main/java/cucumber/api/formatter/AnsiEscapes.java +++ b/core/src/main/java/cucumber/api/formatter/AnsiEscapes.java @@ -1,6 +1,6 @@ package cucumber.api.formatter; -public class AnsiEscapes { +public final class AnsiEscapes { private static final char ESC = 27; private static final char BRACKET = '['; diff --git a/core/src/main/java/cucumber/api/formatter/NiceAppendable.java b/core/src/main/java/cucumber/api/formatter/NiceAppendable.java index cf31ea5e13..418885148a 100644 --- a/core/src/main/java/cucumber/api/formatter/NiceAppendable.java +++ b/core/src/main/java/cucumber/api/formatter/NiceAppendable.java @@ -7,7 +7,7 @@ /** * A nice appendable that doesn't throw checked exceptions */ -public class NiceAppendable { +public final class NiceAppendable { private static final CharSequence NL = "\n"; private final Appendable out; diff --git a/core/src/main/java/io/cucumber/core/backend/Backend.java b/core/src/main/java/io/cucumber/core/backend/Backend.java index 86c7db052b..61438d0fc1 100644 --- a/core/src/main/java/io/cucumber/core/backend/Backend.java +++ b/core/src/main/java/io/cucumber/core/backend/Backend.java @@ -1,6 +1,6 @@ package io.cucumber.core.backend; -import io.cucumber.core.snippets.FunctionNameGenerator; +import cucumber.api.SnippetType; import gherkin.pickles.PickleStep; import java.util.List; @@ -22,5 +22,5 @@ public interface Backend { */ void disposeWorld(); - List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator); + List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator); } diff --git a/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java b/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java index 277cb676dc..c2346b1f7f 100644 --- a/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java +++ b/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java @@ -2,7 +2,7 @@ import io.cucumber.core.exception.CucumberException; -public class DuplicateStepDefinitionException extends CucumberException { +public final class DuplicateStepDefinitionException extends CucumberException { public DuplicateStepDefinitionException(StepDefinition a, StepDefinition b) { super(createMessage(a, b)); } diff --git a/core/src/main/java/io/cucumber/core/filter/Filters.java b/core/src/main/java/io/cucumber/core/filter/Filters.java index 4f05215c01..68b412acb6 100644 --- a/core/src/main/java/io/cucumber/core/filter/Filters.java +++ b/core/src/main/java/io/cucumber/core/filter/Filters.java @@ -8,7 +8,7 @@ import java.util.Map; import java.util.regex.Pattern; -public class Filters { +public final class Filters { private final List filters; private final RuntimeOptions runtimeOptions; @@ -18,7 +18,7 @@ public Filters(RuntimeOptions runtimeOptions, RerunFilters rerunFilters) { this.runtimeOptions = runtimeOptions; this.rerunFilters = rerunFilters; - filters = new ArrayList(); + filters = new ArrayList<>(); List tagFilters = this.runtimeOptions.getTagFilters(); if (!tagFilters.isEmpty()) { this.filters.add(new TagPredicate(tagFilters)); diff --git a/core/src/main/java/io/cucumber/core/filter/LinePredicate.java b/core/src/main/java/io/cucumber/core/filter/LinePredicate.java index 026b5386be..aea92371ff 100644 --- a/core/src/main/java/io/cucumber/core/filter/LinePredicate.java +++ b/core/src/main/java/io/cucumber/core/filter/LinePredicate.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; -class LinePredicate implements PicklePredicate { +final class LinePredicate implements PicklePredicate { private Map> lineFilters; LinePredicate(Map> lineFilters) { diff --git a/core/src/main/java/io/cucumber/core/filter/NamePredicate.java b/core/src/main/java/io/cucumber/core/filter/NamePredicate.java index 317482b1bd..37c1aff1ac 100644 --- a/core/src/main/java/io/cucumber/core/filter/NamePredicate.java +++ b/core/src/main/java/io/cucumber/core/filter/NamePredicate.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.regex.Pattern; -class NamePredicate implements PicklePredicate { +final class NamePredicate implements PicklePredicate { private List patterns; NamePredicate(List patterns) { diff --git a/core/src/main/java/io/cucumber/core/filter/RerunFilters.java b/core/src/main/java/io/cucumber/core/filter/RerunFilters.java index 2a6098a7a4..c0867cb9f0 100644 --- a/core/src/main/java/io/cucumber/core/filter/RerunFilters.java +++ b/core/src/main/java/io/cucumber/core/filter/RerunFilters.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; -public class RerunFilters { +public final class RerunFilters { private final RuntimeOptions runtimeOptions; private final FeatureLoader featureLoader; diff --git a/core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java b/core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java index da0b486e36..2372c15bc2 100644 --- a/core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java +++ b/core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; -class TagExpressionOld { +final class TagExpressionOld { private final Map limits = new HashMap(); private And and = new And(); diff --git a/core/src/main/java/io/cucumber/core/filter/TagPredicate.java b/core/src/main/java/io/cucumber/core/filter/TagPredicate.java index b3a36b310e..3e00268fc3 100644 --- a/core/src/main/java/io/cucumber/core/filter/TagPredicate.java +++ b/core/src/main/java/io/cucumber/core/filter/TagPredicate.java @@ -12,7 +12,7 @@ import static java.util.Arrays.asList; -public class TagPredicate implements PicklePredicate { +public final class TagPredicate implements PicklePredicate { private final List expressions = new ArrayList(); private final List oldStyleExpressions = new ArrayList(); diff --git a/core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java b/core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java index 176a958303..08f9f6575d 100644 --- a/core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java +++ b/core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java @@ -7,7 +7,7 @@ import java.util.Enumeration; import java.util.Iterator; -public class ClasspathResourceIterable implements Iterable { +final class ClasspathResourceIterable implements Iterable { private final ResourceIteratorFactory resourceIteratorFactory = new DelegatingResourceIteratorFactory(new ZipThenFileResourceIteratorFactory()); @@ -15,7 +15,7 @@ public class ClasspathResourceIterable implements Iterable { private final String path; private final String suffix; - public ClasspathResourceIterable(ClassLoader classLoader, String path, String suffix) { + ClasspathResourceIterable(ClassLoader classLoader, String path, String suffix) { this.classLoader = classLoader; this.path = path; this.suffix = suffix; diff --git a/core/src/main/java/io/cucumber/core/io/ClasspathResourceLoader.java b/core/src/main/java/io/cucumber/core/io/ClasspathResourceLoader.java index e4d9fd9cd6..0336768082 100644 --- a/core/src/main/java/io/cucumber/core/io/ClasspathResourceLoader.java +++ b/core/src/main/java/io/cucumber/core/io/ClasspathResourceLoader.java @@ -1,9 +1,9 @@ package io.cucumber.core.io; -public class ClasspathResourceLoader implements ResourceLoader { +final class ClasspathResourceLoader implements ResourceLoader { private final ClassLoader classLoader; - public ClasspathResourceLoader(ClassLoader classLoader) { + ClasspathResourceLoader(ClassLoader classLoader) { this.classLoader = classLoader; } diff --git a/core/src/main/java/io/cucumber/core/io/DelegatingResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/DelegatingResourceIteratorFactory.java index d7e2863732..87046eb698 100644 --- a/core/src/main/java/io/cucumber/core/io/DelegatingResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/DelegatingResourceIteratorFactory.java @@ -11,7 +11,7 @@ * A {@link ResourceIteratorFactory} implementation which delegates to * factories found by the ServiceLoader class. */ -public class DelegatingResourceIteratorFactory implements ResourceIteratorFactory { +final class DelegatingResourceIteratorFactory implements ResourceIteratorFactory { private final Iterable delegates = ServiceLoader.load(ResourceIteratorFactory.class); @@ -24,7 +24,7 @@ public class DelegatingResourceIteratorFactory implements ResourceIteratorFactor * @param fallbackResourceIteratorFactory The factory to use when an * appropriate one couldn't be found otherwise. */ - public DelegatingResourceIteratorFactory(ResourceIteratorFactory fallbackResourceIteratorFactory) { + DelegatingResourceIteratorFactory(ResourceIteratorFactory fallbackResourceIteratorFactory) { this.fallbackResourceIteratorFactory = fallbackResourceIteratorFactory; } diff --git a/core/src/main/java/io/cucumber/core/io/FileResource.java b/core/src/main/java/io/cucumber/core/io/FileResource.java index 342b3a1d21..bc5b75578a 100644 --- a/core/src/main/java/io/cucumber/core/io/FileResource.java +++ b/core/src/main/java/io/cucumber/core/io/FileResource.java @@ -5,16 +5,16 @@ import java.io.IOException; import java.io.InputStream; -public class FileResource implements Resource { +final class FileResource implements Resource { private final File root; private final File file; private final boolean classpathFileResource; - public static FileResource createFileResource(File root, File file) { + static FileResource createFileResource(File root, File file) { return new FileResource(root, file, false); } - public static FileResource createClasspathFileResource(File root, File file) { + static FileResource createClasspathFileResource(File root, File file) { return new FileResource(root, file, true); } diff --git a/core/src/main/java/io/cucumber/core/io/FileResourceIterable.java b/core/src/main/java/io/cucumber/core/io/FileResourceIterable.java index 288514495f..e14a5c0140 100644 --- a/core/src/main/java/io/cucumber/core/io/FileResourceIterable.java +++ b/core/src/main/java/io/cucumber/core/io/FileResourceIterable.java @@ -3,12 +3,12 @@ import java.io.File; import java.util.Iterator; -public class FileResourceIterable implements Iterable { +final class FileResourceIterable implements Iterable { private final File root; private final File file; private final String suffix; - public FileResourceIterable(File root, File file, String suffix) { + FileResourceIterable(File root, File file, String suffix) { this.root = root; this.file = file; this.suffix = suffix; diff --git a/core/src/main/java/io/cucumber/core/io/FileResourceIterator.java b/core/src/main/java/io/cucumber/core/io/FileResourceIterator.java index f1c86ce1a7..79e98640b4 100644 --- a/core/src/main/java/io/cucumber/core/io/FileResourceIterator.java +++ b/core/src/main/java/io/cucumber/core/io/FileResourceIterator.java @@ -7,14 +7,14 @@ import static io.cucumber.core.io.Helpers.hasSuffix; import static java.util.Arrays.asList; -public class FileResourceIterator implements Iterator { +final class FileResourceIterator implements Iterator { private final FlatteningIterator flatteningIterator = new FlatteningIterator(); - public static FileResourceIterator createFileResourceIterator(File root, File file, final String suffix) { + static FileResourceIterator createFileResourceIterator(File root, File file, final String suffix) { return new FileResourceIterator(root, file, suffix, false); } - public static FileResourceIterator createClasspathFileResourceIterator(File root, File file, final String suffix) { + static FileResourceIterator createClasspathFileResourceIterator(File root, File file, final String suffix) { return new FileResourceIterator(root, file, suffix, true); } diff --git a/core/src/main/java/io/cucumber/core/io/FileResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/FileResourceIteratorFactory.java index 166a3d20cd..17835c72b3 100644 --- a/core/src/main/java/io/cucumber/core/io/FileResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/FileResourceIteratorFactory.java @@ -16,7 +16,7 @@ * service implementation for {@link ResourceIteratorFactory} as it could * easily hide other service implementations.

*/ -public class FileResourceIteratorFactory implements ResourceIteratorFactory { +final class FileResourceIteratorFactory implements ResourceIteratorFactory { @Override public boolean isFactoryFor(URL url) { diff --git a/core/src/main/java/io/cucumber/core/io/FileResourceLoader.java b/core/src/main/java/io/cucumber/core/io/FileResourceLoader.java index 9afb1e5ec9..9c27e38469 100644 --- a/core/src/main/java/io/cucumber/core/io/FileResourceLoader.java +++ b/core/src/main/java/io/cucumber/core/io/FileResourceLoader.java @@ -2,7 +2,7 @@ import java.io.File; -public class FileResourceLoader implements ResourceLoader { +final class FileResourceLoader implements ResourceLoader { @Override public Iterable resources(String path, String suffix) { File root = new File(path); diff --git a/core/src/main/java/io/cucumber/core/io/FlatteningIterator.java b/core/src/main/java/io/cucumber/core/io/FlatteningIterator.java index 27090e0e3e..4191f704e1 100644 --- a/core/src/main/java/io/cucumber/core/io/FlatteningIterator.java +++ b/core/src/main/java/io/cucumber/core/io/FlatteningIterator.java @@ -5,7 +5,7 @@ import java.util.Iterator; import java.util.NoSuchElementException; -public class FlatteningIterator implements Iterator { +final class FlatteningIterator implements Iterator { private final Deque> iterators = new ArrayDeque>(); private T next; diff --git a/core/src/main/java/io/cucumber/core/io/Helpers.java b/core/src/main/java/io/cucumber/core/io/Helpers.java index 2be85cd0d7..3ae2f00ac6 100644 --- a/core/src/main/java/io/cucumber/core/io/Helpers.java +++ b/core/src/main/java/io/cucumber/core/io/Helpers.java @@ -6,7 +6,7 @@ import java.net.URISyntaxException; import java.net.URL; -public class Helpers { +final class Helpers { private Helpers() { } diff --git a/core/src/main/java/io/cucumber/core/io/MultiLoader.java b/core/src/main/java/io/cucumber/core/io/MultiLoader.java index 1ab38f3eb0..538362d627 100644 --- a/core/src/main/java/io/cucumber/core/io/MultiLoader.java +++ b/core/src/main/java/io/cucumber/core/io/MultiLoader.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -public class MultiLoader implements ResourceLoader { +public final class MultiLoader implements ResourceLoader { public static final String CLASSPATH_SCHEME = "classpath:"; private final ClasspathResourceLoader classpath; diff --git a/core/src/main/java/io/cucumber/core/io/ResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/ResourceIteratorFactory.java index 3f42f322fe..6680459868 100644 --- a/core/src/main/java/io/cucumber/core/io/ResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/ResourceIteratorFactory.java @@ -6,7 +6,7 @@ /** * Factory contract for creating resource iterators. */ -public interface ResourceIteratorFactory { +interface ResourceIteratorFactory { /** * Gets a value indicating whether the factory can create iterators for the diff --git a/core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java b/core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java index b8d832502b..ce3db56e72 100644 --- a/core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java +++ b/core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java @@ -4,7 +4,7 @@ import java.util.Collection; import java.util.HashSet; -public class ResourceLoaderClassFinder implements ClassFinder { +public final class ResourceLoaderClassFinder implements ClassFinder { private final ResourceLoader resourceLoader; private final ClassLoader classLoader; @@ -25,8 +25,7 @@ public Collection> getDescendants(Class parentType, St if (clazz != null && !parentType.equals(clazz) && parentType.isAssignableFrom(clazz)) { result.add(clazz.asSubclass(parentType)); } - } catch (ClassNotFoundException ignore) { - } catch (NoClassDefFoundError ignore) { + } catch (ClassNotFoundException | NoClassDefFoundError ignore) { } } return result; diff --git a/core/src/main/java/io/cucumber/core/io/UTF8OutputStreamWriter.java b/core/src/main/java/io/cucumber/core/io/UTF8OutputStreamWriter.java deleted file mode 100644 index 04c1d66434..0000000000 --- a/core/src/main/java/io/cucumber/core/io/UTF8OutputStreamWriter.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.cucumber.core.io; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.nio.charset.Charset; - -public class UTF8OutputStreamWriter extends OutputStreamWriter { - public UTF8OutputStreamWriter(OutputStream out) throws IOException { - super(out, Charset.forName("UTF-8")); - } -} diff --git a/core/src/main/java/io/cucumber/core/io/ZipResource.java b/core/src/main/java/io/cucumber/core/io/ZipResource.java index fac4ed8abc..9c23ae00b9 100644 --- a/core/src/main/java/io/cucumber/core/io/ZipResource.java +++ b/core/src/main/java/io/cucumber/core/io/ZipResource.java @@ -5,11 +5,11 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -public class ZipResource implements Resource { +final class ZipResource implements Resource { private final ZipFile jarFile; private final ZipEntry jarEntry; - public ZipResource(ZipFile jarFile, ZipEntry jarEntry) { + ZipResource(ZipFile jarFile, ZipEntry jarEntry) { this.jarFile = jarFile; this.jarEntry = jarEntry; } diff --git a/core/src/main/java/io/cucumber/core/io/ZipResourceIterator.java b/core/src/main/java/io/cucumber/core/io/ZipResourceIterator.java index 15e960f65b..deccfe76e4 100644 --- a/core/src/main/java/io/cucumber/core/io/ZipResourceIterator.java +++ b/core/src/main/java/io/cucumber/core/io/ZipResourceIterator.java @@ -7,14 +7,14 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -public class ZipResourceIterator implements Iterator { +final class ZipResourceIterator implements Iterator { private final String path; private final String suffix; private final ZipFile jarFile; private final Enumeration entries; private Resource next; - public ZipResourceIterator(String zipPath, String path, String suffix) throws IOException { + ZipResourceIterator(String zipPath, String path, String suffix) throws IOException { this.path = path; this.suffix = suffix; jarFile = new ZipFile(zipPath); diff --git a/core/src/main/java/io/cucumber/core/io/ZipResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/ZipResourceIteratorFactory.java index 8d53c8c1e2..89acbebfa6 100644 --- a/core/src/main/java/io/cucumber/core/io/ZipResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/ZipResourceIteratorFactory.java @@ -10,7 +10,7 @@ * Factory which creates {@link ZipResourceIterator}s for URL's with "jar", "zip" and "wsjar" * protocols. */ -public class ZipResourceIteratorFactory implements ResourceIteratorFactory { +final class ZipResourceIteratorFactory implements ResourceIteratorFactory { @Override public boolean isFactoryFor(URL url) { diff --git a/core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java index 5f31114715..af3c7a0310 100644 --- a/core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java @@ -6,7 +6,7 @@ /** * Resource iterator factory implementation which delegates to zip then file. */ -public class ZipThenFileResourceIteratorFactory implements ResourceIteratorFactory { +final class ZipThenFileResourceIteratorFactory implements ResourceIteratorFactory { private final ResourceIteratorFactory zipResourceIteratorFactory = new ZipResourceIteratorFactory(); private final ResourceIteratorFactory fileResourceIteratorFactory = new FileResourceIteratorFactory(); diff --git a/core/src/main/java/io/cucumber/core/model/CucumberFeature.java b/core/src/main/java/io/cucumber/core/model/CucumberFeature.java index 8ff34a721e..3939b09978 100644 --- a/core/src/main/java/io/cucumber/core/model/CucumberFeature.java +++ b/core/src/main/java/io/cucumber/core/model/CucumberFeature.java @@ -5,12 +5,10 @@ import java.io.Serializable; import java.util.Comparator; -public class CucumberFeature implements Serializable { - private static final long serialVersionUID = 1L; +public final class CucumberFeature{ private final String uri; - private GherkinDocument gherkinDocument; - private String gherkinSource; - + private final GherkinDocument gherkinDocument; + private final String gherkinSource; public CucumberFeature(GherkinDocument gherkinDocument, String uri, String gherkinSource) { this.gherkinDocument = gherkinDocument; diff --git a/core/src/main/java/io/cucumber/core/model/Encoding.java b/core/src/main/java/io/cucumber/core/model/Encoding.java index 2c21180ea0..0016f4fcdd 100644 --- a/core/src/main/java/io/cucumber/core/model/Encoding.java +++ b/core/src/main/java/io/cucumber/core/model/Encoding.java @@ -11,7 +11,7 @@ /** * Utilities for reading the encoding of a file. */ -class Encoding { +final class Encoding { private static final Pattern COMMENT_OR_EMPTY_LINE_PATTERN = Pattern.compile("^\\s*#|^\\s*$"); private static final Pattern ENCODING_PATTERN = Pattern.compile("^\\s*#\\s*encoding\\s*:\\s*([0-9a-zA-Z\\-]+)", Pattern.CASE_INSENSITIVE); private static final String DEFAULT_ENCODING = "UTF-8"; diff --git a/core/src/main/java/io/cucumber/core/model/FeatureBuilder.java b/core/src/main/java/io/cucumber/core/model/FeatureBuilder.java index 77ba998f4e..0cad9e6100 100644 --- a/core/src/main/java/io/cucumber/core/model/FeatureBuilder.java +++ b/core/src/main/java/io/cucumber/core/model/FeatureBuilder.java @@ -18,14 +18,14 @@ import java.util.List; import java.util.Map; -public class FeatureBuilder { +final class FeatureBuilder { private static final Charset UTF8 = Charset.forName("UTF-8"); private final List cucumberFeatures; private final char fileSeparatorChar; private final MessageDigest md5; private final Map pathsByChecksum = new HashMap(); - public FeatureBuilder(List cucumberFeatures) { + FeatureBuilder(List cucumberFeatures) { this(cucumberFeatures, File.separatorChar); } @@ -39,7 +39,7 @@ public FeatureBuilder(List cucumberFeatures) { } } - public void parse(Resource resource) { + void parse(Resource resource) { String gherkin = read(resource); String checksum = checksum(gherkin); @@ -58,7 +58,7 @@ public void parse(Resource resource) { } catch (ParserException e) { throw new CucumberException(e); } - } + } private String convertFileSeparatorToForwardSlash(String path) { return path.replace(fileSeparatorChar, '/'); @@ -68,10 +68,9 @@ private String checksum(String gherkin) { return new BigInteger(1, md5.digest(gherkin.getBytes(UTF8))).toString(16); } - public String read(Resource resource) { + private String read(Resource resource) { try { - String source = Encoding.readFile(resource); - return source; + return Encoding.readFile(resource); } catch (IOException e) { throw new CucumberException("Failed to read resource:" + resource.getPath(), e); } diff --git a/core/src/main/java/io/cucumber/core/model/PathWithLines.java b/core/src/main/java/io/cucumber/core/model/PathWithLines.java index 1e791ba090..060a04dd4a 100644 --- a/core/src/main/java/io/cucumber/core/model/PathWithLines.java +++ b/core/src/main/java/io/cucumber/core/model/PathWithLines.java @@ -5,7 +5,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class PathWithLines { +public final class PathWithLines { private static final Pattern FILE_COLON_LINE_PATTERN = Pattern.compile("^([\\w\\W]*?):([\\d:]+)$"); public final String path; @@ -15,15 +15,6 @@ public static boolean hasLineFilters(String pathName) { return FILE_COLON_LINE_PATTERN.matcher(pathName).matches(); } - public static String stripLineFilters(String pathName) { - Matcher matcher = FILE_COLON_LINE_PATTERN.matcher(pathName); - if (matcher.matches()) { - return matcher.group(1); - } else { - return pathName; - } - } - public PathWithLines(String pathName) { Matcher matcher = FILE_COLON_LINE_PATTERN.matcher(pathName); if (matcher.matches()) { diff --git a/core/src/main/java/io/cucumber/core/options/Env.java b/core/src/main/java/io/cucumber/core/options/Env.java index 6e28ef9d8b..9b2222645e 100644 --- a/core/src/main/java/io/cucumber/core/options/Env.java +++ b/core/src/main/java/io/cucumber/core/options/Env.java @@ -14,7 +14,7 @@ *
  • Resource bundle
  • * */ -public class Env { +public final class Env { public static final Env INSTANCE = new Env("cucumber"); private final Map map = new HashMap(); diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index d83a575a81..d63ba3f506 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -26,7 +26,7 @@ import static java.util.Arrays.asList; // IMPORTANT! Make sure USAGE.txt is always uptodate if this class changes. -public class RuntimeOptions implements Options { +public final class RuntimeOptions implements Options { static final String VERSION = ResourceBundle.getBundle("io.cucumber.core.version").getString("cucumber-jvm.version"); private static final String USAGE_RESOURCE = "/cucumber/api/cli/USAGE.txt"; @@ -72,7 +72,7 @@ public String map(String keyword) { * @param argv the arguments */ public RuntimeOptions(String argv) { - this(Shellwords.parse(argv)); + this(ShellWords.parse(argv)); } /** @@ -92,7 +92,7 @@ public RuntimeOptions(List argv) { String cucumberOptionsFromEnv = env.get("cucumber.options"); if (cucumberOptionsFromEnv != null) { - parse(Shellwords.parse(cucumberOptionsFromEnv)); + parse(ShellWords.parse(cucumberOptionsFromEnv)); } if (pluginFormatterNames.isEmpty()) { diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java index ce7691b3c3..d6b93e559c 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java @@ -10,7 +10,7 @@ import static java.util.Arrays.asList; -public class RuntimeOptionsFactory { +public final class RuntimeOptionsFactory { private final Class clazz; private boolean featuresSpecified = false; private boolean overridingGlueSpecified = false; diff --git a/core/src/main/java/io/cucumber/core/options/Shellwords.java b/core/src/main/java/io/cucumber/core/options/ShellWords.java similarity index 86% rename from core/src/main/java/io/cucumber/core/options/Shellwords.java rename to core/src/main/java/io/cucumber/core/options/ShellWords.java index 0f416ca74f..9b036df163 100644 --- a/core/src/main/java/io/cucumber/core/options/Shellwords.java +++ b/core/src/main/java/io/cucumber/core/options/ShellWords.java @@ -5,13 +5,13 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class Shellwords { +final class ShellWords { private static final Pattern SHELLWORDS_PATTERN = Pattern.compile("[^\\s']+|'([^']*)'"); - private Shellwords() { + private ShellWords() { } - public static List parse(String cmdline) { + static List parse(String cmdline) { List matchList = new ArrayList(); Matcher shellwordsMatcher = SHELLWORDS_PATTERN.matcher(cmdline); while (shellwordsMatcher.find()) { diff --git a/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java index 6d89325723..7f293fd06c 100644 --- a/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java @@ -11,7 +11,7 @@ import java.io.PrintStream; import java.util.List; -class DefaultSummaryPrinter implements SummaryPrinter, ColorAware, StrictAware, EventListener { +final class DefaultSummaryPrinter implements SummaryPrinter, ColorAware, StrictAware, EventListener { private final Stats stats = new Stats(); private final UndefinedStepsTracker undefinedStepsTracker = new UndefinedStepsTracker(); diff --git a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index 802fce0961..64f760c552 100644 --- a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -16,7 +16,6 @@ import cucumber.api.event.WriteEvent; import cucumber.api.formatter.NiceAppendable; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.io.URLOutputStream; import gherkin.ast.Background; import gherkin.ast.DataTable; import gherkin.ast.DocString; diff --git a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java index ae5270f097..0c3e2bcbe6 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java @@ -12,8 +12,6 @@ import cucumber.api.event.TestStepFinished; import cucumber.api.formatter.StrictAware; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.io.URLOutputStream; -import io.cucumber.core.io.UTF8OutputStreamWriter; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; diff --git a/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java index 08a5fb9302..8d93626e33 100644 --- a/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java @@ -2,7 +2,7 @@ import cucumber.api.SummaryPrinter; -class NullSummaryPrinter implements SummaryPrinter { +final class NullSummaryPrinter implements SummaryPrinter { @SuppressWarnings("WeakerAccess") // Used by PluginFactory public NullSummaryPrinter(){ diff --git a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java index c3086fcc62..df61a8de6c 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java +++ b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java @@ -6,8 +6,6 @@ import cucumber.api.event.ConcurrentEventListener; import cucumber.api.event.EventListener; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.io.URLOutputStream; -import io.cucumber.core.io.UTF8OutputStreamWriter; import java.io.File; import java.io.IOException; diff --git a/core/src/main/java/io/cucumber/core/plugin/Plugins.java b/core/src/main/java/io/cucumber/core/plugin/Plugins.java index cc8e046133..ffa7392b2e 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Plugins.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugins.java @@ -17,7 +17,6 @@ public final class Plugins { private final List plugins; - private final ClassLoader classLoader; private boolean pluginNamesInstantiated; private final PluginFactory pluginFactory; @@ -25,8 +24,7 @@ public final class Plugins { private final EventPublisher orderedEventPublisher; private final Options options; - public Plugins(ClassLoader classLoader, PluginFactory pluginFactory, EventPublisher eventPublisher, Options options) { - this.classLoader = classLoader; + public Plugins(PluginFactory pluginFactory, EventPublisher eventPublisher, Options options) { this.pluginFactory = pluginFactory; this.eventPublisher = eventPublisher; this.orderedEventPublisher = createCanonicalOrderEventPublisher(); diff --git a/core/src/main/java/io/cucumber/core/plugin/Stats.java b/core/src/main/java/io/cucumber/core/plugin/Stats.java index ddd520a4db..dda3496baf 100755 --- a/core/src/main/java/io/cucumber/core/plugin/Stats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Stats.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.Locale; -public class Stats implements EventListener, ColorAware, StrictAware { +final class Stats implements EventListener, ColorAware, StrictAware { static final long ONE_SECOND = 1000000000; static final long ONE_MINUTE = 60 * ONE_SECOND; private SubCounts scenarioSubCounts = new SubCounts(); @@ -65,7 +65,7 @@ public void receive(TestRunFinished event) { }; private boolean strict; - public Stats() { + Stats() { this(Locale.getDefault()); } diff --git a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java index bb36275297..d7a2853835 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java @@ -13,8 +13,6 @@ import cucumber.api.event.TestStepFinished; import cucumber.api.formatter.StrictAware; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.io.URLOutputStream; -import io.cucumber.core.io.UTF8OutputStreamWriter; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; @@ -40,7 +38,7 @@ import java.util.Date; import java.util.List; -class TestNGFormatter implements EventListener, StrictAware { +final class TestNGFormatter implements EventListener, StrictAware { private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); private final Writer writer; diff --git a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index 5d3a75d3a8..1bc9c59ec4 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -11,7 +11,6 @@ import cucumber.api.event.TestSourceRead; import cucumber.api.formatter.NiceAppendable; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.io.URLOutputStream; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; import gherkin.deps.com.google.gson.annotations.SerializedName; @@ -32,7 +31,7 @@ import static java.util.concurrent.TimeUnit.NANOSECONDS; -public class TimelineFormatter implements ConcurrentEventListener { +final class TimelineFormatter implements ConcurrentEventListener { //TODO: if accepted then should move resources out into own project as per HTML report private static final String[] TEXT_ASSETS = new String[]{ diff --git a/core/src/main/java/io/cucumber/core/io/URLOutputStream.java b/core/src/main/java/io/cucumber/core/plugin/URLOutputStream.java similarity index 94% rename from core/src/main/java/io/cucumber/core/io/URLOutputStream.java rename to core/src/main/java/io/cucumber/core/plugin/URLOutputStream.java index dfe3ca4c90..100c914634 100644 --- a/core/src/main/java/io/cucumber/core/io/URLOutputStream.java +++ b/core/src/main/java/io/cucumber/core/plugin/URLOutputStream.java @@ -1,4 +1,4 @@ -package io.cucumber.core.io; +package io.cucumber.core.plugin; import gherkin.deps.com.google.gson.Gson; import io.cucumber.core.util.FixJava; @@ -9,22 +9,23 @@ import java.util.Collections; import java.util.Map; + /** * A stream that can write to both file and http URLs. If it's a file URL, writes with a {@link java.io.FileOutputStream}, * if it's a http or https URL, writes with a HTTP PUT (by default) or with the specified method. */ -public class URLOutputStream extends OutputStream { +class URLOutputStream extends OutputStream { private final URL url; private final String method; private final int expectedResponseCode; private final OutputStream out; private final HttpURLConnection urlConnection; - public URLOutputStream(URL url) throws IOException { + URLOutputStream(URL url) throws IOException { this(url, "PUT", Collections.emptyMap(), 200); } - public URLOutputStream(URL url, String method, Map headers, int expectedResponseCode) throws IOException { + private URLOutputStream(URL url, String method, Map headers, int expectedResponseCode) throws IOException { this.url = url; this.method = method; this.expectedResponseCode = expectedResponseCode; diff --git a/core/src/main/java/io/cucumber/core/plugin/UTF8OutputStreamWriter.java b/core/src/main/java/io/cucumber/core/plugin/UTF8OutputStreamWriter.java new file mode 100644 index 0000000000..06d552f332 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/plugin/UTF8OutputStreamWriter.java @@ -0,0 +1,11 @@ +package io.cucumber.core.plugin; + +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; + +final class UTF8OutputStreamWriter extends OutputStreamWriter { + UTF8OutputStreamWriter(OutputStream out) { + super(out, Charset.forName("UTF-8")); + } +} diff --git a/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java index 4a1caf1cf7..bdbaccef15 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java +++ b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.Map; -class UndefinedStepsTracker implements EventListener { +final class UndefinedStepsTracker implements EventListener { private final List snippets = new ArrayList(); private final IGherkinDialectProvider dialectProvider = new GherkinDialectProvider(); private final Map pathToSourceMap = new HashMap(); diff --git a/core/src/main/java/io/cucumber/core/reflection/MethodFormat.java b/core/src/main/java/io/cucumber/core/reflection/MethodFormat.java index 9d3995ae07..eecf43ef7e 100644 --- a/core/src/main/java/io/cucumber/core/reflection/MethodFormat.java +++ b/core/src/main/java/io/cucumber/core/reflection/MethodFormat.java @@ -11,7 +11,7 @@ /** * Helper class for formatting a method signature to a shorter form. */ -public class MethodFormat { +public final class MethodFormat { private static final Pattern METHOD_PATTERN = Pattern.compile("((?:static\\s|public\\s)+)([^\\s]*)\\s\\.?(.*)\\.([^\\(]*)\\(([^\\)]*)\\)(?: throws )?(.*)"); private static final String PACKAGE_PATTERN = "[^,]*\\."; private final MessageFormat format; diff --git a/core/src/main/java/io/cucumber/core/reflection/NoInstancesException.java b/core/src/main/java/io/cucumber/core/reflection/NoInstancesException.java index 13507a2568..e7a587f737 100644 --- a/core/src/main/java/io/cucumber/core/reflection/NoInstancesException.java +++ b/core/src/main/java/io/cucumber/core/reflection/NoInstancesException.java @@ -2,7 +2,7 @@ import io.cucumber.core.exception.CucumberException; -public class NoInstancesException extends CucumberException { +public final class NoInstancesException extends CucumberException { NoInstancesException(Class parentType) { super(createMessage(parentType)); diff --git a/core/src/main/java/io/cucumber/core/reflection/Reflections.java b/core/src/main/java/io/cucumber/core/reflection/Reflections.java index f352346a06..4e24be1f26 100644 --- a/core/src/main/java/io/cucumber/core/reflection/Reflections.java +++ b/core/src/main/java/io/cucumber/core/reflection/Reflections.java @@ -10,7 +10,7 @@ import java.util.HashSet; import java.util.List; -public class Reflections { +public final class Reflections { private final ClassFinder classFinder; public Reflections(ClassFinder classFinder) { @@ -49,7 +49,7 @@ public Collection instantiateSubclasses(Class parentType, Li } public T newInstance(Class[] constructorParams, Object[] constructorArgs, Class clazz) { - Constructor constructor = null; + Constructor constructor; try { constructor = clazz.getConstructor(constructorParams); try { @@ -63,14 +63,5 @@ public T newInstance(Class[] constructorParams, Object[] constructorArgs, Cl } } - private boolean hasConstructor(Class clazz, Class[] paramTypes) { - try { - clazz.getConstructor(paramTypes); - return true; - } catch (NoSuchMethodException e) { - return false; - } - } - } diff --git a/core/src/main/java/io/cucumber/core/reflection/TooManyInstancesException.java b/core/src/main/java/io/cucumber/core/reflection/TooManyInstancesException.java index 6c1fd1de74..dd5896a290 100644 --- a/core/src/main/java/io/cucumber/core/reflection/TooManyInstancesException.java +++ b/core/src/main/java/io/cucumber/core/reflection/TooManyInstancesException.java @@ -4,13 +4,13 @@ import java.util.Collection; -public class TooManyInstancesException extends CucumberException { +public final class TooManyInstancesException extends CucumberException { TooManyInstancesException(Collection instances) { super(createMessage(instances)); } private static String createMessage(Collection instances) { - return String.format("Expected only one instance, but found too many: " + instances); + return "Expected only one instance, but found too many: " + instances; } } diff --git a/core/src/main/java/io/cucumber/core/runner/AbstractEventPublisher.java b/core/src/main/java/io/cucumber/core/runner/AbstractEventPublisher.java index 007960f21a..0fb4d4a955 100644 --- a/core/src/main/java/io/cucumber/core/runner/AbstractEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/runner/AbstractEventPublisher.java @@ -9,7 +9,7 @@ import java.util.List; import java.util.Map; -class AbstractEventPublisher implements EventPublisher { +abstract class AbstractEventPublisher implements EventPublisher { protected Map, List> handlers = new HashMap, List>(); @Override diff --git a/core/src/main/java/io/cucumber/core/runner/CanonicalOrderEventPublisher.java b/core/src/main/java/io/cucumber/core/runner/CanonicalOrderEventPublisher.java index 1ae15d9b2c..a8ff152324 100644 --- a/core/src/main/java/io/cucumber/core/runner/CanonicalOrderEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/runner/CanonicalOrderEventPublisher.java @@ -7,7 +7,7 @@ import java.util.LinkedList; import java.util.List; -public class CanonicalOrderEventPublisher extends AbstractEventPublisher { +public final class CanonicalOrderEventPublisher extends AbstractEventPublisher { private final List queue = new LinkedList<>(); diff --git a/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java b/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java index c2e449a124..c09ce5357b 100644 --- a/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java +++ b/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java @@ -6,7 +6,7 @@ import java.util.ArrayList; import java.util.List; -public final class DefinitionArgument implements Argument { +final class DefinitionArgument implements Argument { private final io.cucumber.cucumberexpressions.Group group; @@ -14,7 +14,7 @@ private DefinitionArgument(ExpressionArgument expressionArgument) { group = expressionArgument.getGroup(); } - public static List createArguments(List match) { + static List createArguments(List match) { List args = new ArrayList(); for (io.cucumber.core.stepexpression.Argument argument : match) { if (argument instanceof ExpressionArgument) { diff --git a/core/src/main/java/io/cucumber/core/runner/HookComparator.java b/core/src/main/java/io/cucumber/core/runner/HookComparator.java index 53bbd14153..735b716918 100644 --- a/core/src/main/java/io/cucumber/core/runner/HookComparator.java +++ b/core/src/main/java/io/cucumber/core/runner/HookComparator.java @@ -4,7 +4,7 @@ import java.util.Comparator; -class HookComparator implements Comparator { +final class HookComparator implements Comparator { private final boolean ascending; HookComparator(boolean ascending) { diff --git a/core/src/main/java/io/cucumber/core/runner/Match.java b/core/src/main/java/io/cucumber/core/runner/Match.java index e398d02c7b..c4e2e8e07b 100644 --- a/core/src/main/java/io/cucumber/core/runner/Match.java +++ b/core/src/main/java/io/cucumber/core/runner/Match.java @@ -7,11 +7,11 @@ import static java.util.Objects.requireNonNull; -class Match { +abstract class Match { private final List arguments; private final String location; - public static final Match UNDEFINED = new Match(Collections.emptyList(), null); + public static final Match UNDEFINED = new UndefinedMatch(); Match(List arguments, String location) { requireNonNull(arguments, "argument may not be null"); @@ -27,4 +27,9 @@ public String getLocation() { return location; } + private static final class UndefinedMatch extends Match { + UndefinedMatch() { + super(Collections.emptyList(), null); + } + } } diff --git a/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java index 99d8d7ceee..a61be1eef2 100644 --- a/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java @@ -20,7 +20,7 @@ class PickleStepDefinitionMatch extends Match implements StepDefinitionMatch { // to prevent it from ending up in the JSON. private final transient PickleStep step; - public PickleStepDefinitionMatch(List arguments, StepDefinition stepDefinition, String featurePath, PickleStep step) { + PickleStepDefinitionMatch(List arguments, StepDefinition stepDefinition, String featurePath, PickleStep step) { super(arguments, stepDefinition.getLocation(false)); this.stepDefinition = stepDefinition; this.featurePath = featurePath; diff --git a/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java index 1b9b031683..906aa7a671 100644 --- a/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java @@ -6,7 +6,7 @@ import java.util.Collections; import java.util.List; -class PickleStepTestStep extends TestStep implements cucumber.api.PickleStepTestStep { +final class PickleStepTestStep extends TestStep implements cucumber.api.PickleStepTestStep { private final String uri; private final PickleStep step; private final List afterStepHookSteps; diff --git a/core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java index 861e2b2683..bbc9aa6116 100644 --- a/core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java @@ -5,10 +5,10 @@ /** * Returns a single unique runner. - * + *

    * Not thread safe. */ -public class SingletonRunnerSupplier implements RunnerSupplier { +public final class SingletonRunnerSupplier implements RunnerSupplier { private final BackendSupplier backendSupplier; private final RuntimeOptions runtimeOptions; diff --git a/core/src/main/java/io/cucumber/core/runner/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runner/ThreadLocalRunnerSupplier.java index ef6575ac50..29cf1b514a 100644 --- a/core/src/main/java/io/cucumber/core/runner/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runner/ThreadLocalRunnerSupplier.java @@ -10,7 +10,7 @@ *

    * Each runners bus passes all events to the event bus of this supplier. */ -public class ThreadLocalRunnerSupplier implements RunnerSupplier { +public final class ThreadLocalRunnerSupplier implements RunnerSupplier { private final BackendSupplier backendSupplier; private final RuntimeOptions runtimeOptions; diff --git a/core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java index 6c97561c3f..6841922275 100644 --- a/core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java @@ -6,7 +6,7 @@ import java.util.Collections; -class UndefinedPickleStepDefinitionMatch extends PickleStepDefinitionMatch { +final class UndefinedPickleStepDefinitionMatch extends PickleStepDefinitionMatch { UndefinedPickleStepDefinitionMatch(PickleStep step) { super(Collections.emptyList(), new NoStepDefinition(), null, step); diff --git a/core/src/main/java/io/cucumber/core/runner/UndefinedStepException.java b/core/src/main/java/io/cucumber/core/runner/UndefinedStepException.java deleted file mode 100644 index b5cc80bf9c..0000000000 --- a/core/src/main/java/io/cucumber/core/runner/UndefinedStepException.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.cucumber.core.runner; - -import gherkin.pickles.PickleStep; - -final class UndefinedStepException extends Throwable { - public UndefinedStepException(PickleStep step) { - super(String.format("Undefined Step: %s", step.getText())); - } -} diff --git a/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java b/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java index e3738ec90c..72d85fd0e2 100644 --- a/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java @@ -13,6 +13,7 @@ import java.util.Collection; import java.util.List; +import java.util.Locale; import static java.util.Collections.singletonList; @@ -56,4 +57,17 @@ private Collection loadBackends() { return reflections.instantiateSubclasses(Backend.class, packages, new Class[]{ResourceLoader.class, TypeRegistry.class}, new Object[]{resourceLoader, typeRegistry}); } + private static final class DefaultTypeRegistryConfiguration implements TypeRegistryConfigurer { + + @Override + public Locale locale() { + return Locale.ENGLISH; + } + + @Override + public void configureTypeRegistry(cucumber.api.TypeRegistry typeRegistry) { + //noop + } + + } } diff --git a/core/src/main/java/io/cucumber/core/runtime/DefaultTypeRegistryConfiguration.java b/core/src/main/java/io/cucumber/core/runtime/DefaultTypeRegistryConfiguration.java deleted file mode 100644 index cf253c585f..0000000000 --- a/core/src/main/java/io/cucumber/core/runtime/DefaultTypeRegistryConfiguration.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.cucumber.core.runtime; - -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; - -import java.util.Locale; - -class DefaultTypeRegistryConfiguration implements TypeRegistryConfigurer { - - @Override - public Locale locale() { - return Locale.ENGLISH; - } - - @Override - public void configureTypeRegistry(TypeRegistry typeRegistry) { - //noop - } - -} diff --git a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java index 4994d37c19..1ca5c2731c 100644 --- a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java @@ -11,7 +11,7 @@ /** * Supplies a list of features found on the the feature path provided to RuntimeOptions. */ -public class FeaturePathFeatureSupplier implements FeatureSupplier { +public final class FeaturePathFeatureSupplier implements FeatureSupplier { private final FeatureLoader featureLoader; private final RuntimeOptions runtimeOptions; private final EventBus bus; diff --git a/core/src/main/java/io/cucumber/core/runtime/Invoker.java b/core/src/main/java/io/cucumber/core/runtime/Invoker.java index 2685f1cdd0..8fb4c5500f 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Invoker.java +++ b/core/src/main/java/io/cucumber/core/runtime/Invoker.java @@ -13,8 +13,10 @@ import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; -public class Invoker { +public final class Invoker { + private Invoker() { + } public static T timeout(Callback callback, long timeoutMillis) throws Throwable { @@ -74,12 +76,12 @@ public Object call() throws Throwable { return targetMethod.invoke(target, args); } catch (IllegalArgumentException e) { throw new CucumberException("Failed to invoke " + MethodFormat.FULL.format(targetMethod) + - ", caused by " + e.getClass().getName() + ": " + e.getMessage(), e); + ", caused by " + e.getClass().getName() + ": " + e.getMessage(), e); } catch (InvocationTargetException e) { throw e.getTargetException(); } catch (IllegalAccessException e) { throw new CucumberException("Failed to invoke " + MethodFormat.FULL.format(targetMethod) + - ", caused by " + e.getClass().getName() + ": " + e.getMessage(), e); + ", caused by " + e.getClass().getName() + ": " + e.getMessage(), e); } finally { targetMethod.setAccessible(accessible); } diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 258ff71acf..4e50c33046 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -47,12 +47,10 @@ /** * This is the main entry point for running Cucumber features from the CLI. */ -public class Runtime { +public final class Runtime { private final ExitStatus exitStatus; - private final RuntimeOptions runtimeOptions; - private final RunnerSupplier runnerSupplier; private final Filters filters; private final EventBus bus; @@ -60,16 +58,15 @@ public class Runtime { private final Plugins plugins; private final ExecutorService executor; - public Runtime(final Plugins plugins, - final RuntimeOptions runtimeOptions, - final EventBus bus, - final Filters filters, - final RunnerSupplier runnerSupplier, - final FeatureSupplier featureSupplier, - final ExecutorService executor) { + private Runtime(final Plugins plugins, + final RuntimeOptions runtimeOptions, + final EventBus bus, + final Filters filters, + final RunnerSupplier runnerSupplier, + final FeatureSupplier featureSupplier, + final ExecutorService executor) { this.plugins = plugins; - this.runtimeOptions = runtimeOptions; this.filters = filters; this.bus = bus; this.runnerSupplier = runnerSupplier; @@ -199,7 +196,7 @@ public Runtime build() { ? this.backendSupplier : new BackendModuleBackendSupplier(resourceLoader, classFinder, this.runtimeOptions); - final Plugins plugins = new Plugins(this.classLoader, new PluginFactory(), this.eventBus, this.runtimeOptions); + final Plugins plugins = new Plugins(new PluginFactory(), this.eventBus, this.runtimeOptions); for (final Plugin plugin : additionalPlugins) { plugins.addPlugin(plugin); } diff --git a/core/src/main/java/io/cucumber/core/snippets/ArgumentPattern.java b/core/src/main/java/io/cucumber/core/snippets/ArgumentPattern.java index 360c66c757..c1e27ba7d9 100644 --- a/core/src/main/java/io/cucumber/core/snippets/ArgumentPattern.java +++ b/core/src/main/java/io/cucumber/core/snippets/ArgumentPattern.java @@ -3,7 +3,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -class ArgumentPattern { +final class ArgumentPattern { private final Pattern pattern; private final String replacement; diff --git a/core/src/main/java/io/cucumber/core/snippets/CamelCaseConcatenator.java b/core/src/main/java/io/cucumber/core/snippets/CamelCaseConcatenator.java deleted file mode 100644 index fb2a37da6b..0000000000 --- a/core/src/main/java/io/cucumber/core/snippets/CamelCaseConcatenator.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.cucumber.core.snippets; - -public class CamelCaseConcatenator implements Concatenator { - @Override - public String concatenate(String[] words) { - StringBuilder functionName = new StringBuilder(); - boolean firstWord = true; - for (String word : words) { - if (firstWord) { - functionName.append(word.toLowerCase()); - firstWord = false; - } else { - functionName.append(capitalize(word)); - } - } - return functionName.toString(); - } - - private String capitalize(String line) { - return Character.toUpperCase(line.charAt(0)) + line.substring(1); - } -} diff --git a/core/src/main/java/io/cucumber/core/snippets/Concatenator.java b/core/src/main/java/io/cucumber/core/snippets/Concatenator.java deleted file mode 100644 index 3c2695aadd..0000000000 --- a/core/src/main/java/io/cucumber/core/snippets/Concatenator.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.cucumber.core.snippets; - -public interface Concatenator { - String concatenate(String[] words); -} diff --git a/core/src/main/java/io/cucumber/core/snippets/FunctionNameGenerator.java b/core/src/main/java/io/cucumber/core/snippets/FunctionNameGenerator.java deleted file mode 100644 index 5b46c96c01..0000000000 --- a/core/src/main/java/io/cucumber/core/snippets/FunctionNameGenerator.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.cucumber.core.snippets; - -public class FunctionNameGenerator { - private static final Character SUBST = ' '; - private final Concatenator concatenator; - - public FunctionNameGenerator(Concatenator concatenator) { - this.concatenator = concatenator; - } - - public String generateFunctionName(String sentence) { - - sentence = removeIllegalCharacters(sentence); - sentence = sentence.trim(); - String[] words = sentence.split("\\s"); - - return concatenator.concatenate(words); - } - - private String removeIllegalCharacters(String sentence) { - if (sentence.isEmpty()) { - throw new IllegalArgumentException("Cannot create function name from empty sentence"); - } - StringBuilder sanitized = new StringBuilder(); - sanitized.append(Character.isJavaIdentifierStart(sentence.charAt(0)) ? sentence.charAt(0) : SUBST); - for (int i = 1; i < sentence.length(); i++) { - if (Character.isJavaIdentifierPart(sentence.charAt(i))) { - sanitized.append(sentence.charAt(i)); - } else if (sanitized.charAt(sanitized.length() - 1) != SUBST && i != sentence.length() - 1) { - sanitized.append(SUBST); - } - } - return sanitized.toString(); - } -} diff --git a/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java b/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java index 2dfc74d7df..f7bff1b3af 100644 --- a/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java +++ b/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java @@ -1,5 +1,6 @@ package io.cucumber.core.snippets; +import cucumber.api.SnippetType; import io.cucumber.cucumberexpressions.GeneratedExpression; import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.datatable.DataTable; @@ -19,7 +20,7 @@ import static java.text.MessageFormat.format; -public class SnippetGenerator { +public final class SnippetGenerator { @SuppressWarnings("RegExpRedundantEscape") // Android can't parse unescaped braces. private static final ArgumentPattern[] DEFAULT_ARGUMENT_PATTERNS = new ArgumentPattern[]{ new ArgumentPattern(Pattern.compile("\\{.*?\\}")) @@ -35,7 +36,7 @@ public SnippetGenerator(Snippet snippet, ParameterTypeRegistry parameterTypeRegi this.generator = new CucumberExpressionGenerator(parameterTypeRegistry); } - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { List generatedExpressions = generator.generateExpressions(step.getText()); List snippets = new ArrayList<>(generatedExpressions.size()); @@ -54,7 +55,7 @@ public List getSnippet(PickleStep step, String keyword, FunctionNameGene return snippets; } - private String functionName(String sentence, FunctionNameGenerator functionNameGenerator) { + private String functionName(String sentence, SnippetType.FunctionNameGenerator functionNameGenerator) { if (functionNameGenerator == null) { return null; } diff --git a/core/src/main/java/io/cucumber/core/snippets/UnderscoreConcatenator.java b/core/src/main/java/io/cucumber/core/snippets/UnderscoreConcatenator.java deleted file mode 100644 index 9a33b1f016..0000000000 --- a/core/src/main/java/io/cucumber/core/snippets/UnderscoreConcatenator.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.cucumber.core.snippets; - -public class UnderscoreConcatenator implements Concatenator { - @Override - public String concatenate(String[] words) { - StringBuilder functionName = new StringBuilder(); - boolean firstWord = true; - for (String word : words) { - if (firstWord) { - word = word.toLowerCase(); - } else { - functionName.append('_'); - } - functionName.append(word); - firstWord = false; - } - return functionName.toString(); - } -} diff --git a/core/src/main/java/io/cucumber/core/stepexpression/PickleTableConverter.java b/core/src/main/java/io/cucumber/core/stepexpression/PickleTableConverter.java index ce5d380921..24354ee247 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/PickleTableConverter.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/PickleTableConverter.java @@ -7,7 +7,12 @@ import java.util.ArrayList; import java.util.List; -class PickleTableConverter { +final class PickleTableConverter { + + private PickleTableConverter() { + + } + static List> toTable(PickleTable pickleTable) { List> table = new ArrayList>(); for (PickleRow pickleRow : pickleTable.getRows()) { diff --git a/core/src/test/java/io/cucumber/core/backend/StubBackend.java b/core/src/test/java/io/cucumber/core/backend/StubBackend.java index 9d5618c277..647e71b62d 100644 --- a/core/src/test/java/io/cucumber/core/backend/StubBackend.java +++ b/core/src/test/java/io/cucumber/core/backend/StubBackend.java @@ -1,7 +1,7 @@ package io.cucumber.core.backend; +import cucumber.api.SnippetType; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; import io.cucumber.core.stepexpression.TypeRegistry; @@ -32,7 +32,7 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return emptyList(); } } diff --git a/core/src/test/java/io/cucumber/core/io/TestClasspathResourceLoader.java b/core/src/test/java/io/cucumber/core/io/TestClasspathResourceLoader.java new file mode 100644 index 0000000000..9bf3e79379 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/io/TestClasspathResourceLoader.java @@ -0,0 +1,10 @@ +package io.cucumber.core.io; + + +public class TestClasspathResourceLoader { + + public static ResourceLoader create(ClassLoader classLoader) { + return new ClasspathResourceLoader(classLoader); + } + +} \ No newline at end of file diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java index 11387a1800..757468e4c4 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java @@ -45,7 +45,7 @@ public void create_without_options() { assertFalse(runtimeOptions.isStrict()); assertEquals(asList("classpath:io/cucumber/core/options"), runtimeOptions.getFeaturePaths()); assertEquals(asList("classpath:io/cucumber/core/options"), runtimeOptions.getGlue()); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); assertThat(plugins.getPlugins(), hasSize(2)); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.ProgressFormatter"); @@ -56,7 +56,7 @@ public void create_without_options() { public void create_without_options_with_base_class_without_options() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(WithoutOptionsWithBaseClassWithoutOptions.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); assertEquals(asList("classpath:io/cucumber/core/options"), runtimeOptions.getFeaturePaths()); assertEquals(asList("classpath:io/cucumber/core/options"), runtimeOptions.getGlue()); @@ -112,7 +112,7 @@ public void finds_path_for_class_in_toplevel_package() { public void create_default_summary_printer_when_no_summary_printer_plugin_is_defined() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(ClassWithNoSummaryPrinterPlugin.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @@ -120,7 +120,7 @@ public void create_default_summary_printer_when_no_summary_printer_plugin_is_def public void inherit_plugin_from_baseclass() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(SubClassWithFormatter.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - List plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions).getPlugins(); + List plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions).getPlugins(); assertPluginExists(plugins, "io.cucumber.core.plugin.JSONFormatter"); assertPluginExists(plugins, "io.cucumber.core.plugin.PrettyFormatter"); } diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index 121c5ced8d..9f78ace44e 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -80,35 +80,35 @@ public void assigns_glue() { @Test public void creates_html_formatter() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "html:some/dir", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); assertEquals("io.cucumber.core.plugin.HTMLFormatter", plugins.getPlugins().get(0).getClass().getName()); } @Test public void creates_progress_formatter_as_default() { RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); assertEquals("io.cucumber.core.plugin.ProgressFormatter", plugins.getPlugins().get(0).getClass().getName()); } @Test public void creates_progress_formatter_when_no_formatter_plugin_is_specified() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "io.cucumber.core.plugin.AnyStepDefinitionReporter", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.ProgressFormatter"); } @Test public void creates_default_summary_printer_when_no_summary_printer_plugin_is_specified() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "pretty", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test public void creates_null_summary_printer() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "null_summary", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.NullSummaryPrinter"); assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @@ -287,7 +287,7 @@ public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucum Properties properties = new Properties(); properties.setProperty("cucumber.options", "--plugin pretty"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:some/dir", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.PrettyFormatter"); assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.HTMLFormatter"); } @@ -297,7 +297,7 @@ public void adds_to_formatter_plugins_with_add_plugin_option() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--add-plugin pretty"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:some/dir", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.HTMLFormatter"); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.PrettyFormatter"); } @@ -307,7 +307,7 @@ public void clobbers_summary_plugins_from_cli_if_summary_printer_specified_in_cu Properties properties = new Properties(); properties.setProperty("cucumber.options", "--plugin default_summary"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "null_summary", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.NullSummaryPrinter"); } @@ -317,7 +317,7 @@ public void adds_to_summary_plugins_with_add_plugin_option() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--add-plugin default_summary"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "null_summary", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.NullSummaryPrinter"); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @@ -327,7 +327,7 @@ public void does_not_clobber_plugins_of_different_type_when_specifying_plugins_i Properties properties = new Properties(); properties.setProperty("cucumber.options", "--plugin default_summary"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "pretty", "--glue", "somewhere")); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); // assertPluginExists(options.getPlugins(), "io.cucumber.core.plugin.CucumberPrettyFormatter"); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @@ -401,7 +401,7 @@ public void setEventPublisher(EventPublisher publisher) { @Test public void set_monochrome_on_color_aware_formatters() throws Exception { RuntimeOptions options = new RuntimeOptions(new Env(), asList("--monochrome", "--plugin", AwareFormatter.class.getName())); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); plugins.getPlugins(); AwareFormatter formatter = (AwareFormatter) plugins.getPlugins().get(0); assertTrue(formatter.isMonochrome()); @@ -410,7 +410,7 @@ public void set_monochrome_on_color_aware_formatters() throws Exception { @Test public void set_strict_on_strict_aware_formatters() throws Exception { RuntimeOptions options = new RuntimeOptions(new Env(), asList("--strict", "--plugin", AwareFormatter.class.getName())); - Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); AwareFormatter formatter = (AwareFormatter) plugins.getPlugins().get(0); assertTrue(formatter.isStrict()); } diff --git a/core/src/test/java/io/cucumber/core/options/ShellwordsTest.java b/core/src/test/java/io/cucumber/core/options/ShellWordsTest.java similarity index 70% rename from core/src/test/java/io/cucumber/core/options/ShellwordsTest.java rename to core/src/test/java/io/cucumber/core/options/ShellWordsTest.java index db102d9462..fc78c3f20e 100644 --- a/core/src/test/java/io/cucumber/core/options/ShellwordsTest.java +++ b/core/src/test/java/io/cucumber/core/options/ShellWordsTest.java @@ -6,27 +6,27 @@ import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; -public class ShellwordsTest { +public class ShellWordsTest { @Test public void parses_single_quoted_strings() { - assertEquals(asList("--name", "The Fox"), Shellwords.parse("--name 'The Fox'")); + assertEquals(asList("--name", "The Fox"), ShellWords.parse("--name 'The Fox'")); } @Ignore("TODO: fixme") @Test public void parses_double_quoted_strings() { - assertEquals(asList("--name", "The Fox"), Shellwords.parse("--name \"The Fox\"")); + assertEquals(asList("--name", "The Fox"), ShellWords.parse("--name \"The Fox\"")); } @Ignore("TODO: fixme") @Test public void parses_both_single_and_double_quoted_strings() { - assertEquals(asList("--name", "The Fox", "--fur", "Brown White"), Shellwords.parse("--name \"The Fox\" --fur 'Brown White'")); + assertEquals(asList("--name", "The Fox", "--fur", "Brown White"), ShellWords.parse("--name \"The Fox\" --fur 'Brown White'")); } @Ignore("TODO: fixme") @Test public void can_quote_both_single_and_double_quotes() { - assertEquals(asList("'", "\""), Shellwords.parse("\"'\" '\"'")); + assertEquals(asList("'", "\""), ShellWords.parse("\"'\" '\"'")); } } diff --git a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java index dfa7945dd8..1bc379acdf 100755 --- a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java @@ -1,6 +1,9 @@ package io.cucumber.core.plugin; import cucumber.api.Result; +import cucumber.api.SnippetType; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.TestClasspathResourceLoader; import io.cucumber.core.runner.EventBus; import io.cucumber.core.backend.Glue; import io.cucumber.core.runner.TestBackendSupplier; @@ -9,9 +12,7 @@ import io.cucumber.core.runner.TimeServiceStub; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.runtime.Runtime; -import io.cucumber.core.io.ClasspathResourceLoader; import io.cucumber.core.model.CucumberFeature; -import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; import org.junit.Test; @@ -1132,7 +1133,7 @@ private String runFeaturesWithFormatterInParallel(final List featurePath File report = File.createTempFile("cucumber-jvm-junit", ".json"); final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - final ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader(classLoader); + final ResourceLoader resourceLoader = TestClasspathResourceLoader.create(classLoader); List args = new ArrayList(); args.add("--threads"); @@ -1149,7 +1150,7 @@ public void loadGlue(Glue glue, List gluePaths) { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return singletonList("TEST SNIPPET"); } }; @@ -1175,7 +1176,7 @@ private String runFeaturesWithFormatter(final List featurePaths) { when(hook.matches(ArgumentMatchers.anyList())).thenReturn(true); final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - final ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader(classLoader); + final ResourceLoader resourceLoader = TestClasspathResourceLoader.create(classLoader); final TestBackendSupplier backendSupplier = new TestBackendSupplier() { @Override @@ -1185,7 +1186,7 @@ public void loadGlue(Glue glue, List gluePaths) { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return singletonList("TEST SNIPPET"); } }; diff --git a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java index 448406084c..fd26a7f37f 100644 --- a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java @@ -8,7 +8,6 @@ import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.runner.TimeServiceStub; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.io.UTF8OutputStreamWriter; import org.junit.Test; import java.io.ByteArrayOutputStream; diff --git a/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java index ed7fb3dd61..d7befc99d3 100755 --- a/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java @@ -3,7 +3,6 @@ import cucumber.api.Result; import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.formatter.AnsiEscapes; -import io.cucumber.core.runner.DefinitionArgument; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.stepexpression.StepExpression; @@ -18,6 +17,7 @@ import java.util.Locale; import java.util.Map; +import static io.cucumber.core.runner.TestDefinitionArgument.createArguments; import static io.cucumber.core.runner.TestHelper.createWriteHookAction; import static io.cucumber.core.runner.TestHelper.feature; import static io.cucumber.core.runner.TestHelper.result; @@ -394,7 +394,7 @@ public void should_mark_subsequent_arguments_in_steps() throws Throwable { PrettyFormatter prettyFormatter = new PrettyFormatter(null); String stepText = "text 'arg1' text 'arg2'"; - String formattedText = prettyFormatter.formatStepText("Given ", stepText, formats.get("passed"), formats.get("passed_arg"), DefinitionArgument.createArguments(expression.match(stepText))); + String formattedText = prettyFormatter.formatStepText("Given ", stepText, formats.get("passed"), formats.get("passed_arg"), createArguments(expression.match(stepText))); assertThat(formattedText, equalTo(AnsiEscapes.GREEN + "Given " + AnsiEscapes.RESET + AnsiEscapes.GREEN + "text " + AnsiEscapes.RESET + @@ -414,7 +414,7 @@ public void should_mark_nested_argument_as_part_of_full_argument() { PrettyFormatter prettyFormatter = new PrettyFormatter(null); String stepText = "the order is placed and not yet confirmed"; - String formattedText = prettyFormatter.formatStepText("Given ", stepText, formats.get("passed"), formats.get("passed_arg"), DefinitionArgument.createArguments(expression.match(stepText))); + String formattedText = prettyFormatter.formatStepText("Given ", stepText, formats.get("passed"), formats.get("passed_arg"), createArguments(expression.match(stepText))); assertThat(formattedText, equalTo(AnsiEscapes.GREEN + "Given " + AnsiEscapes.RESET + AnsiEscapes.GREEN + "the order is placed" + AnsiEscapes.RESET + @@ -429,7 +429,7 @@ public void should_mark_nested_arguments_as_part_of_enclosing_argument() { StepExpressionFactory stepExpressionFactory = new StepExpressionFactory(registry); StepExpression expression = stepExpressionFactory.createExpression("the order is placed( and (not( yet)? )?confirmed)?"); String stepText = "the order is placed and not yet confirmed"; - String formattedText = prettyFormatter.formatStepText("Given ", stepText, formats.get("passed"), formats.get("passed_arg"), DefinitionArgument.createArguments(expression.match(stepText))); + String formattedText = prettyFormatter.formatStepText("Given ", stepText, formats.get("passed"), formats.get("passed_arg"), createArguments(expression.match(stepText))); assertThat(formattedText, equalTo(AnsiEscapes.GREEN + "Given " + AnsiEscapes.RESET + diff --git a/core/src/test/java/io/cucumber/core/plugin/TestUTF8OutputStreamWriter.java b/core/src/test/java/io/cucumber/core/plugin/TestUTF8OutputStreamWriter.java new file mode 100644 index 0000000000..53c6c46c38 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/plugin/TestUTF8OutputStreamWriter.java @@ -0,0 +1,12 @@ +package io.cucumber.core.plugin; + + +import java.io.OutputStream; + +public class TestUTF8OutputStreamWriter { + + public static UTF8OutputStreamWriter create(OutputStream outputStream){ + return new UTF8OutputStreamWriter(outputStream); + } + +} \ No newline at end of file diff --git a/core/src/test/java/io/cucumber/core/io/URLOutputStreamTest.java b/core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java similarity index 91% rename from core/src/test/java/io/cucumber/core/io/URLOutputStreamTest.java rename to core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java index d1713604a6..a86ca0264c 100644 --- a/core/src/test/java/io/cucumber/core/io/URLOutputStreamTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java @@ -1,5 +1,7 @@ -package io.cucumber.core.io; +package io.cucumber.core.plugin; +import io.cucumber.core.plugin.TestUTF8OutputStreamWriter; +import io.cucumber.core.plugin.URLOutputStream; import io.cucumber.core.util.FixJava; import org.junit.After; import org.junit.Before; @@ -78,7 +80,8 @@ public void write_to_file_without_existing_parent_directory() throws IOException String baseURL = filesWithoutParent.toUri().toURL().toString(); URL urlWithoutParentDirectory = createUrl(baseURL + "/non/existing/directory"); - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(urlWithoutParentDirectory)); + + Writer w = TestUTF8OutputStreamWriter.create(new URLOutputStream(urlWithoutParentDirectory)); w.write("Hellesøy"); w.close(); @@ -89,25 +92,25 @@ public void write_to_file_without_existing_parent_directory() throws IOException @Test public void can_write_to_file() throws IOException { File tmp = File.createTempFile("cucumber-jvm", "tmp"); - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(tmp.toURI().toURL())); + Writer w = TestUTF8OutputStreamWriter.create(new URLOutputStream(tmp.toURI().toURL())); w.write("Hellesøy"); w.close(); assertEquals("Hellesøy", FixJava.readReader(openUTF8FileReader(tmp))); } @Test - public void can_http_put() throws IOException, ExecutionException, InterruptedException { + public void can_http_put() throws IOException, InterruptedException { final BlockingQueue data = new LinkedBlockingDeque(); Rest r = new Rest(webbit); r.PUT("/.cucumber/stepdefs.json", new HttpHandler() { @Override - public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl) throws Exception { + public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl) { data.offer(req.body()); res.end(); } }); - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(CUCUMBER_STEPDEFS)); + Writer w = TestUTF8OutputStreamWriter.create(new URLOutputStream(CUCUMBER_STEPDEFS)); w.write("Hellesøy"); w.flush(); w.close(); @@ -115,8 +118,8 @@ public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl } @Test - public void throws_fnfe_if_http_response_is_404() throws IOException, ExecutionException, InterruptedException { - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(CUCUMBER_STEPDEFS)); + public void throws_fnfe_if_http_response_is_404() throws IOException { + Writer w = TestUTF8OutputStreamWriter.create(new URLOutputStream(CUCUMBER_STEPDEFS)); w.write("Hellesøy"); w.flush(); try { @@ -127,18 +130,18 @@ public void throws_fnfe_if_http_response_is_404() throws IOException, ExecutionE } @Test - public void throws_ioe_if_http_response_is_500() throws IOException, ExecutionException, InterruptedException { + public void throws_ioe_if_http_response_is_500() throws IOException { Rest r = new Rest(webbit); r.PUT("/.cucumber/stepdefs.json", new HttpHandler() { @Override - public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl) throws Exception { + public void handleHttpRequest(HttpRequest req, HttpResponse res, HttpControl ctl) { res.status(500); res.content("something went wrong"); res.end(); } }); - Writer w = new UTF8OutputStreamWriter(new URLOutputStream(CUCUMBER_STEPDEFS)); + Writer w = TestUTF8OutputStreamWriter.create(new URLOutputStream(CUCUMBER_STEPDEFS)); w.write("Hellesøy"); w.flush(); try { diff --git a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java index e1783d83d6..deecfeec75 100644 --- a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -1,12 +1,12 @@ package io.cucumber.core.runner; import cucumber.api.Scenario; +import cucumber.api.SnippetType; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.backend.Backend; import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; @@ -255,7 +255,7 @@ public void backends_are_asked_for_snippets_for_undefined_steps() { Backend backend = mock(Backend.class); Runner runner = new Runner(bus, singletonList(backend), runtimeOptions); runner.runPickle(createPickleEventWithSteps(asList(step))); - verify(backend).getSnippet(ArgumentMatchers.eq(step), anyString(), any(FunctionNameGenerator.class)); + verify(backend).getSnippet(ArgumentMatchers.eq(step), anyString(), any(SnippetType.FunctionNameGenerator.class)); } private HookDefinition addBeforeHook() { diff --git a/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java index 5a60c8dd84..31cf5a6836 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java @@ -1,8 +1,8 @@ package io.cucumber.core.runner; +import cucumber.api.SnippetType; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendSupplier; -import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; import java.util.Collection; @@ -24,7 +24,7 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return emptyList(); } diff --git a/core/src/test/java/io/cucumber/core/runner/TestDefinitionArgument.java b/core/src/test/java/io/cucumber/core/runner/TestDefinitionArgument.java new file mode 100644 index 0000000000..47670377f9 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/runner/TestDefinitionArgument.java @@ -0,0 +1,12 @@ +package io.cucumber.core.runner; + +import cucumber.api.Argument; + +import java.util.List; + +public class TestDefinitionArgument { + + public static List createArguments(List match) { + return DefinitionArgument.createArguments(match); + } +} \ No newline at end of file diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index 868fcc1a69..45c8971683 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -10,10 +10,11 @@ import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.TestClasspathResourceLoader; import io.cucumber.core.runtime.FeatureSupplier; import io.cucumber.core.runtime.Runtime; import io.cucumber.core.runtime.StubStepDefinition; -import io.cucumber.core.io.ClasspathResourceLoader; import io.cucumber.core.model.CucumberFeature; import gherkin.AstBuilder; import gherkin.Parser; @@ -253,7 +254,7 @@ public void run() { } final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - final ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader(classLoader); + final ResourceLoader resourceLoader = TestClasspathResourceLoader.create(classLoader); final BackendSupplier backendSupplier = new TestHelperBackendSupplier( diff --git a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java index 239d519c26..575d333e1a 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java @@ -1,10 +1,10 @@ package io.cucumber.core.runner; +import cucumber.api.SnippetType; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.Backend; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; import io.cucumber.core.stepexpression.TypeRegistry; @@ -45,7 +45,7 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return emptyList(); } diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index 63e85e90fd..f51a4101e6 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -9,6 +9,7 @@ import cucumber.api.event.TestCaseFinished; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.io.TestClasspathResourceLoader; import io.cucumber.core.runner.EventBus; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; @@ -19,7 +20,6 @@ import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.plugin.FormatterBuilder; import io.cucumber.core.plugin.FormatterSpy; -import io.cucumber.core.io.ClasspathResourceLoader; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.model.CucumberFeature; @@ -88,7 +88,7 @@ public List get() { Runtime.builder() .withBackendSupplier(backendSupplier) .withAdditionalPlugins(jsonFormatter) - .withResourceLoader(new ClasspathResourceLoader(classLoader)) + .withResourceLoader(TestClasspathResourceLoader.create(classLoader)) .withFeatureSupplier(featureSupplier) .build() .run(); diff --git a/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java b/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java index c0ddc5476d..be6808d35a 100644 --- a/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java +++ b/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java @@ -1,13 +1,14 @@ package io.cucumber.core.snippets; +import cucumber.api.SnippetType; import org.junit.Test; import static org.junit.Assert.assertEquals; public class FunctionNameGeneratorTest { - private FunctionNameGenerator underscore = new FunctionNameGenerator(new UnderscoreConcatenator()); - private FunctionNameGenerator camelCase = new FunctionNameGenerator(new CamelCaseConcatenator()); + private SnippetType.FunctionNameGenerator underscore = SnippetType.UNDERSCORE.getFunctionNameGenerator(); + private SnippetType.FunctionNameGenerator camelCase = SnippetType.CAMELCASE.getFunctionNameGenerator(); private void assertFunctionNames(String expectedUnderscore, String expectedCamelCase, String sentence) { assertEquals(expectedUnderscore, underscore.generateFunctionName(sentence)); From 8d5c2de8316a3589cd9282cf2498c53abc83f24d Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 21:22:46 +0200 Subject: [PATCH 015/155] [Java] Make packages final and package private where possible --- java/src/main/java/io/cucumber/java/JavaBackend.java | 4 ++-- java/src/test/java/io/cucumber/java/JavaSnippetTest.java | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 53c0d945fd..185cd9c68b 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -4,6 +4,7 @@ import static io.cucumber.java.ObjectFactoryLoader.loadObjectFactory; import static java.lang.Thread.currentThread; +import cucumber.api.SnippetType; import io.cucumber.core.runtime.Invoker; import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java.After; @@ -21,7 +22,6 @@ import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.snippets.FunctionNameGenerator; import io.cucumber.core.snippets.Snippet; import io.cucumber.core.snippets.SnippetGenerator; import gherkin.pickles.PickleStep; @@ -131,7 +131,7 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return snippetGenerator.getSnippet(step, keyword, functionNameGenerator); } diff --git a/java/src/test/java/io/cucumber/java/JavaSnippetTest.java b/java/src/test/java/io/cucumber/java/JavaSnippetTest.java index cb4b7e2f4e..114f99e698 100644 --- a/java/src/test/java/io/cucumber/java/JavaSnippetTest.java +++ b/java/src/test/java/io/cucumber/java/JavaSnippetTest.java @@ -1,8 +1,7 @@ package io.cucumber.java; -import io.cucumber.core.snippets.FunctionNameGenerator; +import cucumber.api.SnippetType; import io.cucumber.core.snippets.SnippetGenerator; -import io.cucumber.core.snippets.UnderscoreConcatenator; import gherkin.pickles.Argument; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleLocation; @@ -28,7 +27,7 @@ public class JavaSnippetTest { private static final String GIVEN_KEYWORD = "Given"; - private final FunctionNameGenerator functionNameGenerator = new FunctionNameGenerator(new UnderscoreConcatenator()); + private final SnippetType.FunctionNameGenerator functionNameGenerator = SnippetType.UNDERSCORE.getFunctionNameGenerator(); @Test public void generatesPlainSnippet() { From ddd1074993b915e59769e5a0b6e9a02d09885428 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 21:22:57 +0200 Subject: [PATCH 016/155] [JUnit] Make packages final and private where possible --- .../src/main/java/cucumber/api/junit/Cucumber.java | 2 +- .../java/io/cucumber/junit/FeatureRunnerTest.java | 14 ++++++++++---- .../java/io/cucumber/junit/stub/StubBackend.java | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/junit/src/main/java/cucumber/api/junit/Cucumber.java b/junit/src/main/java/cucumber/api/junit/Cucumber.java index d8c5b795ce..3a3d16a0d2 100644 --- a/junit/src/main/java/cucumber/api/junit/Cucumber.java +++ b/junit/src/main/java/cucumber/api/junit/Cucumber.java @@ -91,7 +91,7 @@ public Cucumber(Class clazz) throws InitializationError { ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); - Plugins plugins = new Plugins(classLoader, new PluginFactory(), bus, runtimeOptions); + Plugins plugins = new Plugins(new PluginFactory(), bus, runtimeOptions); this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); RerunFilters rerunFilters = new RerunFilters(runtimeOptions, featureLoader); this.filters = new Filters(runtimeOptions, rerunFilters); diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index 2ab32729f3..f2dae5c79a 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -1,5 +1,7 @@ package io.cucumber.junit; +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.runner.EventBus; import io.cucumber.core.runner.TimeService; @@ -9,7 +11,6 @@ import io.cucumber.core.runner.ThreadLocalRunnerSupplier; import io.cucumber.core.filter.Filters; import io.cucumber.core.filter.RerunFilters; -import io.cucumber.core.io.ClasspathResourceLoader; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.model.FeatureLoader; import org.junit.Test; @@ -20,10 +21,12 @@ import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.Set; import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.argThat; @@ -153,8 +156,6 @@ private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, Strin private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, JUnitOptions junitOption) throws InitializationError { final RuntimeOptions runtimeOptions = new RuntimeOptions(""); - final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - final ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader(classLoader); final TimeService timeServiceStub = new TimeService() { @Override @@ -170,7 +171,12 @@ public Collection get() { }; EventBus bus = new TimeServiceEventBus(timeServiceStub); - FeatureLoader featureLoader = new FeatureLoader(resourceLoader); + FeatureLoader featureLoader = new FeatureLoader(new ResourceLoader() { + @Override + public Iterable resources(String path, String suffix) { + return emptyList(); + } + }); RerunFilters rerunFilters = new RerunFilters(runtimeOptions, featureLoader); Filters filters = new Filters(runtimeOptions, rerunFilters); ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); diff --git a/junit/src/test/java/io/cucumber/junit/stub/StubBackend.java b/junit/src/test/java/io/cucumber/junit/stub/StubBackend.java index 18855641e4..6e860f1477 100644 --- a/junit/src/test/java/io/cucumber/junit/stub/StubBackend.java +++ b/junit/src/test/java/io/cucumber/junit/stub/StubBackend.java @@ -1,12 +1,12 @@ package io.cucumber.junit.stub; +import cucumber.api.SnippetType; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.Glue; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; import java.util.Collections; @@ -84,7 +84,7 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return singletonList("STUB SNIPPET"); } } From af2fc3407817e74bbbe32a4f7accdda96c5f0261 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 21:23:20 +0200 Subject: [PATCH 017/155] [TestNG] Make packages final and package private where possible --- .../main/java/cucumber/api/testng/TestNGCucumberRunner.java | 2 +- testng/src/test/java/io/cucumber/testng/stub/StubBackend.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java b/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java index 874bce02b3..0d41e69038 100644 --- a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java @@ -53,7 +53,7 @@ public TestNGCucumberRunner(Class clazz) { ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); BackendModuleBackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); bus = new TimeServiceEventBus(TimeService.SYSTEM); - new Plugins(classLoader, new PluginFactory(), bus, runtimeOptions); + new Plugins(new PluginFactory(), bus, runtimeOptions); FeatureLoader featureLoader = new FeatureLoader(resourceLoader); RerunFilters rerunFilters = new RerunFilters(runtimeOptions, featureLoader); filters = new Filters(runtimeOptions, rerunFilters); diff --git a/testng/src/test/java/io/cucumber/testng/stub/StubBackend.java b/testng/src/test/java/io/cucumber/testng/stub/StubBackend.java index 0855bbfde6..d07d55e939 100644 --- a/testng/src/test/java/io/cucumber/testng/stub/StubBackend.java +++ b/testng/src/test/java/io/cucumber/testng/stub/StubBackend.java @@ -1,10 +1,10 @@ package io.cucumber.runtime.stub; +import cucumber.api.SnippetType; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.Glue; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; import java.util.List; @@ -33,7 +33,7 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, FunctionNameGenerator functionNameGenerator) { + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { return singletonList("STUB SNIPPET"); } } From 9c9625752fc159a4b8cd63c3ba65946129dc6a09 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 Aug 2018 22:17:28 +0200 Subject: [PATCH 018/155] [All] Fix failing tests --- .../io/cucumber/core/runner/TestHelper.java | 83 +++++++++++------- .../io/cucumber/core/runtime/RuntimeTest.java | 85 ++++++++----------- .../core/runtime/TestFeatureSupplier.java | 30 +++++++ .../main/webapp/WEB-INF/spring/mvcContext.xml | 2 +- .../examples/spring/txn/RunCukesTest.java | 2 +- ...ickleRunnerWithNoStepDescriptionsTest.java | 14 +-- .../PickleRunnerWithStepDescriptionsTest.java | 14 +-- 7 files changed, 135 insertions(+), 95 deletions(-) create mode 100644 core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index 45c8971683..5b2496fa0c 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -6,6 +6,7 @@ import cucumber.api.Scenario; import cucumber.api.event.ConcurrentEventListener; import cucumber.api.event.EventListener; +import cucumber.api.event.TestSourceRead; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; @@ -26,6 +27,7 @@ import gherkin.pickles.PickleString; import gherkin.pickles.PickleTable; import gherkin.pickles.PickleTag; +import io.cucumber.core.runtime.TestFeatureSupplier; import io.cucumber.datatable.DataTable; import io.cucumber.core.stepexpression.TypeRegistry; import junit.framework.AssertionFailedError; @@ -76,7 +78,7 @@ public enum TimeServiceType { private TestHelper() { } - private static final class TestHelperBackendSupplier extends TestBackendSupplier { + public static final class TestHelperBackendSupplier extends TestBackendSupplier { private final List features; private final Map stepsToResult; @@ -85,7 +87,18 @@ private static final class TestHelperBackendSupplier extends TestBackendSupplier private final List hookLocations; private final List> hookActions; - private TestHelperBackendSupplier(List features, Map stepsToResult, Map stepsToLocation, List> hooks, List hookLocations, List> hookActions) { + public TestHelperBackendSupplier(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + this( + Collections.emptyList(), + Collections.emptyMap(), + Collections.emptyMap(), + Collections.>emptyList(), + Collections.emptyList(), + Collections.>emptyList() + ); + } + + public TestHelperBackendSupplier(List features, Map stepsToResult, Map stepsToLocation, List> hooks, List hookLocations, List> hookActions) { this.features = features; this.stepsToResult = stepsToResult; this.stepsToLocation = stepsToLocation; @@ -94,6 +107,17 @@ private TestHelperBackendSupplier(List features, Map features) { + this( + features, + Collections.emptyMap(), + Collections.emptyMap(), + Collections.>emptyList(), + Collections.emptyList(), + Collections.>emptyList() + ); + } + @Override public void loadGlue(Glue glue, List gluePaths) { @@ -266,47 +290,46 @@ public void run() { hookActions ); + final EventBus bus = createEventBus(); + final FeatureSupplier featureSupplier = features.isEmpty() ? null // assume feature paths passed in as args instead - : new FeatureSupplier() { - @Override - public List get() { - return features; - } - }; + : new TestFeatureSupplier(bus, features); Runtime.Builder runtimeBuilder = Runtime.builder() .withArg(args.toString()) .withClassLoader(classLoader) .withResourceLoader(resourceLoader) .withBackendSupplier(backendSupplier) - .withFeatureSupplier(featureSupplier); - - if (TimeServiceType.REAL_TIME.equals(this.timeServiceType)) { - if (formatterUnderTest instanceof Plugin) { - runtimeBuilder.withAdditionalPlugins((Plugin) formatterUnderTest); - } - } else { - EventBus bus = null; - if (TimeServiceType.FIXED_INCREMENT_ON_STEP_START.equals(this.timeServiceType)) { - final StepDurationTimeService timeService = new StepDurationTimeService(this.timeServiceIncrement); - bus = new TimeServiceEventBus(timeService); - timeService.setEventPublisher(bus); - } else if (TimeServiceType.FIXED_INCREMENT.equals(this.timeServiceType)) { - bus = new TimeServiceEventBus(new TimeServiceStub(this.timeServiceIncrement)); - } - - runtimeBuilder.withEventBus(bus); - if (formatterUnderTest instanceof ConcurrentEventListener) { - ((ConcurrentEventListener) formatterUnderTest).setEventPublisher(bus); - } else if (formatterUnderTest instanceof EventListener) { - ((EventListener) formatterUnderTest).setEventPublisher(bus); - } + .withFeatureSupplier(featureSupplier) + .withEventBus(bus); + + if (formatterUnderTest instanceof ConcurrentEventListener) { + ((ConcurrentEventListener) formatterUnderTest).setEventPublisher(bus); + } else if (formatterUnderTest instanceof EventListener) { + ((EventListener) formatterUnderTest).setEventPublisher(bus); + } else if (formatterUnderTest instanceof Plugin) { + runtimeBuilder.withAdditionalPlugins((Plugin) formatterUnderTest); } runtimeBuilder.build().run(); } + private EventBus createEventBus() { + EventBus bus = null; + + if (TimeServiceType.REAL_TIME.equals(this.timeServiceType)) { + bus = new TimeServiceEventBus(TimeService.SYSTEM); + } else if (TimeServiceType.FIXED_INCREMENT_ON_STEP_START.equals(this.timeServiceType)) { + final StepDurationTimeService timeService = new StepDurationTimeService(this.timeServiceIncrement); + bus = new TimeServiceEventBus(timeService); + timeService.setEventPublisher(bus); + } else if (TimeServiceType.FIXED_INCREMENT.equals(this.timeServiceType)) { + bus = new TimeServiceEventBus(new TimeServiceStub(this.timeServiceIncrement)); + } + return bus; + } + public static Builder builder() { return new Builder(); } diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index f51a4101e6..f264447667 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -32,7 +32,9 @@ import org.junit.rules.ExpectedException; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; +import org.mockito.stubbing.Answer; +import java.util.AbstractMap; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -79,17 +81,13 @@ public Collection get() { return singletonList(mock(Backend.class)); } }; - FeatureSupplier featureSupplier = new FeatureSupplier() { - @Override - public List get() { - return singletonList(feature); - } - }; + FeatureSupplier featureSupplier = new TestFeatureSupplier(bus, feature); Runtime.builder() .withBackendSupplier(backendSupplier) .withAdditionalPlugins(jsonFormatter) .withResourceLoader(TestClasspathResourceLoader.create(classLoader)) .withFeatureSupplier(featureSupplier) + .withEventBus(bus) .build() .run(); @@ -287,16 +285,25 @@ public void stepDefinition(StepDefinition stepDefinition) { @Test public void should_make_scenario_name_available_to_hooks() throws Throwable { - CucumberFeature feature = TestHelper.feature("path/test.feature", + final CucumberFeature feature = TestHelper.feature("path/test.feature", "Feature: feature name\n" + " Scenario: scenario name\n" + " Given first step\n" + " When second step\n" + " Then third step\n"); - HookDefinition beforeHook = mock(HookDefinition.class); + final HookDefinition beforeHook = mock(HookDefinition.class); when(beforeHook.matches(ArgumentMatchers.anyCollection())).thenReturn(true); - Runtime runtime = createRuntimeWithMockedGlue(beforeHook, HookType.Before, feature); + TestBackendSupplier testBackendSupplier = createTestBackendSupplier(feature, beforeHook); + + FeatureSupplier featureSupplier = new TestFeatureSupplier(bus, feature); + + Runtime runtime = Runtime.builder() + .withArgs() + .withBackendSupplier(testBackendSupplier) + .withFeatureSupplier(featureSupplier) + .withEventBus(bus) + .build(); runtime.run(); ArgumentCaptor capturedScenario = ArgumentCaptor.forClass(Scenario.class); @@ -304,6 +311,20 @@ public void should_make_scenario_name_available_to_hooks() throws Throwable { assertEquals("scenario name", capturedScenario.getValue().getName()); } + private TestBackendSupplier createTestBackendSupplier(final CucumberFeature feature, final HookDefinition beforeHook) { + return new TestBackendSupplier() { + @Override + public void loadGlue(Glue glue, List gluePaths) { + for (ScenarioDefinition child : feature.getGherkinFeature().getFeature().getChildren()) { + for (Step step : child.getSteps()) { + mockMatch(glue, step.getText()); + } + } + mockHook(glue, beforeHook, HookType.Before); + } + }; + } + @Test public void should_call_formatter_for_two_scenarios_with_background() { CucumberFeature feature = TestHelper.feature("path/test.feature", "" + @@ -410,18 +431,15 @@ public void should_call_formatter_with_correct_sequence_of_events_when_running_i " Scenario: scenario_3 name\n" + " Given first step\n"); - Map stepsToResult = new HashMap<>(); - stepsToResult.put("first step", result("passed")); - FormatterSpy formatterSpy = new FormatterSpy(); final List features = Arrays.asList(feature1, feature2, feature3); - TestHelper.builder() - .withFeatures(features) - .withStepsToResult(stepsToResult) - .withFormatterUnderTest(formatterSpy) - .withTimeServiceType(TestHelper.TimeServiceType.REAL_TIME) - .withRuntimeArgs("--threads", String.valueOf(features.size())) + Runtime.builder() + .withFeatureSupplier(new TestFeatureSupplier(bus, features)) + .withEventBus(bus) + .withArgs("--threads", String.valueOf(features.size())) + .withAdditionalPlugins(formatterSpy) + .withBackendSupplier(new TestHelper.TestHelperBackendSupplier(features)) .build() .run(); @@ -503,37 +521,6 @@ public Collection get() { .build(); } - private Runtime createRuntimeWithMockedGlue(final HookDefinition hook, - final HookType hookType, - final CucumberFeature feature, - String... runtimeArgs) { - TestBackendSupplier testBackendSupplier = new TestBackendSupplier() { - @Override - public void loadGlue(Glue glue, List gluePaths) { - for (ScenarioDefinition child : feature.getGherkinFeature().getFeature().getChildren()) { - for (Step step : child.getSteps()) { - mockMatch(glue, step.getText()); - } - } - mockHook(glue, hook, hookType); - } - }; - - FeatureSupplier featureSupplier = new FeatureSupplier() { - @Override - public List get() { - return singletonList(feature); - } - }; - - return Runtime.builder() - .withArgs(runtimeArgs) - .withBackendSupplier(testBackendSupplier) - .withFeatureSupplier(featureSupplier) - .build(); - - } - private void mockMatch(Glue glue, String text) { StepDefinition stepDefinition = new StubStepDefinition(text, TYPE_REGISTRY); glue.addStepDefinition(stepDefinition); diff --git a/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java new file mode 100644 index 0000000000..2cccbf088d --- /dev/null +++ b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java @@ -0,0 +1,30 @@ +package io.cucumber.core.runtime; + +import cucumber.api.event.TestSourceRead; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.runner.EventBus; + +import java.util.Arrays; +import java.util.List; + +public class TestFeatureSupplier implements FeatureSupplier { + private final EventBus bus ; + private final List features; + + public TestFeatureSupplier(EventBus bus, CucumberFeature... features) { + this(bus, Arrays.asList(features)); + } + + public TestFeatureSupplier(EventBus bus, List features) { + this.bus = bus; + this.features = features; + } + + @Override + public List get() { + for (CucumberFeature feature : features) { + bus.send(new TestSourceRead(bus.getTime(), feature.getUri(), feature.getGherkinSource())); + } + return features; + } +} diff --git a/examples/spring-txn/src/main/webapp/WEB-INF/spring/mvcContext.xml b/examples/spring-txn/src/main/webapp/WEB-INF/spring/mvcContext.xml index 987bd4c74b..94f466ea06 100644 --- a/examples/spring-txn/src/main/webapp/WEB-INF/spring/mvcContext.xml +++ b/examples/spring-txn/src/main/webapp/WEB-INF/spring/mvcContext.xml @@ -12,7 +12,7 @@ http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> - + diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java index b946fdbae9..c9b016d723 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java @@ -5,6 +5,6 @@ import org.junit.runner.RunWith; @RunWith(Cucumber.class) -@CucumberOptions(glue = {"cucumber.examples.spring.txn", "cucumber.api.spring"}) +@CucumberOptions(extraGlue = {"cucumber.api.spring"}) public class RunCukesTest { } diff --git a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java index 6839d963d6..58aaf70930 100644 --- a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java @@ -1,17 +1,17 @@ package io.cucumber.junit; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; - -import io.cucumber.core.runner.ThreadLocalRunnerSupplier; -import io.cucumber.junit.PickleRunners.PickleRunner; import gherkin.events.PickleEvent; +import io.cucumber.core.runner.RunnerSupplier; +import io.cucumber.junit.PickleRunners.PickleRunner; import org.junit.Test; import java.util.Arrays; import java.util.Collections; import java.util.List; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + public class PickleRunnerWithNoStepDescriptionsTest { @Test @@ -23,7 +23,7 @@ public void shouldUseScenarioNameWithFeatureNameAsClassNameForDisplayName() thro PickleRunner runner = PickleRunners.withNoStepDescriptions( "feature name", - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickles.get(0), createJUnitOptions() ); @@ -40,7 +40,7 @@ public void shouldConvertTextFromFeatureFileForNamesWithFilenameCompatibleNameOp PickleRunner runner = PickleRunners.withNoStepDescriptions( "feature name", - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickles.get(0), createJUnitOptions("--filename-compatible-names") ); diff --git a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java index 7a33893416..e5551d9487 100644 --- a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java @@ -5,7 +5,7 @@ import static org.mockito.Mockito.mock; import io.cucumber.core.model.FeatureCompiler; -import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.core.runner.RunnerSupplier; import io.cucumber.junit.PickleRunners.PickleRunner; import io.cucumber.junit.PickleRunners.WithStepDescriptions; import io.cucumber.core.model.CucumberFeature; @@ -44,7 +44,7 @@ public void shouldAssignUnequalDescriptionsToDifferentOccurrencesOfSameStepInASc }; WithStepDescriptions runner = (WithStepDescriptions) PickleRunners.withStepDescriptions( - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickleEvents.get(0), createJUnitOptions() ); @@ -82,7 +82,7 @@ public void shouldAssignUnequalDescriptionsToDifferentStepsInAScenarioOutline() }; WithStepDescriptions runner = (WithStepDescriptions) PickleRunners.withStepDescriptions( - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickleEvents.get(0), createJUnitOptions() ); @@ -110,7 +110,7 @@ public void shouldIncludeScenarioNameAsClassNameInStepDescriptions() throws Exce FeatureCompiler compiler = new FeatureCompiler(); List pickleEvents = compiler.compileFeature(features); PickleRunner runner = PickleRunners.withStepDescriptions( - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickleEvents.get(0), createJUnitOptions() ); @@ -133,7 +133,7 @@ public void shouldUseScenarioNameForDisplayName() throws Exception { " Then it works\n"); PickleRunner runner = PickleRunners.withStepDescriptions( - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickles.get(0), createJUnitOptions() ); @@ -149,7 +149,7 @@ public void shouldUseStepKeyworkAndNameForChildName() throws Exception { " Then it works\n"); PickleRunner runner = PickleRunners.withStepDescriptions( - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickleEvents.get(0), createJUnitOptions() ); @@ -165,7 +165,7 @@ public void shouldConvertTextFromFeatureFileForNamesWithFilenameCompatibleNameOp " Then it works\n"); PickleRunner runner = PickleRunners.withStepDescriptions( - mock(ThreadLocalRunnerSupplier.class), + mock(RunnerSupplier.class), pickles.get(0), createJunitOptions("--filename-compatible-names") ); From ca3a4a3eff3a1570aa8b3b57d479def8ad53d7d9 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sat, 1 Sep 2018 00:10:14 +0200 Subject: [PATCH 019/155] [Core] Don't write tests results to source dir --- .../java/io/cucumber/core/options/RuntimeOptionsTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index 9f78ace44e..dd77a0d30d 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -79,7 +79,7 @@ public void assigns_glue() { @Test public void creates_html_formatter() { - RuntimeOptions options = new RuntimeOptions(asList("--plugin", "html:some/dir", "--glue", "somewhere")); + RuntimeOptions options = new RuntimeOptions(asList("--plugin", "html:target/cucumber-reports", "--glue", "somewhere")); Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); assertEquals("io.cucumber.core.plugin.HTMLFormatter", plugins.getPlugins().get(0).getClass().getName()); } @@ -286,7 +286,7 @@ public void clobbers_line_filters_from_cli_if_features_specified_in_cucumber_opt public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--plugin pretty"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:some/dir", "--glue", "somewhere")); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:target/cucumber-reports", "--glue", "somewhere")); Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.PrettyFormatter"); assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.HTMLFormatter"); @@ -296,7 +296,7 @@ public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucum public void adds_to_formatter_plugins_with_add_plugin_option() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--add-plugin pretty"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:some/dir", "--glue", "somewhere")); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:target/cucumber-reports", "--glue", "somewhere")); Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.HTMLFormatter"); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.PrettyFormatter"); From c2debf34615543424cef92e5ac0e66874c3c0cfe Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sat, 1 Sep 2018 00:54:30 +0200 Subject: [PATCH 020/155] Fix javadoc --- .../cucumber/guice/impl/SequentialScenarioScope.java | 8 ++++---- pom.xml | 11 +++-------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/guice/src/main/java/io/cucumber/guice/impl/SequentialScenarioScope.java b/guice/src/main/java/io/cucumber/guice/impl/SequentialScenarioScope.java index 828497a916..727db60919 100644 --- a/guice/src/main/java/io/cucumber/guice/impl/SequentialScenarioScope.java +++ b/guice/src/main/java/io/cucumber/guice/impl/SequentialScenarioScope.java @@ -14,8 +14,8 @@ public class SequentialScenarioScope implements ScenarioScope { * Scopes a provider. The returned provider returns objects from this scope. * If an object does not exist in this scope, the provider can use the given * unscoped provider to retrieve one. - *

    - *

    Scope implementations are strongly encouraged to override + *

    + * Scope implementations are strongly encouraged to override * {@link Object#toString} in the returned provider and include the backing * provider's {@code toString()} output. * @@ -23,8 +23,8 @@ public class SequentialScenarioScope implements ScenarioScope { * @param unscoped locates an instance when one doesn't already exist in this * scope. * @return a new provider which only delegates to the given unscoped provider - * when an instance of the requested object doesn't already exist in this - * scope + * when an instance of the requested object doesn't already exist in this + * scope */ @Override public Provider scope(final Key key, final Provider unscoped) { diff --git a/pom.xml b/pom.xml index fe770218b9..cb8a25bc67 100644 --- a/pom.xml +++ b/pom.xml @@ -683,8 +683,7 @@ 3.0.0-M1 false - cucumber.runtime,cucumber.runtime.*,org.springframework - + io.cucumber.*,org.springframework http://docs.oracle.com/javase/7/docs/api/ http://junit.sourceforge.net/javadoc/ @@ -810,17 +809,13 @@ true - cucumber\.runner\..* - cucumber\.runtime\..* - cucumber\.util\..* + io\.cucumber..* true - cucumber\.runner\..* - cucumber\.runtime\..* - cucumber\.util\..* + io\.cucumber\..* org\.springframework\.core\..* From c2cd0be118ad52d884750757872479d5099356a4 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sat, 1 Sep 2018 09:31:14 +0200 Subject: [PATCH 021/155] [All] Extract event package --- .../cucumber/core/{runner => event}/AbstractEventBus.java | 4 ++-- .../core/{runner => event}/AbstractEventPublisher.java | 4 ++-- .../java/io/cucumber/core/{runner => event}/EventBus.java | 2 +- .../{runner => plugin}/CanonicalOrderEventPublisher.java | 5 +++-- core/src/main/java/io/cucumber/core/plugin/Plugins.java | 1 - .../java/io/cucumber/core/runner/PickleStepTestStep.java | 1 + core/src/main/java/io/cucumber/core/runner/Runner.java | 3 ++- .../main/java/io/cucumber/core/runner/RunnerSupplier.java | 5 ----- core/src/main/java/io/cucumber/core/runner/Scenario.java | 1 + .../io/cucumber/core/runner/SingletonRunnerSupplier.java | 2 ++ core/src/main/java/io/cucumber/core/runner/TestCase.java | 1 + core/src/main/java/io/cucumber/core/runner/TestStep.java | 1 + .../java/io/cucumber/core/runner/TimeServiceEventBus.java | 2 ++ .../cucumber/core/runtime/FeaturePathFeatureSupplier.java | 2 +- .../main/java/io/cucumber/core/runtime/RunnerSupplier.java | 7 +++++++ core/src/main/java/io/cucumber/core/runtime/Runtime.java | 4 +--- .../{runner => runtime}/ThreadLocalRunnerSupplier.java | 5 ++++- .../java/io/cucumber/core/plugin/JSONFormatterTest.java | 2 +- .../java/io/cucumber/core/plugin/PluginFactoryTest.java | 2 +- .../io/cucumber/core/plugin/UndefinedStepsTrackerTest.java | 2 +- .../test/java/io/cucumber/core/runner/EventBusTest.java | 1 + .../test/java/io/cucumber/core/runner/HookOrderTest.java | 1 + core/src/test/java/io/cucumber/core/runner/HookTest.java | 1 + .../java/io/cucumber/core/runner/HookTestStepTest.java | 1 + .../io/cucumber/core/runner/PickleStepTestStepTest.java | 1 + core/src/test/java/io/cucumber/core/runner/RunnerTest.java | 1 + .../java/io/cucumber/core/runner/ScenarioResultTest.java | 1 + .../test/java/io/cucumber/core/runner/ScenarioTest.java | 1 + .../cucumber/core/runner/SingletonRunnerSupplierTest.java | 1 + .../test/java/io/cucumber/core/runner/TestCaseTest.java | 1 + core/src/test/java/io/cucumber/core/runner/TestHelper.java | 2 +- .../java/io/cucumber/core/runner/TestRunnerSupplier.java | 2 ++ .../test/java/io/cucumber/core/runtime/ExitStatusTest.java | 2 +- .../test/java/io/cucumber/core/runtime/RuntimeTest.java | 4 +--- .../java/io/cucumber/core/runtime/TestFeatureSupplier.java | 2 +- .../core/runtime/ThreadLocalRunnerSupplierTest.java | 3 +-- .../test/java/io/cucumber/java/JavaStepDefinitionTest.java | 4 ++-- junit/src/main/java/cucumber/api/junit/Cucumber.java | 4 ++-- junit/src/main/java/io/cucumber/junit/FeatureRunner.java | 2 +- junit/src/main/java/io/cucumber/junit/JUnitReporter.java | 2 +- junit/src/main/java/io/cucumber/junit/PickleRunners.java | 2 +- .../src/test/java/io/cucumber/junit/FeatureRunnerTest.java | 5 ++--- .../src/test/java/io/cucumber/junit/JUnitReporterTest.java | 2 +- .../junit/PickleRunnerWithNoStepDescriptionsTest.java | 2 +- .../junit/PickleRunnerWithStepDescriptionsTest.java | 2 +- .../java/cucumber/api/testng/TestCaseResultListener.java | 2 +- .../java/cucumber/api/testng/TestNGCucumberRunner.java | 4 ++-- .../cucumber/api/testng/TestCaseResultListenerTest.java | 2 +- 48 files changed, 67 insertions(+), 47 deletions(-) rename core/src/main/java/io/cucumber/core/{runner => event}/AbstractEventBus.java (64%) rename core/src/main/java/io/cucumber/core/{runner => event}/AbstractEventPublisher.java (94%) rename core/src/main/java/io/cucumber/core/{runner => event}/EventBus.java (87%) rename core/src/main/java/io/cucumber/core/{runner => plugin}/CanonicalOrderEventPublisher.java (74%) delete mode 100644 core/src/main/java/io/cucumber/core/runner/RunnerSupplier.java create mode 100644 core/src/main/java/io/cucumber/core/runtime/RunnerSupplier.java rename core/src/main/java/io/cucumber/core/{runner => runtime}/ThreadLocalRunnerSupplier.java (95%) diff --git a/core/src/main/java/io/cucumber/core/runner/AbstractEventBus.java b/core/src/main/java/io/cucumber/core/event/AbstractEventBus.java similarity index 64% rename from core/src/main/java/io/cucumber/core/runner/AbstractEventBus.java rename to core/src/main/java/io/cucumber/core/event/AbstractEventBus.java index afbebaae1b..4f8f873d31 100644 --- a/core/src/main/java/io/cucumber/core/runner/AbstractEventBus.java +++ b/core/src/main/java/io/cucumber/core/event/AbstractEventBus.java @@ -1,8 +1,8 @@ -package io.cucumber.core.runner; +package io.cucumber.core.event; import cucumber.api.event.Event; -abstract class AbstractEventBus extends AbstractEventPublisher implements EventBus { +public abstract class AbstractEventBus extends AbstractEventPublisher implements EventBus { @Override public void send(Event event) { diff --git a/core/src/main/java/io/cucumber/core/runner/AbstractEventPublisher.java b/core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java similarity index 94% rename from core/src/main/java/io/cucumber/core/runner/AbstractEventPublisher.java rename to core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java index 0fb4d4a955..33c2298987 100644 --- a/core/src/main/java/io/cucumber/core/runner/AbstractEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java @@ -1,4 +1,4 @@ -package io.cucumber.core.runner; +package io.cucumber.core.event; import cucumber.api.event.Event; import cucumber.api.event.EventHandler; @@ -9,7 +9,7 @@ import java.util.List; import java.util.Map; -abstract class AbstractEventPublisher implements EventPublisher { +public abstract class AbstractEventPublisher implements EventPublisher { protected Map, List> handlers = new HashMap, List>(); @Override diff --git a/core/src/main/java/io/cucumber/core/runner/EventBus.java b/core/src/main/java/io/cucumber/core/event/EventBus.java similarity index 87% rename from core/src/main/java/io/cucumber/core/runner/EventBus.java rename to core/src/main/java/io/cucumber/core/event/EventBus.java index de322fec94..d7dc1a1446 100644 --- a/core/src/main/java/io/cucumber/core/runner/EventBus.java +++ b/core/src/main/java/io/cucumber/core/event/EventBus.java @@ -1,4 +1,4 @@ -package io.cucumber.core.runner; +package io.cucumber.core.event; import cucumber.api.event.Event; import cucumber.api.event.EventPublisher; diff --git a/core/src/main/java/io/cucumber/core/runner/CanonicalOrderEventPublisher.java b/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java similarity index 74% rename from core/src/main/java/io/cucumber/core/runner/CanonicalOrderEventPublisher.java rename to core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java index a8ff152324..6f2ba52d30 100644 --- a/core/src/main/java/io/cucumber/core/runner/CanonicalOrderEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java @@ -1,13 +1,14 @@ -package io.cucumber.core.runner; +package io.cucumber.core.plugin; import cucumber.api.event.Event; import cucumber.api.event.TestRunFinished; +import io.cucumber.core.event.AbstractEventPublisher; import java.util.Collections; import java.util.LinkedList; import java.util.List; -public final class CanonicalOrderEventPublisher extends AbstractEventPublisher { +final class CanonicalOrderEventPublisher extends AbstractEventPublisher { private final List queue = new LinkedList<>(); diff --git a/core/src/main/java/io/cucumber/core/plugin/Plugins.java b/core/src/main/java/io/cucumber/core/plugin/Plugins.java index ffa7392b2e..429615b4d3 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Plugins.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugins.java @@ -10,7 +10,6 @@ import cucumber.api.formatter.ColorAware; import cucumber.api.formatter.StrictAware; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.runner.CanonicalOrderEventPublisher; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java index 906aa7a671..5d4cfe0a92 100644 --- a/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java @@ -2,6 +2,7 @@ import cucumber.api.TestCase; import gherkin.pickles.PickleStep; +import io.cucumber.core.event.EventBus; import java.util.Collections; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index 04c34f7c76..b6e52bdbc4 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -5,6 +5,7 @@ import cucumber.api.event.SnippetsSuggestedEvent; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.Backend; +import io.cucumber.core.event.EventBus; import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; @@ -20,7 +21,7 @@ public final class Runner { private final Collection backends; private final RuntimeOptions runtimeOptions; - Runner(EventBus bus, Collection backends, RuntimeOptions runtimeOptions) { + public Runner(EventBus bus, Collection backends, RuntimeOptions runtimeOptions) { this.bus = bus; this.runtimeOptions = runtimeOptions; this.backends = backends; diff --git a/core/src/main/java/io/cucumber/core/runner/RunnerSupplier.java b/core/src/main/java/io/cucumber/core/runner/RunnerSupplier.java deleted file mode 100644 index b5138ce078..0000000000 --- a/core/src/main/java/io/cucumber/core/runner/RunnerSupplier.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.cucumber.core.runner; - -public interface RunnerSupplier { - Runner get(); -} diff --git a/core/src/main/java/io/cucumber/core/runner/Scenario.java b/core/src/main/java/io/cucumber/core/runner/Scenario.java index 82dc5502cd..a0ff46dbb9 100644 --- a/core/src/main/java/io/cucumber/core/runner/Scenario.java +++ b/core/src/main/java/io/cucumber/core/runner/Scenario.java @@ -4,6 +4,7 @@ import cucumber.api.event.EmbedEvent; import cucumber.api.event.WriteEvent; import gherkin.pickles.PickleTag; +import io.cucumber.core.event.EventBus; import java.util.ArrayList; import java.util.Collection; diff --git a/core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java index bbc9aa6116..6c4448f372 100644 --- a/core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java @@ -1,7 +1,9 @@ package io.cucumber.core.runner; import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.event.EventBus; import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runtime.RunnerSupplier; /** * Returns a single unique runner. diff --git a/core/src/main/java/io/cucumber/core/runner/TestCase.java b/core/src/main/java/io/cucumber/core/runner/TestCase.java index 0902da35c6..5e02dc2785 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestCase.java +++ b/core/src/main/java/io/cucumber/core/runner/TestCase.java @@ -7,6 +7,7 @@ import gherkin.events.PickleEvent; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleTag; +import io.cucumber.core.event.EventBus; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/runner/TestStep.java b/core/src/main/java/io/cucumber/core/runner/TestStep.java index 05c882d5d5..7d33f08cb4 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/TestStep.java @@ -6,6 +6,7 @@ import cucumber.api.event.TestStepFinished; import cucumber.api.event.TestStepStarted; import io.cucumber.core.backend.StepDefinitionMatch; +import io.cucumber.core.event.EventBus; import java.util.Arrays; diff --git a/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java b/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java index 64e57cf011..2ee9cc95c2 100644 --- a/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java +++ b/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java @@ -1,5 +1,7 @@ package io.cucumber.core.runner; +import io.cucumber.core.event.AbstractEventBus; + public final class TimeServiceEventBus extends AbstractEventBus { private final TimeService stopWatch; diff --git a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java index 1ca5c2731c..2bbd89b19d 100644 --- a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java @@ -4,7 +4,7 @@ import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.model.FeatureLoader; import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/runtime/RunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/RunnerSupplier.java new file mode 100644 index 0000000000..df4dbb69e3 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runtime/RunnerSupplier.java @@ -0,0 +1,7 @@ +package io.cucumber.core.runtime; + +import io.cucumber.core.runner.Runner; + +public interface RunnerSupplier { + Runner get(); +} diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 4e50c33046..307cd410dd 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -11,12 +11,10 @@ import cucumber.api.event.TestRunStarted; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.RunnerSupplier; import io.cucumber.core.runner.SingletonRunnerSupplier; -import io.cucumber.core.runner.ThreadLocalRunnerSupplier; import io.cucumber.core.filter.Filters; import io.cucumber.core.filter.RerunFilters; import io.cucumber.core.plugin.PluginFactory; diff --git a/core/src/main/java/io/cucumber/core/runner/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java similarity index 95% rename from core/src/main/java/io/cucumber/core/runner/ThreadLocalRunnerSupplier.java rename to core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java index 29cf1b514a..9bfc4d7eda 100644 --- a/core/src/main/java/io/cucumber/core/runner/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java @@ -1,9 +1,12 @@ -package io.cucumber.core.runner; +package io.cucumber.core.runtime; import cucumber.api.event.Event; import cucumber.api.event.EventHandler; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.event.AbstractEventBus; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.runner.Runner; /** * Creates a distinct runner for each calling thread. Each runner has its own bus, backend- and glue-suppliers. diff --git a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java index 1bc379acdf..61aaaf9abf 100755 --- a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java @@ -4,7 +4,7 @@ import cucumber.api.SnippetType; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.TestClasspathResourceLoader; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.backend.Glue; import io.cucumber.core.runner.TestBackendSupplier; import io.cucumber.core.runner.TestHelper; diff --git a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java index fd26a7f37f..2d9568d95d 100644 --- a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java @@ -4,7 +4,7 @@ import cucumber.api.Result; import cucumber.api.TestCase; import cucumber.api.event.TestStepFinished; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.runner.TimeServiceStub; import io.cucumber.core.exception.CucumberException; diff --git a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java index c0467cb6d2..0f8f4fc491 100644 --- a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java @@ -3,7 +3,7 @@ import cucumber.api.event.TestSourceRead; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeServiceStub; import io.cucumber.core.model.CucumberFeature; import gherkin.pickles.PickleLocation; diff --git a/core/src/test/java/io/cucumber/core/runner/EventBusTest.java b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java index 0fd29825e3..3c9c641933 100644 --- a/core/src/test/java/io/cucumber/core/runner/EventBusTest.java +++ b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java @@ -6,6 +6,7 @@ import cucumber.api.event.EventHandler; import cucumber.api.event.TestStepFinished; import cucumber.api.event.TestStepStarted; +import io.cucumber.core.event.EventBus; import org.junit.Test; import static org.mockito.Mockito.mock; diff --git a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java index 09904f73ba..0f4f573746 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java @@ -3,6 +3,7 @@ import cucumber.api.Scenario; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.event.EventBus; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.StubStepDefinition; import gherkin.events.PickleEvent; diff --git a/core/src/test/java/io/cucumber/core/runner/HookTest.java b/core/src/test/java/io/cucumber/core/runner/HookTest.java index 2dae2c5312..db99dfe50e 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTest.java @@ -4,6 +4,7 @@ import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.Backend; +import io.cucumber.core.event.EventBus; import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import gherkin.pickles.Argument; diff --git a/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java index 825d3a9797..044c5f70f3 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java @@ -6,6 +6,7 @@ import cucumber.api.event.TestStepStarted; import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; +import io.cucumber.core.event.EventBus; import org.junit.Test; import org.mockito.InOrder; diff --git a/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java index a72d3a922d..519c2ca6b3 100644 --- a/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java @@ -8,6 +8,7 @@ import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; +import io.cucumber.core.event.EventBus; import org.junit.AssumptionViolatedException; import org.junit.Test; import org.mockito.ArgumentCaptor; diff --git a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java index deecfeec75..57225283c9 100644 --- a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -6,6 +6,7 @@ import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.backend.Backend; +import io.cucumber.core.event.EventBus; import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; diff --git a/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java index 2e1f4ecf85..65fcf8efe7 100644 --- a/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java @@ -4,6 +4,7 @@ import cucumber.api.event.EmbedEvent; import cucumber.api.event.WriteEvent; import gherkin.events.PickleEvent; +import io.cucumber.core.event.EventBus; import org.junit.Test; import org.mockito.ArgumentMatcher; diff --git a/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java index 16e6475059..3a6f738500 100644 --- a/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java @@ -5,6 +5,7 @@ import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; +import io.cucumber.core.event.EventBus; import org.junit.Test; import java.util.Collections; diff --git a/core/src/test/java/io/cucumber/core/runner/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runner/SingletonRunnerSupplierTest.java index c7cf5f8644..a94a647299 100644 --- a/core/src/test/java/io/cucumber/core/runner/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runner/SingletonRunnerSupplierTest.java @@ -1,6 +1,7 @@ package io.cucumber.core.runner; +import io.cucumber.core.event.EventBus; import io.cucumber.core.runtime.BackendModuleBackendSupplier; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.options.RuntimeOptions; diff --git a/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java index 244af946d0..f2f1d8ca8e 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java +++ b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java @@ -8,6 +8,7 @@ import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; +import io.cucumber.core.event.EventBus; import org.junit.Test; import org.mockito.InOrder; diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index 5b2496fa0c..d5a9c5d238 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -6,11 +6,11 @@ import cucumber.api.Scenario; import cucumber.api.event.ConcurrentEventListener; import cucumber.api.event.EventListener; -import cucumber.api.event.TestSourceRead; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.event.EventBus; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.TestClasspathResourceLoader; import io.cucumber.core.runtime.FeatureSupplier; diff --git a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java index 575d333e1a..d097b26b4c 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java @@ -3,9 +3,11 @@ import cucumber.api.SnippetType; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.Backend; +import io.cucumber.core.event.EventBus; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.options.RuntimeOptions; import gherkin.pickles.PickleStep; +import io.cucumber.core.runtime.RunnerSupplier; import io.cucumber.core.stepexpression.TypeRegistry; import java.util.Collections; diff --git a/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java index e58a945555..63c993a4af 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java @@ -4,7 +4,7 @@ import cucumber.api.Result; import cucumber.api.TestCase; import cucumber.api.event.TestCaseFinished; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.options.RuntimeOptions; diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index f264447667..e5cbbcad09 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -10,7 +10,7 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.io.TestClasspathResourceLoader; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; @@ -32,9 +32,7 @@ import org.junit.rules.ExpectedException; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; -import org.mockito.stubbing.Answer; -import java.util.AbstractMap; import java.util.Arrays; import java.util.Collection; import java.util.Collections; diff --git a/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java index 2cccbf088d..3fb8271f98 100644 --- a/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java +++ b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java @@ -2,7 +2,7 @@ import cucumber.api.event.TestSourceRead; import io.cucumber.core.model.CucumberFeature; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import java.util.Arrays; import java.util.List; diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 8f61d65e3b..29b7cbf0d3 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -3,11 +3,10 @@ import cucumber.api.event.EventHandler; import cucumber.api.event.TestCaseStarted; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.Runner; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.ThreadLocalRunnerSupplier; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 87064fa06e..d7180199df 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -6,7 +6,7 @@ import cucumber.api.java.ObjectFactory; import cucumber.api.java.en.Given; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.Runner; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.AmbiguousStepDefinitionsException; @@ -14,7 +14,7 @@ import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.backend.DuplicateStepDefinitionException; import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; diff --git a/junit/src/main/java/cucumber/api/junit/Cucumber.java b/junit/src/main/java/cucumber/api/junit/Cucumber.java index 3a3d16a0d2..6c5c02aee9 100644 --- a/junit/src/main/java/cucumber/api/junit/Cucumber.java +++ b/junit/src/main/java/cucumber/api/junit/Cucumber.java @@ -7,7 +7,7 @@ import io.cucumber.junit.Assertions; import io.cucumber.junit.FeatureRunner; import io.cucumber.junit.JUnitOptions; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runtime.BackendModuleBackendSupplier; import io.cucumber.core.backend.BackendSupplier; @@ -19,7 +19,7 @@ import io.cucumber.core.filter.RerunFilters; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.model.FeatureLoader; -import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.options.RuntimeOptionsFactory; import io.cucumber.core.io.MultiLoader; diff --git a/junit/src/main/java/io/cucumber/junit/FeatureRunner.java b/junit/src/main/java/io/cucumber/junit/FeatureRunner.java index 4e3b8c77a1..d7be98e2ae 100644 --- a/junit/src/main/java/io/cucumber/junit/FeatureRunner.java +++ b/junit/src/main/java/io/cucumber/junit/FeatureRunner.java @@ -7,7 +7,7 @@ import io.cucumber.junit.PickleRunners.PickleRunner; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.model.FeatureCompiler; -import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import org.junit.runner.Description; import org.junit.runner.notification.RunNotifier; import org.junit.runners.ParentRunner; diff --git a/junit/src/main/java/io/cucumber/junit/JUnitReporter.java b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java index 87db029adc..436e838004 100644 --- a/junit/src/main/java/io/cucumber/junit/JUnitReporter.java +++ b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java @@ -8,7 +8,7 @@ import cucumber.api.event.TestStepFinished; import cucumber.api.event.TestStepStarted; import io.cucumber.junit.PickleRunners.PickleRunner; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import org.junit.runner.Description; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; diff --git a/junit/src/main/java/io/cucumber/junit/PickleRunners.java b/junit/src/main/java/io/cucumber/junit/PickleRunners.java index 351d216293..c1a43c1417 100644 --- a/junit/src/main/java/io/cucumber/junit/PickleRunners.java +++ b/junit/src/main/java/io/cucumber/junit/PickleRunners.java @@ -1,7 +1,7 @@ package io.cucumber.junit; import io.cucumber.core.runner.Runner; -import io.cucumber.core.runner.RunnerSupplier; +import io.cucumber.core.runtime.RunnerSupplier; import gherkin.events.PickleEvent; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index f2dae5c79a..05884dae30 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -3,12 +3,12 @@ import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeService; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import io.cucumber.core.filter.Filters; import io.cucumber.core.filter.RerunFilters; import io.cucumber.core.model.CucumberFeature; @@ -21,7 +21,6 @@ import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.HashSet; import java.util.Set; diff --git a/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java index 028e6be609..8db02bb75f 100644 --- a/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java +++ b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java @@ -3,7 +3,7 @@ import cucumber.api.PendingException; import cucumber.api.Result; import cucumber.api.PickleStepTestStep; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.junit.JUnitReporter.EachTestNotifier; import io.cucumber.junit.JUnitReporter.NoTestNotifier; import io.cucumber.junit.PickleRunners.PickleRunner; diff --git a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java index 58aaf70930..0e5c60d208 100644 --- a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java @@ -1,7 +1,7 @@ package io.cucumber.junit; import gherkin.events.PickleEvent; -import io.cucumber.core.runner.RunnerSupplier; +import io.cucumber.core.runtime.RunnerSupplier; import io.cucumber.junit.PickleRunners.PickleRunner; import org.junit.Test; diff --git a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java index e5551d9487..d3d81464f0 100644 --- a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java @@ -5,7 +5,7 @@ import static org.mockito.Mockito.mock; import io.cucumber.core.model.FeatureCompiler; -import io.cucumber.core.runner.RunnerSupplier; +import io.cucumber.core.runtime.RunnerSupplier; import io.cucumber.junit.PickleRunners.PickleRunner; import io.cucumber.junit.PickleRunners.WithStepDescriptions; import io.cucumber.core.model.CucumberFeature; diff --git a/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java b/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java index 940be07045..2640e93df9 100644 --- a/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java +++ b/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java @@ -3,7 +3,7 @@ import cucumber.api.Result; import cucumber.api.event.EventHandler; import cucumber.api.event.TestCaseFinished; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.exception.CucumberException; import org.testng.SkipException; diff --git a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java b/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java index 0d41e69038..2690f520bb 100644 --- a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java @@ -4,7 +4,7 @@ import cucumber.api.event.TestRunStarted; import io.cucumber.core.runner.Runner; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runtime.BackendModuleBackendSupplier; import io.cucumber.core.io.ClassFinder; @@ -15,7 +15,7 @@ import io.cucumber.core.filter.RerunFilters; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.model.FeatureLoader; -import io.cucumber.core.runner.ThreadLocalRunnerSupplier; +import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.options.RuntimeOptionsFactory; import io.cucumber.core.io.MultiLoader; diff --git a/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java b/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java index 470bc161fd..63efcb3ae6 100644 --- a/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java +++ b/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java @@ -2,7 +2,7 @@ import cucumber.api.PendingException; import cucumber.api.Result; -import io.cucumber.core.runner.EventBus; +import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import org.testng.SkipException; From 43733a38a782aa1553fda0b4dfca288913fb9fd0 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sat, 1 Sep 2018 09:36:04 +0200 Subject: [PATCH 022/155] [Core] Move singleton runner supplier to runtime --- core/src/main/java/io/cucumber/core/runtime/Runtime.java | 1 - .../core/{runner => runtime}/SingletonRunnerSupplier.java | 3 ++- .../{runner => runtime}/SingletonRunnerSupplierTest.java | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) rename core/src/main/java/io/cucumber/core/{runner => runtime}/SingletonRunnerSupplier.java (93%) rename core/src/test/java/io/cucumber/core/{runner => runtime}/SingletonRunnerSupplierTest.java (89%) diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 307cd410dd..b41d6bff96 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -14,7 +14,6 @@ import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.SingletonRunnerSupplier; import io.cucumber.core.filter.Filters; import io.cucumber.core.filter.RerunFilters; import io.cucumber.core.plugin.PluginFactory; diff --git a/core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java similarity index 93% rename from core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java rename to core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java index 6c4448f372..06702545d3 100644 --- a/core/src/main/java/io/cucumber/core/runner/SingletonRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java @@ -1,8 +1,9 @@ -package io.cucumber.core.runner; +package io.cucumber.core.runtime; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.event.EventBus; import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runner.Runner; import io.cucumber.core.runtime.RunnerSupplier; /** diff --git a/core/src/test/java/io/cucumber/core/runner/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java similarity index 89% rename from core/src/test/java/io/cucumber/core/runner/SingletonRunnerSupplierTest.java rename to core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java index a94a647299..1d4ba995ba 100644 --- a/core/src/test/java/io/cucumber/core/runner/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java @@ -1,13 +1,16 @@ -package io.cucumber.core.runner; +package io.cucumber.core.runtime; import io.cucumber.core.event.EventBus; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.runtime.BackendModuleBackendSupplier; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.runtime.SingletonRunnerSupplier; import org.junit.Before; import org.junit.Test; From dd533121498051051ca9ce2bd283ac78c67a0b38 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sat, 1 Sep 2018 10:36:59 +0200 Subject: [PATCH 023/155] [JUnit] Add test for Assertions --- .../java/io/cucumber/junit/Assertions.java | 3 +- .../io/cucumber/junit/AssertionsTest.java | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 junit/src/test/java/io/cucumber/junit/AssertionsTest.java diff --git a/junit/src/main/java/io/cucumber/junit/Assertions.java b/junit/src/main/java/io/cucumber/junit/Assertions.java index 36824bac86..f12bae79ba 100644 --- a/junit/src/main/java/io/cucumber/junit/Assertions.java +++ b/junit/src/main/java/io/cucumber/junit/Assertions.java @@ -12,7 +12,8 @@ private Assertions() { public static void assertNoCucumberAnnotatedMethods(Class clazz) { for (Method method : clazz.getDeclaredMethods()) { for (Annotation annotation : method.getAnnotations()) { - if (annotation.annotationType().getName().startsWith("cucumber")) { + if (annotation.annotationType().getName().startsWith("cucumber") //TODO: Remove once migrated + || annotation.annotationType().getName().startsWith("io.cucumber")) { throw new CucumberException( "\n\n" + "Classes annotated with @RunWith(Cucumber.class) must not define any\n" + diff --git a/junit/src/test/java/io/cucumber/junit/AssertionsTest.java b/junit/src/test/java/io/cucumber/junit/AssertionsTest.java new file mode 100644 index 0000000000..63d4bceeba --- /dev/null +++ b/junit/src/test/java/io/cucumber/junit/AssertionsTest.java @@ -0,0 +1,33 @@ +package io.cucumber.junit; + +import cucumber.api.junit.Cucumber; +import io.cucumber.core.exception.CucumberException; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +public class AssertionsTest { + + + @Test(expected = CucumberException.class) + public void should_throw_cucumber_exception_when_annotated() { + Assertions.assertNoCucumberAnnotatedMethods(WithCucumberMethod.class); + } + + + @RunWith(Cucumber.class) + public final static class WithCucumberMethod { + + @StubCucumberAnnotation + public void before() { + + } + + } + @Retention(RetentionPolicy.RUNTIME) + @interface StubCucumberAnnotation { + } + +} \ No newline at end of file From 436bc8d9b63e6332bb62af0824f7f24e26a51f2c Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sat, 1 Sep 2018 12:49:58 +0200 Subject: [PATCH 024/155] [Core] Remove Ansi escape utilities from Api --- .../formatter => io/cucumber/core/plugin}/AnsiEscapes.java | 4 ++-- core/src/main/java/io/cucumber/core/plugin/AnsiFormats.java | 2 -- core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java | 1 - core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java | 1 - .../formatter => io/cucumber/core/plugin}/NiceAppendable.java | 4 ++-- .../main/java/io/cucumber/core/plugin/PrettyFormatter.java | 1 - .../main/java/io/cucumber/core/plugin/ProgressFormatter.java | 2 -- .../src/main/java/io/cucumber/core/plugin/RerunFormatter.java | 1 - .../main/java/io/cucumber/core/plugin/TimelineFormatter.java | 1 - .../src/main/java/io/cucumber/core/plugin/UsageFormatter.java | 1 - .../test/java/io/cucumber/core/plugin/HTMLFormatterTest.java | 1 - .../java/io/cucumber/core/plugin/PrettyFormatterTest.java | 1 - core/src/test/java/io/cucumber/core/plugin/StatsTest.java | 1 - 13 files changed, 4 insertions(+), 17 deletions(-) rename core/src/main/java/{cucumber/api/formatter => io/cucumber/core/plugin}/AnsiEscapes.java (95%) rename core/src/main/java/{cucumber/api/formatter => io/cucumber/core/plugin}/NiceAppendable.java (96%) diff --git a/core/src/main/java/cucumber/api/formatter/AnsiEscapes.java b/core/src/main/java/io/cucumber/core/plugin/AnsiEscapes.java similarity index 95% rename from core/src/main/java/cucumber/api/formatter/AnsiEscapes.java rename to core/src/main/java/io/cucumber/core/plugin/AnsiEscapes.java index 70362f5528..b4db85d6b8 100644 --- a/core/src/main/java/cucumber/api/formatter/AnsiEscapes.java +++ b/core/src/main/java/io/cucumber/core/plugin/AnsiEscapes.java @@ -1,6 +1,6 @@ -package cucumber.api.formatter; +package io.cucumber.core.plugin; -public final class AnsiEscapes { +final class AnsiEscapes { private static final char ESC = 27; private static final char BRACKET = '['; diff --git a/core/src/main/java/io/cucumber/core/plugin/AnsiFormats.java b/core/src/main/java/io/cucumber/core/plugin/AnsiFormats.java index 3deb971c8b..167c1e6109 100644 --- a/core/src/main/java/io/cucumber/core/plugin/AnsiFormats.java +++ b/core/src/main/java/io/cucumber/core/plugin/AnsiFormats.java @@ -1,7 +1,5 @@ package io.cucumber.core.plugin; -import cucumber.api.formatter.AnsiEscapes; - import java.util.HashMap; import java.util.Map; diff --git a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index 64f760c552..f8ca9c7b01 100644 --- a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -14,7 +14,6 @@ import cucumber.api.event.TestStepFinished; import cucumber.api.event.TestStepStarted; import cucumber.api.event.WriteEvent; -import cucumber.api.formatter.NiceAppendable; import io.cucumber.core.exception.CucumberException; import gherkin.ast.Background; import gherkin.ast.DataTable; diff --git a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java index dfa18180ac..05e775eb3a 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java @@ -16,7 +16,6 @@ import cucumber.api.event.TestStepFinished; import cucumber.api.event.TestStepStarted; import cucumber.api.event.WriteEvent; -import cucumber.api.formatter.NiceAppendable; import gherkin.ast.Background; import gherkin.ast.DocString; import gherkin.ast.Feature; diff --git a/core/src/main/java/cucumber/api/formatter/NiceAppendable.java b/core/src/main/java/io/cucumber/core/plugin/NiceAppendable.java similarity index 96% rename from core/src/main/java/cucumber/api/formatter/NiceAppendable.java rename to core/src/main/java/io/cucumber/core/plugin/NiceAppendable.java index 418885148a..0ce67ba67a 100644 --- a/core/src/main/java/cucumber/api/formatter/NiceAppendable.java +++ b/core/src/main/java/io/cucumber/core/plugin/NiceAppendable.java @@ -1,4 +1,4 @@ -package cucumber.api.formatter; +package io.cucumber.core.plugin; import java.io.Closeable; import java.io.Flushable; @@ -7,7 +7,7 @@ /** * A nice appendable that doesn't throw checked exceptions */ -public final class NiceAppendable { +final class NiceAppendable { private static final CharSequence NL = "\n"; private final Appendable out; diff --git a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java index c08db46750..edc6d3993e 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java @@ -15,7 +15,6 @@ import cucumber.api.event.TestStepStarted; import cucumber.api.event.WriteEvent; import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.NiceAppendable; import io.cucumber.core.util.FixJava; import io.cucumber.core.util.Mapper; import gherkin.ast.Background; diff --git a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java index f5665977be..f00bc67b6a 100644 --- a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java @@ -8,9 +8,7 @@ import cucumber.api.event.TestRunFinished; import cucumber.api.event.TestStepFinished; import cucumber.api.event.WriteEvent; -import cucumber.api.formatter.AnsiEscapes; import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.NiceAppendable; import java.util.HashMap; import java.util.Map; diff --git a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java index dedcc3e770..3b35282e14 100644 --- a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java @@ -6,7 +6,6 @@ import cucumber.api.event.EventPublisher; import cucumber.api.event.TestCaseFinished; import cucumber.api.event.TestRunFinished; -import cucumber.api.formatter.NiceAppendable; import cucumber.api.formatter.StrictAware; import java.util.ArrayList; diff --git a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index 1bc9c59ec4..1964e53a11 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -9,7 +9,6 @@ import cucumber.api.event.TestCaseStarted; import cucumber.api.event.TestRunFinished; import cucumber.api.event.TestSourceRead; -import cucumber.api.formatter.NiceAppendable; import io.cucumber.core.exception.CucumberException; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; diff --git a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java index ff9c91c5b0..aa98f668c4 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java @@ -8,7 +8,6 @@ import cucumber.api.event.EventPublisher; import cucumber.api.event.TestRunFinished; import cucumber.api.event.TestStepFinished; -import cucumber.api.formatter.NiceAppendable; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; diff --git a/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java index b9566593df..a8799b89db 100644 --- a/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java @@ -1,7 +1,6 @@ package io.cucumber.core.plugin; import cucumber.api.Result; -import cucumber.api.formatter.NiceAppendable; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.util.FixJava; diff --git a/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java index d7befc99d3..b5ad8b6730 100755 --- a/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java @@ -2,7 +2,6 @@ import cucumber.api.Result; import io.cucumber.core.stepexpression.TypeRegistry; -import cucumber.api.formatter.AnsiEscapes; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.stepexpression.StepExpression; diff --git a/core/src/test/java/io/cucumber/core/plugin/StatsTest.java b/core/src/test/java/io/cucumber/core/plugin/StatsTest.java index 96b221d6e8..cc7e5cec08 100755 --- a/core/src/test/java/io/cucumber/core/plugin/StatsTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/StatsTest.java @@ -6,7 +6,6 @@ import static org.hamcrest.CoreMatchers.startsWith; import cucumber.api.Result; -import cucumber.api.formatter.AnsiEscapes; import java.io.ByteArrayOutputStream; import java.io.PrintStream; From b0206da95afec578b24197e9c3a272d881cc20e6 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sun, 2 Sep 2018 02:31:19 +0200 Subject: [PATCH 025/155] Bump pom version to 5.0.0-SNAPSHOT --- continuous-deployment/pom.xml | 2 +- core/pom.xml | 2 +- examples/java-calculator-testng/pom.xml | 2 +- examples/java-calculator/pom.xml | 2 +- examples/java-wicket/java-wicket-main/pom.xml | 2 +- examples/java-wicket/java-wicket-test/pom.xml | 2 +- examples/java-wicket/pom.xml | 2 +- examples/java8-calculator/pom.xml | 2 +- examples/pom.xml | 2 +- examples/spring-txn/pom.xml | 2 +- guice/pom.xml | 2 +- java/pom.xml | 2 +- java8/pom.xml | 2 +- junit/pom.xml | 2 +- kotlin-java8/pom.xml | 2 +- needle/pom.xml | 2 +- openejb/pom.xml | 2 +- picocontainer/pom.xml | 2 +- pom.xml | 2 +- spring/pom.xml | 2 +- testng/pom.xml | 2 +- weld/pom.xml | 2 +- 22 files changed, 22 insertions(+), 22 deletions(-) diff --git a/continuous-deployment/pom.xml b/continuous-deployment/pom.xml index 790a5fa6c4..409ea71397 100644 --- a/continuous-deployment/pom.xml +++ b/continuous-deployment/pom.xml @@ -3,7 +3,7 @@ cucumber-jvm io.cucumber - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT 4.0.0 continuous-deployment diff --git a/core/pom.xml b/core/pom.xml index 4158c1ae05..c754d3cd4e 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-core diff --git a/examples/java-calculator-testng/pom.xml b/examples/java-calculator-testng/pom.xml index 4f90d52f4a..e30abb09d6 100644 --- a/examples/java-calculator-testng/pom.xml +++ b/examples/java-calculator-testng/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT java-calculator-testng diff --git a/examples/java-calculator/pom.xml b/examples/java-calculator/pom.xml index 7fa9509589..ad5de1d448 100644 --- a/examples/java-calculator/pom.xml +++ b/examples/java-calculator/pom.xml @@ -5,7 +5,7 @@ io.cucumber cucumber-examples - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT java-calculator diff --git a/examples/java-wicket/java-wicket-main/pom.xml b/examples/java-wicket/java-wicket-main/pom.xml index f057ab0921..7cb2916c06 100644 --- a/examples/java-wicket/java-wicket-main/pom.xml +++ b/examples/java-wicket/java-wicket-main/pom.xml @@ -3,7 +3,7 @@ io.cucumber java-wicket - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT java-wicket-main Examples: Wicket application diff --git a/examples/java-wicket/java-wicket-test/pom.xml b/examples/java-wicket/java-wicket-test/pom.xml index 2e19d52514..415925b6c3 100644 --- a/examples/java-wicket/java-wicket-test/pom.xml +++ b/examples/java-wicket/java-wicket-test/pom.xml @@ -3,7 +3,7 @@ io.cucumber java-wicket - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT java-wicket-test Examples: Wicket application tested with Selenium diff --git a/examples/java-wicket/pom.xml b/examples/java-wicket/pom.xml index 4bc9a6d539..202600c6a4 100644 --- a/examples/java-wicket/pom.xml +++ b/examples/java-wicket/pom.xml @@ -3,7 +3,7 @@ io.cucumber cucumber-examples - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT java-wicket pom diff --git a/examples/java8-calculator/pom.xml b/examples/java8-calculator/pom.xml index 9183e9e758..357fdaeea0 100644 --- a/examples/java8-calculator/pom.xml +++ b/examples/java8-calculator/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT java8-calculator diff --git a/examples/pom.xml b/examples/pom.xml index e4dad3985e..971b1bf0bb 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-examples diff --git a/examples/spring-txn/pom.xml b/examples/spring-txn/pom.xml index 96eaad84ce..88cb8fca33 100644 --- a/examples/spring-txn/pom.xml +++ b/examples/spring-txn/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT spring-txn diff --git a/guice/pom.xml b/guice/pom.xml index bbbea35c9f..599e10e3db 100644 --- a/guice/pom.xml +++ b/guice/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-guice diff --git a/java/pom.xml b/java/pom.xml index e3cbaaeed6..446292b7c1 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-java diff --git a/java8/pom.xml b/java8/pom.xml index ce678477b4..78062ecb46 100644 --- a/java8/pom.xml +++ b/java8/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-java8 diff --git a/junit/pom.xml b/junit/pom.xml index 5cac88f9c7..a7e09ee78b 100644 --- a/junit/pom.xml +++ b/junit/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-junit diff --git a/kotlin-java8/pom.xml b/kotlin-java8/pom.xml index 401889555c..05ac66dc4e 100644 --- a/kotlin-java8/pom.xml +++ b/kotlin-java8/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-kotlin-java8 diff --git a/needle/pom.xml b/needle/pom.xml index 15d2598257..2bfd609c77 100644 --- a/needle/pom.xml +++ b/needle/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-needle diff --git a/openejb/pom.xml b/openejb/pom.xml index 7653bc8b8a..e53f4da639 100644 --- a/openejb/pom.xml +++ b/openejb/pom.xml @@ -6,7 +6,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-openejb diff --git a/picocontainer/pom.xml b/picocontainer/pom.xml index 4c77682bf6..82d9a93933 100644 --- a/picocontainer/pom.xml +++ b/picocontainer/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-picocontainer diff --git a/pom.xml b/pom.xml index fe770218b9..20c6231543 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT pom Cucumber-JVM Cucumber for the JVM diff --git a/spring/pom.xml b/spring/pom.xml index e63cc2ac41..af6677a5f3 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-spring diff --git a/testng/pom.xml b/testng/pom.xml index dce89a22fb..69addfb302 100644 --- a/testng/pom.xml +++ b/testng/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-testng diff --git a/weld/pom.xml b/weld/pom.xml index 7c563d1be5..9b393ff763 100644 --- a/weld/pom.xml +++ b/weld/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.0-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-weld From 8d74147bef17d7c1866d4c095ea09aec50c1b114 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sun, 2 Sep 2018 02:53:03 +0200 Subject: [PATCH 026/155] Upgrade to Java 8 Fixes #1447 --- examples/java-calculator-testng/pom.xml | 14 -------------- examples/java-calculator/pom.xml | 8 -------- examples/java8-calculator/pom.xml | 16 ---------------- pom.xml | 4 ++-- 4 files changed, 2 insertions(+), 40 deletions(-) diff --git a/examples/java-calculator-testng/pom.xml b/examples/java-calculator-testng/pom.xml index e30abb09d6..85040c9d62 100644 --- a/examples/java-calculator-testng/pom.xml +++ b/examples/java-calculator-testng/pom.xml @@ -23,18 +23,4 @@ test - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - diff --git a/examples/java-calculator/pom.xml b/examples/java-calculator/pom.xml index ad5de1d448..e33484b0b8 100644 --- a/examples/java-calculator/pom.xml +++ b/examples/java-calculator/pom.xml @@ -39,14 +39,6 @@ 4 - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - diff --git a/examples/java8-calculator/pom.xml b/examples/java8-calculator/pom.xml index 357fdaeea0..50083f5bc4 100644 --- a/examples/java8-calculator/pom.xml +++ b/examples/java8-calculator/pom.xml @@ -28,20 +28,4 @@ test - - - - - org.apache.maven.plugins - maven-compiler-plugin - - true - UTF-8 - 1.8 - 1.8 - -XDignore.symbol.file=true - - - - diff --git a/pom.xml b/pom.xml index 9a042848f0..bf4ebc94b0 100644 --- a/pom.xml +++ b/pom.xml @@ -665,8 +665,8 @@ 3.6.2 UTF-8 - 1.7 - 1.7 + 1.8 + 1.8 -Werror From bafa0d51a62cc7f60faaf2e0154e838de8515c31 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Mon, 3 Sep 2018 18:09:11 +0200 Subject: [PATCH 027/155] [All] Bump dependencies --- pom.xml | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index bf4ebc94b0..f133dcfef9 100644 --- a/pom.xml +++ b/pom.xml @@ -44,27 +44,24 @@ 2.15 4.3.10.RELEASE 1.11.6.RELEASE - - 5.1.1.Final - + 5.3.6.Final 2.4.1 4.2.0 1.11.3 6.14.3 4.12 1.3 - 3.11.0 + 3.11.1 2.21.0 - 3.12.0 - 2.30.1 + 3.14.0 + 2.32.1 0.4.15 0.3.0 2.4.4.Final - - 1.2 + 2.0 4.7.5 2.2 - 7.0 + 8.0 1 2.3.0 2.7 @@ -72,13 +69,9 @@ 1.2.3 1.7.25 2.3.28 - - 3.1.0 - - 7.0.0 - - 8.1.12.v20130726 + 4.0.1 + 8.0.0 + 9.4.12.v20180830 1.6 1.1.1 0.5.0 @@ -791,7 +784,7 @@ org.revapi revapi-java - 0.17.0 + 0.18.0 From 512fbfed2c34fa022fe5f1cb76bcd5086c05d379 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sat, 8 Sep 2018 17:58:36 +0200 Subject: [PATCH 028/155] [Core] Remove dependency from plugin to options --- .../cucumber/core/options/PluginOption.java | 113 ++++++++++++++++++ .../cucumber/core/options/RuntimeOptions.java | 103 ++++++++-------- .../core/plugin/DefaultSummaryPrinter.java | 2 +- .../cucumber/core/plugin/HTMLFormatter.java | 3 +- .../cucumber/core/plugin/JSONFormatter.java | 2 +- .../cucumber/core/plugin/JUnitFormatter.java | 3 +- .../core/plugin/NullSummaryPrinter.java | 2 +- .../java/io/cucumber/core/plugin/Options.java | 15 ++- .../cucumber/core/plugin/PluginFactory.java | 92 +------------- .../java/io/cucumber/core/plugin/Plugins.java | 12 +- .../cucumber/core/plugin/PrettyFormatter.java | 2 +- .../core/plugin/ProgressFormatter.java | 2 +- .../cucumber/core/plugin/RerunFormatter.java | 2 +- .../cucumber/core/plugin/TestNGFormatter.java | 2 +- .../core/plugin/TimelineFormatter.java | 2 +- .../cucumber/core/plugin/UsageFormatter.java | 2 +- .../core/options/TestPluginOption.java | 10 ++ .../core/plugin/PluginFactoryTest.java | 43 +++---- 18 files changed, 224 insertions(+), 188 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/options/PluginOption.java create mode 100644 core/src/test/java/io/cucumber/core/options/TestPluginOption.java diff --git a/core/src/main/java/io/cucumber/core/options/PluginOption.java b/core/src/main/java/io/cucumber/core/options/PluginOption.java new file mode 100644 index 0000000000..0b90e027a5 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/options/PluginOption.java @@ -0,0 +1,113 @@ +package io.cucumber.core.options; + +import cucumber.api.Plugin; +import cucumber.api.StepDefinitionReporter; +import cucumber.api.SummaryPrinter; +import cucumber.api.event.ConcurrentEventListener; +import cucumber.api.event.EventListener; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.plugin.DefaultSummaryPrinter; +import io.cucumber.core.plugin.HTMLFormatter; +import io.cucumber.core.plugin.JSONFormatter; +import io.cucumber.core.plugin.JUnitFormatter; +import io.cucumber.core.plugin.NullSummaryPrinter; +import io.cucumber.core.plugin.Options; +import io.cucumber.core.plugin.PrettyFormatter; +import io.cucumber.core.plugin.ProgressFormatter; +import io.cucumber.core.plugin.RerunFormatter; +import io.cucumber.core.plugin.TestNGFormatter; +import io.cucumber.core.plugin.TimelineFormatter; +import io.cucumber.core.plugin.UsageFormatter; + +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class PluginOption implements Options.Plugin { + + private static final Pattern PLUGIN_WITH_ARGUMENT_PATTERN = Pattern.compile("([^:]+):(.*)"); + private static final HashMap> PLUGIN_CLASSES = new HashMap>() {{ + put("junit", JUnitFormatter.class); + put("testng", TestNGFormatter.class); + put("html", HTMLFormatter.class); + put("pretty", PrettyFormatter.class); + put("progress", ProgressFormatter.class); + put("json", JSONFormatter.class); + put("usage", UsageFormatter.class); + put("rerun", RerunFormatter.class); + put("default_summary", DefaultSummaryPrinter.class); + put("null_summary", NullSummaryPrinter.class); + put("timeline", TimelineFormatter.class); + }}; + + private final String pluginString; + private final Class pluginClass; + private final String argument; + + private PluginOption(String pluginString, Class pluginClass, String argument) { + this.pluginString = pluginString; + this.pluginClass = pluginClass; + this.argument = argument; + } + + @Override + public Class pluginClass() { + return pluginClass; + } + + @Override + public String argument() { + return argument; + } + + @Override + public String pluginString() { + return pluginString; + } + + boolean isFormatter() { + return EventListener.class.isAssignableFrom(pluginClass) || ConcurrentEventListener.class.isAssignableFrom(pluginClass); + } + + boolean isStepDefinitionReporter() { + return StepDefinitionReporter.class.isAssignableFrom(pluginClass); + } + + boolean isSummaryPrinter() { + return SummaryPrinter.class.isAssignableFrom(pluginClass); + } + + static PluginOption parse(String pluginArgumentPattern) { + Matcher pluginWithFile = PLUGIN_WITH_ARGUMENT_PATTERN.matcher(pluginArgumentPattern); + if (!pluginWithFile.matches()) { + return new PluginOption(pluginArgumentPattern, parsePluginName(pluginArgumentPattern), null); + } + + Class pluginClass = parsePluginName(pluginWithFile.group(1)); + return new PluginOption(pluginArgumentPattern, pluginClass, pluginWithFile.group(2)); + } + + private static Class parsePluginName(String pluginName) { + Class pluginClass = PLUGIN_CLASSES.get(pluginName); + if (pluginClass == null) { + pluginClass = loadClass(pluginName); + } + return pluginClass; + } + + @SuppressWarnings("unchecked") + private static Class loadClass(String className) { + try { + Class aClass = Thread.currentThread().getContextClassLoader().loadClass(className); + + if (Plugin.class.isAssignableFrom(aClass)) { + return (Class) aClass; + } + throw new CucumberException("Couldn't load plugin class: " + className + ". It does not implement " + Plugin.class.getName()); + } catch (ClassNotFoundException e) { + throw new CucumberException("Couldn't load plugin class: " + className, e); + } + } + + +} diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index d63ba3f506..cae79f1634 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -4,7 +4,6 @@ import io.cucumber.core.exception.CucumberException; import io.cucumber.core.plugin.Options; import io.cucumber.datatable.DataTable; -import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.model.PathWithLines; import io.cucumber.core.util.FixJava; import io.cucumber.core.util.Mapper; @@ -59,10 +58,9 @@ public String map(String keyword) { private SnippetType snippetType = SnippetType.UNDERSCORE; private int threads = 1; - private final List pluginFormatterNames = new ArrayList(); - private final List pluginStepDefinitionReporterNames = new ArrayList(); - private final List pluginSummaryPrinterNames = new ArrayList(); - + private final List formatters = new ArrayList<>(); + private final List stepDefinitionReporters = new ArrayList<>(); + private final List summaryPrinters = new ArrayList<>(); /** * Create a new instance from a string of options, for example: @@ -95,11 +93,11 @@ public RuntimeOptions(List argv) { parse(ShellWords.parse(cucumberOptionsFromEnv)); } - if (pluginFormatterNames.isEmpty()) { - pluginFormatterNames.add("progress"); + if (formatters.isEmpty()) { + formatters.add(PluginOption.parse("progress")); } - if (pluginSummaryPrinterNames.isEmpty()) { - pluginSummaryPrinterNames.add("default_summary"); + if (summaryPrinters.isEmpty()) { + summaryPrinters.add(PluginOption.parse("default_summary")); } } @@ -108,20 +106,17 @@ public boolean isMultiThreaded() { } public RuntimeOptions noSummaryPrinter() { - pluginSummaryPrinterNames.clear(); + summaryPrinters.clear(); return this; } - public List getPluginFormatterNames() { - return pluginFormatterNames; - } - - public List getPluginSummaryPrinterNames() { - return pluginSummaryPrinterNames; - } - - public List getPluginStepDefinitionReporterNames() { - return pluginStepDefinitionReporterNames; + @Override + public List plugins() { + List plugins = new ArrayList<>(); + plugins.addAll(formatters); + plugins.addAll(stepDefinitionReporters); + plugins.addAll(summaryPrinters); + return plugins; } private void parse(List args) { @@ -211,9 +206,9 @@ private void parse(List args) { junitOptions.addAll(parsedJunitOptions); } - parsedPluginData.updatePluginFormatterNames(pluginFormatterNames); - parsedPluginData.updatePluginStepDefinitionReporterNames(pluginStepDefinitionReporterNames); - parsedPluginData.updatePluginSummaryPrinterNames(pluginSummaryPrinterNames); + parsedPluginData.updateFormatters(formatters); + parsedPluginData.updateStepDefinitionReporters(stepDefinitionReporters); + parsedPluginData.updateSummaryPrinters(summaryPrinters); } private void addLineFilters(Map> parsedLineFilters, String key, List lines) { @@ -349,55 +344,55 @@ public int getThreads() { return threads; } - class ParsedPluginData { - ParsedOptionNames formatterNames = new ParsedOptionNames(); - ParsedOptionNames stepDefinitionReporterNames = new ParsedOptionNames(); - ParsedOptionNames summaryPrinterNames = new ParsedOptionNames(); + static final class ParsedPluginData { + private ParsedPlugins formatters = new ParsedPlugins(); + private ParsedPlugins stepDefinitionReporters = new ParsedPlugins(); + private ParsedPlugins summaryPrinters = new ParsedPlugins(); void addPluginName(String name, boolean isAddPlugin) { - if (PluginFactory.isStepDefinitionReporterName(name)) { - stepDefinitionReporterNames.addName(name, isAddPlugin); - } else if (PluginFactory.isSummaryPrinterName(name)) { - summaryPrinterNames.addName(name, isAddPlugin); - } else if (PluginFactory.isFormatterName(name)) { - formatterNames.addName(name, isAddPlugin); + PluginOption pluginOption = PluginOption.parse(name); + if (pluginOption.isStepDefinitionReporter()) { + stepDefinitionReporters.addName(pluginOption, isAddPlugin); + } else if (pluginOption.isSummaryPrinter()) { + summaryPrinters.addName(pluginOption, isAddPlugin); + } else if (pluginOption.isFormatter()) { + formatters.addName(pluginOption, isAddPlugin); } else { throw new CucumberException("Unrecognized plugin: " + name); } } - void updatePluginFormatterNames(List pluginFormatterNames) { - formatterNames.updateNameList(pluginFormatterNames); + void updateFormatters(List formatter) { + this.formatters.updateNameList(formatter); } - void updatePluginStepDefinitionReporterNames(List pluginStepDefinitionReporterNames) { - stepDefinitionReporterNames.updateNameList(pluginStepDefinitionReporterNames); + void updateStepDefinitionReporters(List stepDefintionReporter) { + stepDefinitionReporters.updateNameList(stepDefintionReporter); } - void updatePluginSummaryPrinterNames(List pluginSummaryPrinterNames) { - summaryPrinterNames.updateNameList(pluginSummaryPrinterNames); + void updateSummaryPrinters(List pluginSummaryPrinterNames) { + summaryPrinters.updateNameList(pluginSummaryPrinterNames); } - } - class ParsedOptionNames { - private List names = new ArrayList(); - private boolean clobber = false; + private static class ParsedPlugins { + private List names = new ArrayList<>(); + private boolean clobber = false; - public void addName(String name, boolean isAddOption) { - names.add(name); - if (!isAddOption) { - clobber = true; + void addName(Plugin name, boolean isAddOption) { + names.add(name); + if (!isAddOption) { + clobber = true; + } } - } - public void updateNameList(List nameList) { - if (!names.isEmpty()) { - if (clobber) { - nameList.clear(); + void updateNameList(List nameList) { + if (!names.isEmpty()) { + if (clobber) { + nameList.clear(); + } + nameList.addAll(names); } - nameList.addAll(names); } } } - } diff --git a/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java index 7f293fd06c..e856e285f6 100644 --- a/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java @@ -11,7 +11,7 @@ import java.io.PrintStream; import java.util.List; -final class DefaultSummaryPrinter implements SummaryPrinter, ColorAware, StrictAware, EventListener { +public final class DefaultSummaryPrinter implements SummaryPrinter, ColorAware, StrictAware, EventListener { private final Stats stats = new Stats(); private final UndefinedStepsTracker undefinedStepsTracker = new UndefinedStepsTracker(); diff --git a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index f8ca9c7b01..860b65f0d9 100644 --- a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -48,7 +48,7 @@ import java.util.List; import java.util.Map; -final class HTMLFormatter implements EventListener { +public final class HTMLFormatter implements EventListener { private static final Gson gson = new GsonBuilder().setPrettyPrinting().create(); private static final String JS_FORMATTER_VAR = "formatter"; private static final String JS_REPORT_FILENAME = "report.js"; @@ -118,6 +118,7 @@ public void receive(TestRunFinished event) { } }; + @SuppressWarnings("WeakerAccess") // Used by PluginFactory public HTMLFormatter(URL htmlReportDir) { this(htmlReportDir, createJsOut(htmlReportDir)); } diff --git a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java index 05e775eb3a..472a79548f 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java @@ -36,7 +36,7 @@ import java.util.List; import java.util.Map; -final class JSONFormatter implements EventListener { +public final class JSONFormatter implements EventListener { private String currentFeatureFile; private List> featureMaps = new ArrayList>(); private List> currentElementsList; diff --git a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java index 0c3e2bcbe6..a233ce31a7 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java @@ -36,7 +36,7 @@ import java.util.List; import java.util.Locale; -final class JUnitFormatter implements EventListener, StrictAware { +public final class JUnitFormatter implements EventListener, StrictAware { private final Writer out; private final Document doc; private final Element rootElement; @@ -75,6 +75,7 @@ public void receive(TestRunFinished event) { } }; + @SuppressWarnings("WeakerAccess") // Used by PluginFactory public JUnitFormatter(URL out) throws IOException { this.out = new UTF8OutputStreamWriter(new URLOutputStream(out)); TestCase.treatConditionallySkippedAsFailure = false; diff --git a/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java index 8d93626e33..6d739fb823 100644 --- a/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java @@ -2,7 +2,7 @@ import cucumber.api.SummaryPrinter; -final class NullSummaryPrinter implements SummaryPrinter { +public final class NullSummaryPrinter implements SummaryPrinter { @SuppressWarnings("WeakerAccess") // Used by PluginFactory public NullSummaryPrinter(){ diff --git a/core/src/main/java/io/cucumber/core/plugin/Options.java b/core/src/main/java/io/cucumber/core/plugin/Options.java index d71b40c66f..35c7b73156 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Options.java +++ b/core/src/main/java/io/cucumber/core/plugin/Options.java @@ -3,13 +3,18 @@ import java.util.List; public interface Options { - List getPluginFormatterNames(); - - List getPluginStepDefinitionReporterNames(); - - List getPluginSummaryPrinterNames(); + Iterable plugins(); boolean isMonochrome(); boolean isStrict(); + + interface Plugin { + + Class pluginClass(); + + String argument(); + + String pluginString(); + } } diff --git a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java index df61a8de6c..d2c0ec2777 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java +++ b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java @@ -1,11 +1,8 @@ package io.cucumber.core.plugin; import cucumber.api.Plugin; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.SummaryPrinter; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.EventListener; import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.options.PluginOption; import java.io.File; import java.io.IOException; @@ -16,9 +13,6 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; -import java.util.HashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import static java.util.Arrays.asList; @@ -34,20 +28,6 @@ public final class PluginFactory { private final Class[] CTOR_PARAMETERS = new Class[]{String.class, Appendable.class, URI.class, URL.class, File.class}; - private static final HashMap> PLUGIN_CLASSES = new HashMap>() {{ - put("junit", JUnitFormatter.class); - put("testng", TestNGFormatter.class); - put("html", HTMLFormatter.class); - put("pretty", PrettyFormatter.class); - put("progress", ProgressFormatter.class); - put("json", JSONFormatter.class); - put("usage", UsageFormatter.class); - put("rerun", RerunFormatter.class); - put("default_summary", DefaultSummaryPrinter.class); - put("null_summary", NullSummaryPrinter.class); - put("timeline", TimelineFormatter.class); - }}; - private static final Pattern PLUGIN_WITH_ARGUMENT_PATTERN = Pattern.compile("([^:]+):(.*)"); private String defaultOutFormatter = null; private Appendable defaultOut = new PrintStream(System.out) { @@ -72,23 +52,10 @@ static URL toURL(String pathOrUrl) { } } - public Plugin create(String pluginString) { - Matcher pluginWithArgument = PLUGIN_WITH_ARGUMENT_PATTERN.matcher(pluginString); - String pluginName; - String argument; - if (pluginWithArgument.matches()) { - pluginName = pluginWithArgument.group(1); - argument = pluginWithArgument.group(2); - } else { - pluginName = pluginString; - argument = null; - } - Class pluginClass = pluginClass(pluginName); + public Plugin create(Options.Plugin plugin) { try { - return instantiate(pluginString, pluginClass, argument); - } catch (IOException e) { - throw new CucumberException(e); - } catch (URISyntaxException e) { + return instantiate(plugin.pluginString(), plugin.pluginClass(), plugin.argument()); + } catch (IOException | URISyntaxException e) { throw new CucumberException(e); } } @@ -114,9 +81,7 @@ private T instantiate(String pluginString, Class pluginCla private T newInstance(Constructor constructor, Object... ctorArgs) { try { return constructor.newInstance(ctorArgs); - } catch (InstantiationException e) { - throw new CucumberException(e); - } catch (IllegalAccessException e) { + } catch (InstantiationException | IllegalAccessException e) { throw new CucumberException(e); } catch (InvocationTargetException e) { throw new CucumberException(e.getTargetException()); @@ -172,28 +137,6 @@ private Constructor findEmptyConstructor(Class pluginClass) { } } - private static Class pluginClass(String pluginName) { - Class pluginClass = PLUGIN_CLASSES.get(pluginName); - if (pluginClass == null) { - pluginClass = loadClass(pluginName); - } - return pluginClass; - } - - @SuppressWarnings("unchecked") - private static Class loadClass(String className) { - try { - Class aClass = Thread.currentThread().getContextClassLoader().loadClass(className); - - if (Plugin.class.isAssignableFrom(aClass)) { - return (Class) aClass; - } - throw new CucumberException("Couldn't load plugin class: " + className + ". It does not implement " + Plugin.class.getName()); - } catch (ClassNotFoundException e) { - throw new CucumberException("Couldn't load plugin class: " + className, e); - } - } - private Appendable defaultOutOrFailIfAlreadyUsed(String formatterString) { try { if (defaultOut != null) { @@ -209,29 +152,4 @@ private Appendable defaultOutOrFailIfAlreadyUsed(String formatterString) { } } - public static boolean isFormatterName(String name) { - Class pluginClass = getPluginClass(name); - return EventListener.class.isAssignableFrom(pluginClass) || ConcurrentEventListener.class.isAssignableFrom(pluginClass); - } - - public static boolean isStepDefinitionReporterName(String name) { - Class pluginClass = getPluginClass(name); - return StepDefinitionReporter.class.isAssignableFrom(pluginClass); - } - - public static boolean isSummaryPrinterName(String name) { - Class pluginClass = getPluginClass(name); - return SummaryPrinter.class.isAssignableFrom(pluginClass); - } - - private static Class getPluginClass(String name) { - Matcher pluginWithFile = PLUGIN_WITH_ARGUMENT_PATTERN.matcher(name); - String pluginName; - if (pluginWithFile.matches()) { - pluginName = pluginWithFile.group(1); - } else { - pluginName = name; - } - return pluginClass(pluginName); - } } diff --git a/core/src/main/java/io/cucumber/core/plugin/Plugins.java b/core/src/main/java/io/cucumber/core/plugin/Plugins.java index 429615b4d3..62918028b0 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Plugins.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugins.java @@ -45,16 +45,8 @@ public void receive(Event event) { private List createPlugins() { List plugins = new ArrayList(); if (!pluginNamesInstantiated) { - for (String pluginName : options.getPluginFormatterNames()) { - Plugin plugin = pluginFactory.create(pluginName); - addPlugin(plugins, plugin); - } - for (String pluginName : options.getPluginStepDefinitionReporterNames()) { - Plugin plugin = pluginFactory.create(pluginName); - addPlugin(plugins, plugin); - } - for (String pluginName : options.getPluginSummaryPrinterNames()) { - Plugin plugin = pluginFactory.create(pluginName); + for (Options.Plugin pluginOption : options.plugins()) { + Plugin plugin = pluginFactory.create(pluginOption); addPlugin(plugins, plugin); } pluginNamesInstantiated = true; diff --git a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java index edc6d3993e..7eb8e5afdb 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java @@ -28,7 +28,7 @@ import java.util.List; -final class PrettyFormatter implements ConcurrentEventListener, ColorAware { +public final class PrettyFormatter implements ConcurrentEventListener, ColorAware { private static final String SCENARIO_INDENT = " "; private static final String STEP_INDENT = " "; private static final String EXAMPLES_INDENT = " "; diff --git a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java index f00bc67b6a..02e49e74ec 100644 --- a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java @@ -13,7 +13,7 @@ import java.util.HashMap; import java.util.Map; -final class ProgressFormatter implements ConcurrentEventListener, ColorAware { +public final class ProgressFormatter implements ConcurrentEventListener, ColorAware { private static final Map CHARS = new HashMap() {{ put(Result.Type.PASSED, '.'); put(Result.Type.UNDEFINED, 'U'); diff --git a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java index 3b35282e14..b07c8bed39 100644 --- a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java @@ -18,7 +18,7 @@ * Formatter for reporting all failed test cases and print their locations * Failed means: results that make the exit code non-zero. */ -final class RerunFormatter implements EventListener, StrictAware { +public final class RerunFormatter implements EventListener, StrictAware { private final NiceAppendable out; private Map> featureAndFailedLinesMapping = new HashMap>(); private boolean isStrict = false; diff --git a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java index d7a2853835..f08841c238 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java @@ -38,7 +38,7 @@ import java.util.Date; import java.util.List; -final class TestNGFormatter implements EventListener, StrictAware { +public final class TestNGFormatter implements EventListener, StrictAware { private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); private final Writer writer; diff --git a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index 1964e53a11..598196578b 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -30,7 +30,7 @@ import static java.util.concurrent.TimeUnit.NANOSECONDS; -final class TimelineFormatter implements ConcurrentEventListener { +public final class TimelineFormatter implements ConcurrentEventListener { //TODO: if accepted then should move resources out into own project as per HTML report private static final String[] TEXT_ASSETS = new String[]{ diff --git a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java index aa98f668c4..c1d385fbe7 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java @@ -22,7 +22,7 @@ * Formatter to measure performance of steps. Aggregated results for all steps can be computed * by adding {@link UsageStatisticStrategy} to the usageFormatter */ -final class UsageFormatter implements Plugin, EventListener { +public final class UsageFormatter implements Plugin, EventListener { private static final BigDecimal NANOS_PER_SECOND = BigDecimal.valueOf(1000000000); final Map> usageMap = new HashMap>(); private final Map statisticStrategies = new HashMap(); diff --git a/core/src/test/java/io/cucumber/core/options/TestPluginOption.java b/core/src/test/java/io/cucumber/core/options/TestPluginOption.java new file mode 100644 index 0000000000..357fc77cbb --- /dev/null +++ b/core/src/test/java/io/cucumber/core/options/TestPluginOption.java @@ -0,0 +1,10 @@ +package io.cucumber.core.options; + + +public class TestPluginOption { + + public static PluginOption parse(String pluginArgumentPattern){ + return PluginOption.parse(pluginArgumentPattern); + } + +} \ No newline at end of file diff --git a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java index 2d9568d95d..0895797bcf 100644 --- a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java @@ -5,9 +5,9 @@ import cucumber.api.TestCase; import cucumber.api.event.TestStepFinished; import io.cucumber.core.event.EventBus; +import io.cucumber.core.exception.CucumberException; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.runner.TimeServiceStub; -import io.cucumber.core.exception.CucumberException; import org.junit.Test; import java.io.ByteArrayOutputStream; @@ -20,6 +20,7 @@ import java.net.URISyntaxException; import java.net.URL; +import static io.cucumber.core.options.TestPluginOption.parse; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; @@ -33,20 +34,20 @@ public class PluginFactoryTest { @Test public void instantiates_junit_plugin_with_file_arg() throws IOException { - Object plugin = fc.create("junit:" + File.createTempFile("cucumber", "xml")); + Object plugin = fc.create(parse("junit:" + File.createTempFile("cucumber", "xml"))); assertEquals(JUnitFormatter.class, plugin.getClass()); } @Test public void instantiates_html_plugin_with_dir_arg() throws IOException { - Object plugin = fc.create("html:" + TempDir.createTempDirectory().getAbsolutePath()); + Object plugin = fc.create(parse("html:" + TempDir.createTempDirectory().getAbsolutePath())); assertEquals(HTMLFormatter.class, plugin.getClass()); } @Test public void fails_to_instantiate_html_plugin_without_dir_arg() throws IOException { try { - fc.create("html"); + fc.create(parse("html")); fail(); } catch (CucumberException e) { assertEquals("You must supply an output argument to html. Like so: html:output", e.getMessage()); @@ -55,25 +56,25 @@ public void fails_to_instantiate_html_plugin_without_dir_arg() throws IOExceptio @Test public void instantiates_pretty_plugin_with_file_arg() throws IOException { - Object plugin = fc.create("pretty:" + TempDir.createTempFile().toURI().toURL()); + Object plugin = fc.create(parse("pretty:" + TempDir.createTempFile().toURI().toURL())); assertEquals(PrettyFormatter.class, plugin.getClass()); } @Test public void instantiates_pretty_plugin_without_file_arg() { - Object plugin = fc.create("pretty"); + Object plugin = fc.create(parse("pretty")); assertEquals(PrettyFormatter.class, plugin.getClass()); } @Test public void instantiates_usage_plugin_without_file_arg() { - Object plugin = fc.create("usage"); + Object plugin = fc.create(parse("usage")); assertEquals(UsageFormatter.class, plugin.getClass()); } @Test public void instantiates_usage_plugin_with_file_arg() throws IOException { - Object plugin = fc.create("usage:" + TempDir.createTempFile().getAbsolutePath()); + Object plugin = fc.create(parse("usage:" + TempDir.createTempFile().getAbsolutePath())); assertEquals(UsageFormatter.class, plugin.getClass()); } @@ -88,7 +89,7 @@ public void plugin_does_not_buffer_its_output() throws IOException { // Need to create a new plugin factory here since we need it to pick up the new value of System.out fc = new PluginFactory(); - ProgressFormatter plugin = (ProgressFormatter) fc.create("progress"); + ProgressFormatter plugin = (ProgressFormatter) fc.create(parse("progress")); EventBus bus = new TimeServiceEventBus(new TimeServiceStub(0)); plugin.setEventPublisher(bus); Result result = new Result(Result.Type.PASSED, 0L, null); @@ -103,10 +104,10 @@ public void plugin_does_not_buffer_its_output() throws IOException { @Test public void instantiates_single_custom_appendable_plugin_with_stdout() { - WantsAppendable plugin = (WantsAppendable) fc.create("io.cucumber.core.plugin.PluginFactoryTest$WantsAppendable"); + WantsAppendable plugin = (WantsAppendable) fc.create(parse("io.cucumber.core.plugin.PluginFactoryTest$WantsAppendable")); assertThat(plugin.out, is(instanceOf(PrintStream.class))); try { - fc.create("io.cucumber.core.plugin.PluginFactoryTest$WantsAppendable"); + fc.create(parse("io.cucumber.core.plugin.PluginFactoryTest$WantsAppendable")); fail(); } catch (CucumberException expected) { assertEquals("Only one plugin can use STDOUT, now both io.cucumber.core.plugin.PluginFactoryTest$WantsAppendable " + @@ -117,58 +118,58 @@ public void instantiates_single_custom_appendable_plugin_with_stdout() { @Test public void instantiates_custom_appendable_plugin_with_stdout_and_file() throws IOException { - WantsAppendable plugin = (WantsAppendable) fc.create("io.cucumber.core.plugin.PluginFactoryTest$WantsAppendable"); + WantsAppendable plugin = (WantsAppendable) fc.create(parse("io.cucumber.core.plugin.PluginFactoryTest$WantsAppendable")); assertThat(plugin.out, is(instanceOf(PrintStream.class))); - WantsAppendable plugin2 = (WantsAppendable) fc.create("io.cucumber.core.plugin.PluginFactoryTest$WantsAppendable:" + TempDir.createTempFile().getAbsolutePath()); + WantsAppendable plugin2 = (WantsAppendable) fc.create(parse("io.cucumber.core.plugin.PluginFactoryTest$WantsAppendable:" + TempDir.createTempFile().getAbsolutePath())); assertEquals(UTF8OutputStreamWriter.class, plugin2.out.getClass()); } @Test public void instantiates_custom_url_plugin() throws IOException { - WantsUrl plugin = (WantsUrl) fc.create("io.cucumber.core.plugin.PluginFactoryTest$WantsUrl:halp"); + WantsUrl plugin = (WantsUrl) fc.create(parse("io.cucumber.core.plugin.PluginFactoryTest$WantsUrl:halp")); assertEquals(new URL("file:halp/"), plugin.out); } @Test public void instantiates_custom_url_plugin_with_http() throws IOException { - WantsUrl plugin = (WantsUrl) fc.create("io.cucumber.core.plugin.PluginFactoryTest$WantsUrl:http://halp/"); + WantsUrl plugin = (WantsUrl) fc.create(parse("io.cucumber.core.plugin.PluginFactoryTest$WantsUrl:http://halp/")); assertEquals(new URL("http://halp/"), plugin.out); } @Test public void instantiates_custom_uri_plugin_with_ws() throws IOException, URISyntaxException { - WantsUri plugin = (WantsUri) fc.create("io.cucumber.core.plugin.PluginFactoryTest$WantsUri:ws://halp/"); + WantsUri plugin = (WantsUri) fc.create(parse("io.cucumber.core.plugin.PluginFactoryTest$WantsUri:ws://halp/")); assertEquals(new URI("ws://halp/"), plugin.out); } @Test public void instantiates_custom_file_plugin() throws IOException { - WantsFile plugin = (WantsFile) fc.create("io.cucumber.core.plugin.PluginFactoryTest$WantsFile:halp.txt"); + WantsFile plugin = (WantsFile) fc.create(parse("io.cucumber.core.plugin.PluginFactoryTest$WantsFile:halp.txt")); assertEquals(new File("halp.txt"), plugin.out); } @Test public void instantiates_custom_string_arg_plugin() throws IOException { - WantsString plugin = (WantsString) fc.create("io.cucumber.core.plugin.PluginFactoryTest$WantsString:hello"); + WantsString plugin = (WantsString) fc.create(parse("io.cucumber.core.plugin.PluginFactoryTest$WantsString:hello")); assertEquals("hello", plugin.arg); } @Test public void instantiates_plugin_using_empty_constructor_when_unspecified() throws IOException { - WantsStringOrDefault plugin = (WantsStringOrDefault) fc.create("io.cucumber.core.plugin.PluginFactoryTest$WantsStringOrDefault"); + WantsStringOrDefault plugin = (WantsStringOrDefault) fc.create(parse("io.cucumber.core.plugin.PluginFactoryTest$WantsStringOrDefault")); assertEquals("defaultValue", plugin.arg); } @Test public void instantiates_plugin_using_arg_constructor_when_specified() throws IOException { - WantsStringOrDefault plugin = (WantsStringOrDefault) fc.create("io.cucumber.core.plugin.PluginFactoryTest$WantsStringOrDefault:hello"); + WantsStringOrDefault plugin = (WantsStringOrDefault) fc.create(parse("io.cucumber.core.plugin.PluginFactoryTest$WantsStringOrDefault:hello")); assertEquals("hello", plugin.arg); } @Test public void instantiates_timeline_plugin_with_dir_arg() throws IOException { - Object plugin = fc.create("timeline:" + TempDir.createTempDirectory().getAbsolutePath()); + Object plugin = fc.create(parse("timeline:" + TempDir.createTempDirectory().getAbsolutePath())); assertEquals(TimelineFormatter.class, plugin.getClass()); } From 9f5cb5c4615332b8d0c85eeb3c19ee3e169bb20b Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sat, 8 Sep 2018 18:11:00 +0200 Subject: [PATCH 029/155] [Core] Remove dependency from runner to options --- .../cucumber/core/options/RuntimeOptions.java | 3 +-- .../cucumber/core/plugin/PluginFactory.java | 1 - .../java/io/cucumber/core/runner/Options.java | 13 +++++++++++++ .../java/io/cucumber/core/runner/Runner.java | 19 +++++++++---------- 4 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/runner/Options.java diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index cae79f1634..f3d7920d24 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -2,7 +2,6 @@ import cucumber.api.SnippetType; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.plugin.Options; import io.cucumber.datatable.DataTable; import io.cucumber.core.model.PathWithLines; import io.cucumber.core.util.FixJava; @@ -25,7 +24,7 @@ import static java.util.Arrays.asList; // IMPORTANT! Make sure USAGE.txt is always uptodate if this class changes. -public final class RuntimeOptions implements Options { +public final class RuntimeOptions implements io.cucumber.core.plugin.Options, io.cucumber.core.runner.Options { static final String VERSION = ResourceBundle.getBundle("io.cucumber.core.version").getString("cucumber-jvm.version"); private static final String USAGE_RESOURCE = "/cucumber/api/cli/USAGE.txt"; diff --git a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java index d2c0ec2777..22f134b6d1 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java +++ b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java @@ -2,7 +2,6 @@ import cucumber.api.Plugin; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.options.PluginOption; import java.io.File; import java.io.IOException; diff --git a/core/src/main/java/io/cucumber/core/runner/Options.java b/core/src/main/java/io/cucumber/core/runner/Options.java new file mode 100644 index 0000000000..a09023d685 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runner/Options.java @@ -0,0 +1,13 @@ +package io.cucumber.core.runner; + +import cucumber.api.SnippetType; + +import java.util.List; + +public interface Options { + List getGlue(); + + boolean isDryRun(); + + SnippetType getSnippetType(); +} diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index b6e52bdbc4..95d39e574f 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -3,13 +3,12 @@ import cucumber.api.HookType; import cucumber.api.StepDefinitionReporter; import cucumber.api.event.SnippetsSuggestedEvent; -import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.backend.Backend; -import io.cucumber.core.event.EventBus; -import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.event.EventBus; import java.util.ArrayList; import java.util.Collection; @@ -19,14 +18,14 @@ public final class Runner { private final CachingGlue glue = new CachingGlue(); private final EventBus bus; private final Collection backends; - private final RuntimeOptions runtimeOptions; + private final Options options; - public Runner(EventBus bus, Collection backends, RuntimeOptions runtimeOptions) { + public Runner(EventBus bus, Collection backends, Options options) { this.bus = bus; - this.runtimeOptions = runtimeOptions; + this.options = options; this.backends = backends; for (Backend backend : backends) { - backend.loadGlue(glue, runtimeOptions.getGlue()); + backend.loadGlue(glue, options.getGlue()); } } @@ -56,7 +55,7 @@ private TestCase createTestCaseForPickle(PickleEvent pickleEvent) { addTestStepsForPickleSteps(testSteps, pickleEvent); addTestStepsForAfterHooks(afterHooks, pickleEvent.pickle.getTags()); } - return new TestCase(testSteps, beforeHooks, afterHooks, pickleEvent, runtimeOptions.isDryRun()); + return new TestCase(testSteps, beforeHooks, afterHooks, pickleEvent, options.isDryRun()); } private void addTestStepsForPickleSteps(List testSteps, PickleEvent pickleEvent) { @@ -67,7 +66,7 @@ private void addTestStepsForPickleSteps(List testSteps, Pick if (match == null) { List snippets = new ArrayList<>(); for (Backend backend : backends) { - List snippet = backend.getSnippet(step, "**KEYWORD**", runtimeOptions.getSnippetType().getFunctionNameGenerator()); + List snippet = backend.getSnippet(step, "**KEYWORD**", options.getSnippetType().getFunctionNameGenerator()); snippets.addAll(snippet); } if (!snippets.isEmpty()) { From 6dfc96220412dcbf7b04665f2f0e046367a9bde5 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sat, 8 Sep 2018 21:38:28 +0200 Subject: [PATCH 030/155] [Core] Parse rerun files in RuntimeOptions --- .../java/io/cucumber/core/filter/Filters.java | 21 +- .../io/cucumber/core/filter/RerunFilters.java | 42 --- .../io/cucumber/core/model/FeatureLoader.java | 44 +-- .../cucumber/core/options/RuntimeOptions.java | 72 +++-- .../core/options/RuntimeOptionsFactory.java | 9 +- .../io/cucumber/core/runtime/Runtime.java | 37 +-- .../core/model/CucumberFeatureTest.java | 280 ++---------------- .../cucumber/core/options/RerunFileTest.java | 200 +++++++++++++ .../core/options/RuntimeOptionsTest.java | 155 +++++----- .../cucumber/core/runner/HookOrderTest.java | 5 +- .../io/cucumber/core/runner/HookTest.java | 6 +- .../io/cucumber/core/runner/RunnerTest.java | 9 +- .../io/cucumber/core/runner/TestHelper.java | 9 +- .../BackendModuleBackendSupplierTest.java | 5 +- .../cucumber/core/runtime/ExitStatusTest.java | 4 +- .../runtime/SingletonRunnerSupplierTest.java | 7 +- .../ThreadLocalRunnerSupplierTest.java | 3 +- .../cucumber/java/JavaStepDefinitionTest.java | 4 +- .../java/cucumber/api/junit/Cucumber.java | 8 +- .../io/cucumber/junit/FeatureRunnerTest.java | 8 +- .../api/testng/TestNGCucumberRunner.java | 6 +- 21 files changed, 432 insertions(+), 502 deletions(-) delete mode 100644 core/src/main/java/io/cucumber/core/filter/RerunFilters.java create mode 100644 core/src/test/java/io/cucumber/core/options/RerunFileTest.java diff --git a/core/src/main/java/io/cucumber/core/filter/Filters.java b/core/src/main/java/io/cucumber/core/filter/Filters.java index 68b412acb6..cbc96943a1 100644 --- a/core/src/main/java/io/cucumber/core/filter/Filters.java +++ b/core/src/main/java/io/cucumber/core/filter/Filters.java @@ -11,15 +11,10 @@ public final class Filters { private final List filters; - private final RuntimeOptions runtimeOptions; - private final RerunFilters rerunFilters; - - public Filters(RuntimeOptions runtimeOptions, RerunFilters rerunFilters) { - this.runtimeOptions = runtimeOptions; - this.rerunFilters = rerunFilters; + public Filters(RuntimeOptions runtimeOptions) { filters = new ArrayList<>(); - List tagFilters = this.runtimeOptions.getTagFilters(); + List tagFilters = runtimeOptions.getTagFilters(); if (!tagFilters.isEmpty()) { this.filters.add(new TagPredicate(tagFilters)); } @@ -28,10 +23,6 @@ public Filters(RuntimeOptions runtimeOptions, RerunFilters rerunFilters) { this.filters.add(new NamePredicate(nameFilters)); } Map> lineFilters = runtimeOptions.getLineFilters(); - Map> rerunlineFilters = rerunFilters.processRerunFiles(); - for (Map.Entry> line: rerunlineFilters.entrySet()) { - addLineFilters(lineFilters, line.getKey(), line.getValue()); - } if (!lineFilters.isEmpty()) { this.filters.add(new LinePredicate(lineFilters)); } @@ -46,12 +37,4 @@ public boolean matchesFilters(PickleEvent pickleEvent) { return true; } - private void addLineFilters(Map> parsedLineFilters, String key, List lines) { - if (parsedLineFilters.containsKey(key)) { - parsedLineFilters.get(key).addAll(lines); - } else { - parsedLineFilters.put(key, lines); - } - } - } diff --git a/core/src/main/java/io/cucumber/core/filter/RerunFilters.java b/core/src/main/java/io/cucumber/core/filter/RerunFilters.java deleted file mode 100644 index c0867cb9f0..0000000000 --- a/core/src/main/java/io/cucumber/core/filter/RerunFilters.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.cucumber.core.filter; - -import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.model.FeatureLoader; -import io.cucumber.core.model.PathWithLines; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public final class RerunFilters { - private final RuntimeOptions runtimeOptions; - private final FeatureLoader featureLoader; - - public RerunFilters(RuntimeOptions runtimeOptions, FeatureLoader featureLoader) { - this.runtimeOptions = runtimeOptions; - this.featureLoader = featureLoader; - } - - - Map> processRerunFiles() { - final Map> lineFilters = new HashMap>(); - for (String featurePath : runtimeOptions.getFeaturePaths()) { - if (featurePath.startsWith("@")) { - for (PathWithLines pathWithLines : featureLoader.loadRerunFile(featurePath.substring(1))) { - addLineFilters(lineFilters, pathWithLines.path, pathWithLines.lines); - } - } - } - return lineFilters; - } - - private void addLineFilters(Map> parsedLineFilters, String key, List lines) { - if (parsedLineFilters.containsKey(key)) { - parsedLineFilters.get(key).addAll(lines); - } else { - parsedLineFilters.put(key, lines); - } - } - - -} diff --git a/core/src/main/java/io/cucumber/core/model/FeatureLoader.java b/core/src/main/java/io/cucumber/core/model/FeatureLoader.java index 704c7e914b..131d949b6c 100644 --- a/core/src/main/java/io/cucumber/core/model/FeatureLoader.java +++ b/core/src/main/java/io/cucumber/core/model/FeatureLoader.java @@ -1,20 +1,14 @@ package io.cucumber.core.model; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; -import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; public final class FeatureLoader { - private static final Pattern RERUN_PATH_SPECIFICATION = Pattern.compile("(?m:^| |)(.*?\\.feature(?:(?::\\d+)*))"); private final ResourceLoader resourceLoader; @@ -38,46 +32,12 @@ public List load(List featurePaths) { final List cucumberFeatures = new ArrayList(); final FeatureBuilder builder = new FeatureBuilder(cucumberFeatures); for (String featurePath : featurePaths) { - if (featurePath.startsWith("@")) { - loadFromRerunFile(builder, resourceLoader, featurePath.substring(1)); - } else { - loadFromFeaturePath(builder, resourceLoader, featurePath, false); - } + loadFromFileSystemOrClasspath(builder, resourceLoader, featurePath); } - Collections.sort(cucumberFeatures, new CucumberFeature.CucumberFeatureUriComparator()); + cucumberFeatures.sort(new CucumberFeature.CucumberFeatureUriComparator()); return cucumberFeatures; } - - private void loadFromRerunFile(FeatureBuilder builder, ResourceLoader resourceLoader, String rerunPath) { - for (PathWithLines pathWithLines : loadRerunFile(rerunPath)) { - loadFromFileSystemOrClasspath(builder, resourceLoader, pathWithLines.path); - } - } - - public List loadRerunFile(String rerunPath) { - List featurePaths = new ArrayList(); - Iterable resources = resourceLoader.resources(rerunPath, null); - for (Resource resource : resources) { - String source = read(resource); - if (!source.isEmpty()) { - Matcher matcher = RERUN_PATH_SPECIFICATION.matcher(source); - while (matcher.find()) { - featurePaths.add(new PathWithLines(matcher.group(1))); - } - } - } - return featurePaths; - } - private static String read(Resource resource) { - try { - return Encoding.readFile(resource); - } catch (IOException e) { - throw new CucumberException("Failed to read resource:" + resource.getPath(), e); - } - } - - private static void loadFromFileSystemOrClasspath(FeatureBuilder builder, ResourceLoader resourceLoader, String featurePath) { try { loadFromFeaturePath(builder, resourceLoader, featurePath, false); diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index f3d7920d24..670aaa8298 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -2,6 +2,9 @@ import cucumber.api.SnippetType; import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; import io.cucumber.datatable.DataTable; import io.cucumber.core.model.PathWithLines; import io.cucumber.core.util.FixJava; @@ -10,6 +13,7 @@ import gherkin.GherkinDialectProvider; import gherkin.IGherkinDialectProvider; +import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; @@ -17,6 +21,7 @@ import java.util.List; import java.util.Map; import java.util.ResourceBundle; +import java.util.regex.Matcher; import java.util.regex.Pattern; import static io.cucumber.core.util.FixJava.join; @@ -27,6 +32,7 @@ public final class RuntimeOptions implements io.cucumber.core.plugin.Options, io.cucumber.core.runner.Options { static final String VERSION = ResourceBundle.getBundle("io.cucumber.core.version").getString("cucumber-jvm.version"); private static final String USAGE_RESOURCE = "/cucumber/api/cli/USAGE.txt"; + private static final Pattern RERUN_PATH_SPECIFICATION = Pattern.compile("(?m:^| |)(.*?\\.feature(?:(?::\\d+)*))"); static String usageText; @@ -61,16 +67,7 @@ public String map(String keyword) { private final List stepDefinitionReporters = new ArrayList<>(); private final List summaryPrinters = new ArrayList<>(); - /** - * Create a new instance from a string of options, for example: - *

    - * - * - * @param argv the arguments - */ - public RuntimeOptions(String argv) { - this(ShellWords.parse(argv)); - } + private final ResourceLoader resourceLoader; /** * Create a new instance from a list of options, for example: @@ -79,11 +76,12 @@ public RuntimeOptions(String argv) { * * @param argv the arguments */ - public RuntimeOptions(List argv) { - this(Env.INSTANCE, argv); + public RuntimeOptions(ResourceLoader resourceLoader, List argv) { + this(resourceLoader, Env.INSTANCE, argv); } - RuntimeOptions(Env env, List argv) { + public RuntimeOptions(ResourceLoader resourceLoader, Env env, List argv) { + this.resourceLoader = resourceLoader; argv = new ArrayList(argv); // in case the one passed in is unmodifiable. parse(argv); @@ -172,13 +170,10 @@ private void parse(List args) { } else if (arg.startsWith("-")) { printUsage(); throw new CucumberException("Unknown option: " + arg); + } else if (arg.startsWith("@")) { + processPathWitheLinesFromRerunFile(parsedLineFilters, parsedFeaturePaths, arg.substring(1)); } else { - PathWithLines pathWithLines = new PathWithLines(arg); - parsedFeaturePaths.add(pathWithLines.path); - if (!pathWithLines.lines.isEmpty()) { - String key = pathWithLines.path.replace("classpath:", ""); - addLineFilters(parsedLineFilters, key, pathWithLines.lines); - } + processPathWithLines(parsedLineFilters, parsedFeaturePaths, new PathWithLines(arg)); } } if (!parsedTagFilters.isEmpty() || !parsedNameFilters.isEmpty() || !parsedLineFilters.isEmpty() || haveLineFilters(parsedFeaturePaths)) { @@ -218,9 +213,46 @@ private void addLineFilters(Map> parsedLineFilters, String ke } } + private void processPathWithLines(Map> parsedLineFilters, List parsedFeaturePaths, PathWithLines pathWithLines) { + parsedFeaturePaths.add(pathWithLines.path); + if (!pathWithLines.lines.isEmpty()) { + String key = pathWithLines.path.replace("classpath:", ""); + addLineFilters(parsedLineFilters, key, pathWithLines.lines); + } + } + + private void processPathWitheLinesFromRerunFile(Map> parsedLineFilters, List parsedFeaturePaths, String rerunPath) { + for (PathWithLines pathWithLines : loadRerunFile(rerunPath)) { + processPathWithLines(parsedLineFilters, parsedFeaturePaths, pathWithLines); + } + } + + private List loadRerunFile(String rerunPath) { + List featurePaths = new ArrayList<>(); + Iterable resources = resourceLoader.resources(rerunPath, null); + for (Resource resource : resources) { + String source = read(resource); + if (!source.isEmpty()) { + Matcher matcher = RERUN_PATH_SPECIFICATION.matcher(source); + while (matcher.find()) { + featurePaths.add(new PathWithLines(matcher.group(1))); + } + } + } + return featurePaths; + } + + private static String read(Resource resource) { + try { + return FixJava.readReader(new InputStreamReader(resource.getInputStream())); + } catch (IOException e) { + throw new CucumberException("Failed to read resource:" + resource.getPath(), e); + } + } + private boolean haveLineFilters(List parsedFeaturePaths) { for (String pathName : parsedFeaturePaths) { - if (pathName.startsWith("@") || PathWithLines.hasLineFilters(pathName)) { + if (PathWithLines.hasLineFilters(pathName)) { return true; } } diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java index d6b93e559c..e048a90ddc 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java @@ -3,6 +3,7 @@ import cucumber.api.CucumberOptions; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; import java.util.ArrayList; import java.util.Collections; @@ -12,16 +13,22 @@ public final class RuntimeOptionsFactory { private final Class clazz; + private final ResourceLoader resoureceLoader; private boolean featuresSpecified = false; private boolean overridingGlueSpecified = false; public RuntimeOptionsFactory(Class clazz) { + this(clazz, new MultiLoader(clazz.getClassLoader())); + } + + public RuntimeOptionsFactory(Class clazz, ResourceLoader resourceLoader) { this.clazz = clazz; + this.resoureceLoader = resourceLoader; } public RuntimeOptions create() { List args = buildArgsFromOptions(); - return new RuntimeOptions(args); + return new RuntimeOptions(resoureceLoader, args); } private List buildArgsFromOptions() { diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index b41d6bff96..e3bacc184c 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -15,7 +15,6 @@ import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.filter.Filters; -import io.cucumber.core.filter.RerunFilters; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.plugin.Plugins; import io.cucumber.core.io.ClassFinder; @@ -38,6 +37,7 @@ import java.util.concurrent.TimeUnit; import static cucumber.api.Result.SEVERITY; +import static java.util.Collections.emptyList; import static java.util.Collections.max; import static java.util.Collections.min; @@ -116,27 +116,23 @@ public static class Builder { private EventBus eventBus = new TimeServiceEventBus(TimeService.SYSTEM); private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - private RuntimeOptions runtimeOptions = new RuntimeOptions(""); + private RuntimeOptions runtimeOptions; private BackendSupplier backendSupplier; private ResourceLoader resourceLoader; private ClassFinder classFinder; private FeatureSupplier featureSupplier; - private List additionalPlugins = Collections.emptyList(); + private List additionalPlugins = emptyList(); + private List runtimeOptionsArgs = emptyList(); private Builder() { } - public Builder withArg(final String arg) { - this.runtimeOptions = new RuntimeOptions(arg); - return this; - } - public Builder withArgs(final String... args) { return withArgs(Arrays.asList(args)); } public Builder withArgs(final List args) { - this.runtimeOptions = new RuntimeOptions(args); + this.runtimeOptionsArgs = args; return this; } @@ -185,22 +181,26 @@ public Runtime build() { ? this.resourceLoader : new MultiLoader(this.classLoader); + final RuntimeOptions runtimeOptions = this.runtimeOptions != null + ? this.runtimeOptions + : new RuntimeOptions(resourceLoader, runtimeOptionsArgs); + final ClassFinder classFinder = this.classFinder != null ? this.classFinder : new ResourceLoaderClassFinder(resourceLoader, this.classLoader); final BackendSupplier backendSupplier = this.backendSupplier != null ? this.backendSupplier - : new BackendModuleBackendSupplier(resourceLoader, classFinder, this.runtimeOptions); + : new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); - final Plugins plugins = new Plugins(new PluginFactory(), this.eventBus, this.runtimeOptions); + final Plugins plugins = new Plugins(new PluginFactory(), this.eventBus, runtimeOptions); for (final Plugin plugin : additionalPlugins) { plugins.addPlugin(plugin); } final RunnerSupplier runnerSupplier = runtimeOptions.isMultiThreaded() - ? new ThreadLocalRunnerSupplier(this.runtimeOptions, eventBus, backendSupplier) - : new SingletonRunnerSupplier(this.runtimeOptions, eventBus, backendSupplier); + ? new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier) + : new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier); final ExecutorService executor = runtimeOptions.isMultiThreaded() ? Executors.newFixedThreadPool(runtimeOptions.getThreads()) @@ -211,11 +211,10 @@ public Runtime build() { final FeatureSupplier featureSupplier = this.featureSupplier != null ? this.featureSupplier - : new FeaturePathFeatureSupplier(featureLoader, this.runtimeOptions, this.eventBus); + : new FeaturePathFeatureSupplier(featureLoader, runtimeOptions, this.eventBus); - final RerunFilters rerunFilters = new RerunFilters(this.runtimeOptions, featureLoader); - final Filters filters = new Filters(this.runtimeOptions, rerunFilters); - return new Runtime(plugins, this.runtimeOptions, eventBus, filters, runnerSupplier, featureSupplier, executor); + final Filters filters = new Filters(runtimeOptions); + return new Runtime(plugins, runtimeOptions, eventBus, filters, runnerSupplier, featureSupplier, executor); } } @@ -276,7 +275,9 @@ public void setEventPublisher(EventPublisher publisher) { } byte exitStatus() { - if (results.isEmpty()) { return DEFAULT; } + if (results.isEmpty()) { + return DEFAULT; + } if (runtimeOptions.isWip()) { return min(results, SEVERITY).is(Result.Type.PASSED) ? ERRORS : DEFAULT; diff --git a/core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java b/core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java index 7e1e19b5f1..bd5cf76471 100644 --- a/core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java +++ b/core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java @@ -2,7 +2,9 @@ import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -12,27 +14,31 @@ import java.util.Collections; import java.util.List; +import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class CucumberFeatureTest { + + private final PrintStream printStream = new PrintStream(new ByteArrayOutputStream()); + @Rule + public ExpectedException expectedException = ExpectedException.none(); + @Test public void succeeds_if_no_features_are_found() { ResourceLoader resourceLoader = mock(ResourceLoader.class); - when(resourceLoader.resources("does/not/exist", ".feature")).thenReturn(Collections.emptyList()); + when(resourceLoader.resources("does/not/exist", ".feature")).thenReturn(Collections.emptyList()); - new FeatureLoader(resourceLoader).load(singletonList("does/not/exist"), new PrintStream(new ByteArrayOutputStream())); + new FeatureLoader(resourceLoader).load(singletonList("does/not/exist"), printStream); } @Test public void logs_message_if_no_features_are_found() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ResourceLoader resourceLoader = mock(ResourceLoader.class); - when(resourceLoader.resources("does/not/exist", ".feature")).thenReturn(Collections.emptyList()); + when(resourceLoader.resources("does/not/exist", ".feature")).thenReturn(Collections.emptyList()); new FeatureLoader(resourceLoader).load(singletonList("does/not/exist"), new PrintStream(baos)); @@ -44,149 +50,22 @@ public void logs_message_if_no_feature_paths_are_given() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ResourceLoader resourceLoader = mock(ResourceLoader.class); - new FeatureLoader(resourceLoader).load(Collections.emptyList(), new PrintStream(baos)); + new FeatureLoader(resourceLoader).load(Collections.emptyList(), new PrintStream(baos)); assertEquals(String.format("Got no path to feature directory or feature file%n"), baos.toString()); } @Test - public void loads_features_specified_in_rerun_file() throws Exception { - String featurePath1 = "path/bar.feature"; - String feature1 = "" + - "Feature: bar\n" + - " Scenario: scenario bar\n" + - " * step\n"; - String featurePath2 = "path/foo.feature"; - String feature2 = "" + - "Feature: foo\n" + - " Scenario: scenario 1\n" + - " * step\n" + - " Scenario: scenario 2\n" + - " * step\n"; - String rerunPath = "path/rerun.txt"; - String rerunFile = featurePath1 + ":2\n" + featurePath2 + ":4\n"; - ResourceLoader resourceLoader = mockFeatureFileResource(featurePath1, feature1); - mockFeatureFileResource(resourceLoader, featurePath2, feature2); - mockFileResource(resourceLoader, rerunPath, null, rerunFile); - - List features = new FeatureLoader(resourceLoader).load(singletonList("@" + rerunPath), new PrintStream(new ByteArrayOutputStream())); - - assertEquals(2, features.size()); - assertEquals(1, features.get(0).getGherkinFeature().getFeature().getChildren().size()); - assertEquals("scenario bar", features.get(0).getGherkinFeature().getFeature().getChildren().get(0).getName()); - assertEquals(2, features.get(1).getGherkinFeature().getFeature().getChildren().size()); - assertEquals("scenario 1", features.get(1).getGherkinFeature().getFeature().getChildren().get(0).getName()); - assertEquals("scenario 2", features.get(1).getGherkinFeature().getFeature().getChildren().get(1).getName()); - } - - @Test - public void loads_no_features_when_rerun_file_is_empty() throws Exception { - String feature = "" + - "Feature: bar\n" + - " Scenario: scenario bar\n" + - " * step\n"; - String rerunPath = "path/rerun.txt"; - String rerunFile = ""; - ResourceLoader resourceLoader = mockFeatureFileResourceForAnyFeaturePath(feature); - mockFileResource(resourceLoader, rerunPath, null, rerunFile); - - List features = new FeatureLoader(resourceLoader).load(singletonList("@" + rerunPath), new PrintStream(new ByteArrayOutputStream())); - - assertEquals(0, features.size()); - } - - @Test - public void loads_no_features_when_rerun_file_contains_new_line() throws Exception { - String feature = "" + - "Feature: bar\n" + - " Scenario: scenario bar\n" + - " * step\n"; - String rerunPath = "path/rerun.txt"; - String rerunFile = "\n"; - ResourceLoader resourceLoader = mockFeatureFileResourceForAnyFeaturePath(feature); - mockFileResource(resourceLoader, rerunPath, null, rerunFile); - - List features = new FeatureLoader(resourceLoader).load(singletonList("@" + rerunPath), new PrintStream(new ByteArrayOutputStream())); - - assertEquals(0, features.size()); - } - - @Test - public void loads_no_features_when_rerun_file_contains_carriage_return() throws Exception { - String feature = "" + - "Feature: bar\n" + - " Scenario: scenario bar\n" + - " * step\n"; - String rerunPath = "path/rerun.txt"; - String rerunFile = "\r"; - ResourceLoader resourceLoader = mockFeatureFileResourceForAnyFeaturePath(feature); - mockFileResource(resourceLoader, rerunPath, null, rerunFile); - - List features = new FeatureLoader(resourceLoader).load(singletonList("@" + rerunPath), new PrintStream(new ByteArrayOutputStream())); - - assertEquals(0, features.size()); - } - - @Test - public void loads_no_features_when_rerun_file_contains_new_line_and_carriage_return() throws Exception { + public void loads_features_specified_in_rerun_file_from_classpath_when_not_in_file_system() throws Exception { + String featurePath = "path/bar.feature"; String feature = "" + "Feature: bar\n" + " Scenario: scenario bar\n" + " * step\n"; - String rerunPath = "path/rerun.txt"; - String rerunFile = "\r\n"; - ResourceLoader resourceLoader = mockFeatureFileResourceForAnyFeaturePath(feature); - mockFileResource(resourceLoader, rerunPath, null, rerunFile); - - List features = new FeatureLoader(resourceLoader).load(singletonList("@" + rerunPath), new PrintStream(new ByteArrayOutputStream())); - - assertEquals(0, features.size()); - } - - @Test - public void last_new_line_is_optinal() throws Exception { - String featurePath1 = "path/bar.feature"; - String feature1 = "" + - "Feature: bar\n" + - " Scenario: scenario bar\n" + - " * step\n"; - String featurePath2 = "path/foo.feature"; - String feature2 = "" + - "Feature: foo\n" + - " Scenario: scenario 1\n" + - " * step\n" + - " Scenario: scenario 2\n" + - " * step\n"; - String rerunPath = "path/rerun.txt"; - String rerunFile = featurePath1 + ":2\n" + featurePath2 + ":4"; - ResourceLoader resourceLoader = mockFeatureFileResource(featurePath1, feature1); - mockFeatureFileResource(resourceLoader, featurePath2, feature2); - mockFileResource(resourceLoader, rerunPath, null, rerunFile); - - List features = new FeatureLoader(resourceLoader).load(singletonList("@" + rerunPath), new PrintStream(new ByteArrayOutputStream())); - - assertEquals(2, features.size()); - assertEquals(1, features.get(0).getGherkinFeature().getFeature().getChildren().size()); - assertEquals("scenario bar", features.get(0).getGherkinFeature().getFeature().getChildren().get(0).getName()); - assertEquals(2, features.get(1).getGherkinFeature().getFeature().getChildren().size()); - assertEquals("scenario 1", features.get(1).getGherkinFeature().getFeature().getChildren().get(0).getName()); - assertEquals("scenario 2", features.get(1).getGherkinFeature().getFeature().getChildren().get(1).getName()); - } - - @Test - public void loads_features_specified_in_rerun_file_from_classpath_when_not_in_file_system() throws Exception { - String featurePath = "path/bar.feature"; - String feature = "" + - "Feature: bar\n" + - " Scenario: scenario bar\n" + - " * step\n"; - String rerunPath = "path/rerun.txt"; - String rerunFile = featurePath + ":2"; ResourceLoader resourceLoader = mockFeatureFileResource("classpath:" + featurePath, feature); mockFeaturePathToNotExist(resourceLoader, featurePath); - mockFileResource(resourceLoader, rerunPath, suffix(null), rerunFile); - List features = new FeatureLoader(resourceLoader).load(singletonList("@" + rerunPath), new PrintStream(new ByteArrayOutputStream())); + List features = new FeatureLoader(resourceLoader).load(singletonList(featurePath), printStream); assertEquals(1, features.size()); assertEquals(1, features.get(0).getGherkinFeature().getFeature().getChildren().size()); @@ -194,146 +73,43 @@ public void loads_features_specified_in_rerun_file_from_classpath_when_not_in_fi } @Test - public void gives_error_message_if_path_from_rerun_file_does_not_exist() throws Exception { + public void gives_error_message_if_path_from_rerun_file_does_not_exist() { String featurePath = "path/bar.feature"; - String rerunPath = "path/rerun.txt"; - String rerunFile = featurePath + ":2"; ResourceLoader resourceLoader = mock(ResourceLoader.class); mockFeaturePathToNotExist(resourceLoader, featurePath); mockFeaturePathToNotExist(resourceLoader, "classpath:" + featurePath); - mockFileResource(resourceLoader, rerunPath, suffix(null), rerunFile); - - try { - new FeatureLoader(resourceLoader).load(singletonList("@" + rerunPath), new PrintStream(new ByteArrayOutputStream())); - - fail("IllegalArgumentException was expected"); - } catch (IllegalArgumentException exception) { - assertEquals("Neither found on file system or on classpath: " + - "Not a file or directory: path/bar.feature, No resource found for: classpath:path/bar.feature", - exception.getMessage()); - } - } - - @Test - public void understands_whitespace_in_rerun_filepath() throws Exception { - String featurePath1 = "/home/users/mp/My Documents/tests/bar.feature"; - String feature1 = "" + - "Feature: bar\n" + - " Scenario: scenario bar\n" + - " * step\n"; - String rerunPath = "rerun.txt"; - String rerunFile = featurePath1 + ":2\n"; - ResourceLoader resourceLoader = mockFeatureFileResource(featurePath1, feature1); - mockFileResource(resourceLoader, rerunPath, null, rerunFile); - - List features = new FeatureLoader(resourceLoader).load(singletonList("@" + rerunPath), new PrintStream(new ByteArrayOutputStream())); - - assertEquals(1, features.size()); - assertEquals(1, features.get(0).getGherkinFeature().getFeature().getChildren().size()); - assertEquals("scenario bar", features.get(0).getGherkinFeature().getFeature().getChildren().get(0).getName()); - } - - - @Test - public void understands_rerun_files_separated_by_with_whitespace() throws Exception { - String featurePath1 = "/home/users/mp/My Documents/tests/bar.feature"; - String feature1 = "" + - "Feature: bar\n" + - " Scenario: scenario bar\n" + - " * step\n"; - String featurePath2 = "/home/users/mp/My Documents/tests/foo.feature"; - String feature2 = "" + - "Feature: foo\n" + - " Scenario: scenario 1\n" + - " * step\n" + - " Scenario: scenario 2\n" + - " * step\n"; - String rerunPath = "path/rerun.txt"; - String rerunFile = featurePath1 + ":2 " + featurePath2 + ":4"; - ResourceLoader resourceLoader = mockFeatureFileResource(featurePath1, feature1); - mockFeatureFileResource(resourceLoader, featurePath2, feature2); - mockFileResource(resourceLoader, rerunPath, null, rerunFile); - - List features = new FeatureLoader(resourceLoader).load(singletonList("@" + rerunPath), new PrintStream(new ByteArrayOutputStream())); - assertEquals(2, features.size()); - assertEquals(1, features.get(0).getGherkinFeature().getFeature().getChildren().size()); - assertEquals("scenario bar", features.get(0).getGherkinFeature().getFeature().getChildren().get(0).getName()); - assertEquals(2, features.get(1).getGherkinFeature().getFeature().getChildren().size()); - assertEquals("scenario 1", features.get(1).getGherkinFeature().getFeature().getChildren().get(0).getName()); - assertEquals("scenario 2", features.get(1).getGherkinFeature().getFeature().getChildren().get(1).getName()); + expectedException.expectMessage( + "Neither found on file system or on classpath: " + + "Not a file or directory: path/bar.feature, No resource found for: classpath:path/bar.feature"); + new FeatureLoader(resourceLoader).load(singletonList(featurePath), printStream); } - @Test - public void understands_rerun_files_without_separation_in_rerun_filepath() throws Exception { - String featurePath1 = "/home/users/mp/My Documents/tests/bar.feature"; - String feature1 = "" + - "Feature: bar\n" + - " Scenario: scenario bar\n" + - " * step\n"; - String featurePath2 = "/home/users/mp/My Documents/tests/foo.feature"; - String feature2 = "" + - "Feature: foo\n" + - " Scenario: scenario 1\n" + - " * step\n" + - " Scenario: scenario 2\n" + - " * step\n"; - String rerunPath = "path/rerun.txt"; - String rerunFile = featurePath1 + ":2" + featurePath2 + ":4"; - ResourceLoader resourceLoader = mockFeatureFileResource(featurePath1, feature1); - mockFeatureFileResource(resourceLoader, featurePath2, feature2); - mockFileResource(resourceLoader, rerunPath, null, rerunFile); - - List features = new FeatureLoader(resourceLoader).load(singletonList("@" + rerunPath), new PrintStream(new ByteArrayOutputStream())); - - assertEquals(2, features.size()); - assertEquals(1, features.get(0).getGherkinFeature().getFeature().getChildren().size()); - assertEquals("scenario bar", features.get(0).getGherkinFeature().getFeature().getChildren().get(0).getName()); - assertEquals(2, features.get(1).getGherkinFeature().getFeature().getChildren().size()); - assertEquals("scenario 1", features.get(1).getGherkinFeature().getFeature().getChildren().get(0).getName()); - assertEquals("scenario 2", features.get(1).getGherkinFeature().getFeature().getChildren().get(1).getName()); - } - - private ResourceLoader mockFeatureFileResource(String featurePath, String feature) - throws IOException { + private ResourceLoader mockFeatureFileResource(String featurePath, String feature) throws IOException { ResourceLoader resourceLoader = mock(ResourceLoader.class); mockFeatureFileResource(resourceLoader, featurePath, feature); return resourceLoader; } - private ResourceLoader mockFeatureFileResourceForAnyFeaturePath(String feature) - throws IOException { - ResourceLoader resourceLoader = mock(ResourceLoader.class); - Resource resource = mock(Resource.class); - when(resource.getPath()).thenReturn(""); - when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(feature.getBytes("UTF-8"))); - when(resourceLoader.resources(anyString(), anyString())).thenReturn(singletonList(resource)); - return resourceLoader; - } - private void mockFeatureFileResource(ResourceLoader resourceLoader, String featurePath, String feature) - throws IOException { - mockFileResource(resourceLoader, featurePath, ".feature", feature); + throws IOException { + mockFileResource(resourceLoader, featurePath, feature); } - private void mockFileResource(ResourceLoader resourceLoader, String featurePath, String extension, String feature) - throws IOException { + private void mockFileResource(ResourceLoader resourceLoader, String path, String contents) throws IOException { Resource resource = mock(Resource.class); - when(resource.getPath()).thenReturn(featurePath); - when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(feature.getBytes("UTF-8"))); - when(resourceLoader.resources(featurePath, extension)).thenReturn(singletonList(resource)); + when(resource.getPath()).thenReturn(path); + when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(contents.getBytes(UTF_8))); + when(resourceLoader.resources(path, ".feature")).thenReturn(singletonList(resource)); } private void mockFeaturePathToNotExist(ResourceLoader resourceLoader, String featurePath) { if (featurePath.startsWith("classpath")) { - when(resourceLoader.resources(featurePath, ".feature")).thenReturn(new ArrayList()); + when(resourceLoader.resources(featurePath, ".feature")).thenReturn(new ArrayList<>()); } else { when(resourceLoader.resources(featurePath, ".feature")).thenThrow(new IllegalArgumentException("Not a file or directory: " + featurePath)); } } - private String suffix(String suffix) { - return suffix; - } } diff --git a/core/src/test/java/io/cucumber/core/options/RerunFileTest.java b/core/src/test/java/io/cucumber/core/options/RerunFileTest.java new file mode 100644 index 0000000000..3bc318f0f1 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/options/RerunFileTest.java @@ -0,0 +1,200 @@ +package io.cucumber.core.options; + +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Properties; + +import static io.cucumber.core.options.Env.INSTANCE; +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.Arrays.asList; +import static java.util.Collections.emptyMap; +import static java.util.Collections.singletonList; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class RerunFileTest { + + @Test + public void loads_features_specified_in_rerun_file() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "path/bar.feature:2\n" + + "path/foo.feature:4\n"); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), contains( + "path/bar.feature", + "path/foo.feature" + )); + assertThat(runtimeOptions.getLineFilters(), equalTo(new HashMap>() { + { + put("path/bar.feature", singletonList(2L)); + put("path/foo.feature", singletonList(4L)); + } + })); + } + + @Test + public void loads_no_features_when_rerun_file_is_empty() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "" + ); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), hasSize(0)); + assertThat(runtimeOptions.getLineFilters(), equalTo(emptyMap())); + } + + @Test + public void loads_no_features_when_rerun_file_contains_new_line() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "\n" + ); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), hasSize(0)); + assertThat(runtimeOptions.getLineFilters(), equalTo(emptyMap())); + } + + @Test + public void loads_no_features_when_rerun_file_contains_carriage_return() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "\r"); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), hasSize(0)); + assertThat(runtimeOptions.getLineFilters(), equalTo(emptyMap())); + } + + @Test + public void loads_no_features_when_rerun_file_contains_new_line_and_carriage_return() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "\r\n"); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), hasSize(0)); + assertThat(runtimeOptions.getLineFilters(), equalTo(emptyMap())); + } + + @Test + public void last_new_line_is_optinal() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "path/bar.feature:2\npath/foo.feature:4" + ); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), contains("path/bar.feature", "path/foo.feature")); + assertThat(runtimeOptions.getLineFilters(), equalTo(new HashMap>() { + { + put("path/bar.feature", singletonList(2L)); + put("path/foo.feature", singletonList(4L)); + } + })); + } + + + @Test + public void understands_whitespace_in_rerun_filepath() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "rerun.txt", + "/home/users/mp/My Documents/tests/bar.feature:2\n"); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), contains("/home/users/mp/My Documents/tests/bar.feature")); + assertThat(runtimeOptions.getLineFilters(), equalTo(new HashMap>() { + { + put("/home/users/mp/My Documents/tests/bar.feature", singletonList(2L)); + } + })); + } + + + @Test + public void understands_rerun_files_separated_by_with_whitespace() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "/home/users/mp/My Documents/tests/bar.feature:2 /home/users/mp/My Documents/tests/foo.feature:4"); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + assertThat(runtimeOptions.getFeaturePaths(), contains( + "/home/users/mp/My Documents/tests/bar.feature", + "/home/users/mp/My Documents/tests/foo.feature" + )); + assertThat(runtimeOptions.getLineFilters(), equalTo(new HashMap>() { + { + put("/home/users/mp/My Documents/tests/bar.feature", singletonList(2L)); + put("/home/users/mp/My Documents/tests/foo.feature", singletonList(4L)); + } + })); + } + + @Test + public void understands_rerun_files_without_separation_in_rerun_filepath() throws Exception { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "/home/users/mp/My Documents/tests/bar.feature:2/home/users/mp/My Documents/tests/foo.feature:4" + ); + + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); + + assertThat(runtimeOptions.getFeaturePaths(), contains( + "/home/users/mp/My Documents/tests/bar.feature", + "/home/users/mp/My Documents/tests/foo.feature" + )); + assertThat(runtimeOptions.getLineFilters(), equalTo(new HashMap>() { + { + put("/home/users/mp/My Documents/tests/bar.feature", singletonList(2L)); + put("/home/users/mp/My Documents/tests/foo.feature", singletonList(4L)); + } + })); + } + + @Test + public void clobbers_tag_and_name_filters_from_cli_if_rerun_file_specified_in_cucumber_options_property() throws IOException { + ResourceLoader resourceLoader = mockFileResource( + "path/rerun.txt", + "foo.feature:4" + ); + + Properties properties = new Properties(); + properties.setProperty("cucumber.options", "@path/rerun.txt"); + Env env = new Env(properties); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, env, + asList("--tags", "@should_be_clobbered", "--name", "should_be_clobbered")); + + assertEquals(Collections.emptyList(), runtimeOptions.getTagFilters()); + } + + private ResourceLoader mockFileResource(String path, String contents) throws IOException { + ResourceLoader resourceLoader = mock(ResourceLoader.class); + Resource resource = mock(Resource.class); + when(resource.getPath()).thenReturn(path); + when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(contents.getBytes(UTF_8))); + when(resourceLoader.resources(path, null)).thenReturn(singletonList(resource)); + return resourceLoader; + } + +} diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index dd77a0d30d..b09f7892c8 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -6,23 +6,25 @@ import cucumber.api.event.EventPublisher; import cucumber.api.formatter.ColorAware; import cucumber.api.formatter.StrictAware; -import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.TimeService; +import io.cucumber.core.event.EventBus; import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.plugin.Plugins; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Properties; import java.util.regex.Pattern; import static java.util.Arrays.asList; +import static java.util.Collections.singletonMap; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -30,6 +32,10 @@ public class RuntimeOptionsTest { + public final Env env = new Env(); + public final EventBus eventBus = new TimeServiceEventBus(TimeService.SYSTEM); + public final ResourceLoader resourceLoader = new MultiLoader(RuntimeOptionsTest.class.getClassLoader()); + @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -46,119 +52,118 @@ public void has_usage() { @Test public void assigns_feature_paths() { - RuntimeOptions options = new RuntimeOptions("--glue somewhere somewhere_else"); + RuntimeOptions options = createRuntimeOptions("--glue", "somewhere", "somewhere_else"); assertEquals(asList("somewhere_else"), options.getFeaturePaths()); } @Test public void strips_line_filters_from_feature_paths_and_put_them_among_line_filters() { - RuntimeOptions options = new RuntimeOptions("--glue somewhere somewhere_else:3"); + RuntimeOptions options = createRuntimeOptions("--glue", "somewhere", "somewhere_else:3"); assertEquals(asList("somewhere_else"), options.getFeaturePaths()); - Map> expectedLineFilters = new HashMap>(Collections.singletonMap("somewhere_else", asList(3L))); - assertEquals(expectedLineFilters, options.getLineFilters()); + assertEquals(singletonMap("somewhere_else", asList(3L)), options.getLineFilters()); } @Test public void assigns_filters_from_tags() { - RuntimeOptions options = new RuntimeOptions("--tags @keep_this somewhere_else"); + RuntimeOptions options = createRuntimeOptions("--tags", "@keep_this", "somewhere_else"); assertEquals(asList("somewhere_else"), options.getFeaturePaths()); assertEquals(asList("@keep_this"), options.getTagFilters()); } @Test public void strips_options() { - RuntimeOptions options = new RuntimeOptions(" --glue somewhere somewhere_else"); + RuntimeOptions options = createRuntimeOptions(" --glue", "somewhere", "somewhere_else"); assertEquals(asList("somewhere_else"), options.getFeaturePaths()); } @Test public void assigns_glue() { - RuntimeOptions options = new RuntimeOptions("--glue somewhere"); + RuntimeOptions options = createRuntimeOptions("--glue", "somewhere"); assertEquals(asList("somewhere"), options.getGlue()); } @Test public void creates_html_formatter() { - RuntimeOptions options = new RuntimeOptions(asList("--plugin", "html:target/cucumber-reports", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + RuntimeOptions options = createRuntimeOptions("--plugin", "html:target/cucumber-reports", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); assertEquals("io.cucumber.core.plugin.HTMLFormatter", plugins.getPlugins().get(0).getClass().getName()); } @Test public void creates_progress_formatter_as_default() { - RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + RuntimeOptions options = createRuntimeOptions("--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); assertEquals("io.cucumber.core.plugin.ProgressFormatter", plugins.getPlugins().get(0).getClass().getName()); } @Test public void creates_progress_formatter_when_no_formatter_plugin_is_specified() { - RuntimeOptions options = new RuntimeOptions(asList("--plugin", "io.cucumber.core.plugin.AnyStepDefinitionReporter", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + RuntimeOptions options = createRuntimeOptions("--plugin", "io.cucumber.core.plugin.AnyStepDefinitionReporter", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.ProgressFormatter"); } @Test public void creates_default_summary_printer_when_no_summary_printer_plugin_is_specified() { - RuntimeOptions options = new RuntimeOptions(asList("--plugin", "pretty", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + RuntimeOptions options = createRuntimeOptions("--plugin", "pretty", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test public void creates_null_summary_printer() { - RuntimeOptions options = new RuntimeOptions(asList("--plugin", "null_summary", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + RuntimeOptions options = createRuntimeOptions("--plugin", "null_summary", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.NullSummaryPrinter"); assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @Test public void assigns_strict() { - RuntimeOptions options = new RuntimeOptions(asList("--strict", "--glue", "somewhere")); + RuntimeOptions options = createRuntimeOptions("--strict", "--glue", "somewhere"); assertTrue(options.isStrict()); } @Test public void assigns_strict_short() { - RuntimeOptions options = new RuntimeOptions(asList("-s", "--glue", "somewhere")); + RuntimeOptions options = createRuntimeOptions("-s", "--glue", "somewhere"); assertTrue(options.isStrict()); } @Test public void default_strict() { - RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere")); + RuntimeOptions options = createRuntimeOptions("--glue", "somewhere"); assertFalse(options.isStrict()); } @Test public void assigns_wip() { - RuntimeOptions options = new RuntimeOptions(asList("--wip", "--glue", "somewhere")); + RuntimeOptions options = createRuntimeOptions("--wip", "--glue", "somewhere"); assertTrue(options.isWip()); } @Test public void assigns_wip_short() { - RuntimeOptions options = new RuntimeOptions(asList("-w", "--glue", "somewhere")); + RuntimeOptions options = createRuntimeOptions("-w", "--glue", "somewhere"); assertTrue(options.isWip()); } @Test public void default_wip() { - RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere")); + RuntimeOptions options = createRuntimeOptions("--glue", "somewhere"); assertFalse(options.isWip()); } @Test public void name_without_spaces_is_preserved() { - RuntimeOptions options = new RuntimeOptions(asList("--name", "someName")); + RuntimeOptions options = createRuntimeOptions("--name", "someName"); Pattern actualPattern = options.getNameFilters().iterator().next(); assertEquals("someName", actualPattern.pattern()); } @Test public void name_with_spaces_is_preserved() { - RuntimeOptions options = new RuntimeOptions(asList("--name", "some Name")); + RuntimeOptions options = createRuntimeOptions("--name", "some Name"); Pattern actualPattern = options.getNameFilters().iterator().next(); assertEquals("some Name", actualPattern.pattern()); } @@ -167,27 +172,27 @@ public void name_with_spaces_is_preserved() { public void ensure_name_with_spaces_works_with_cucumber_options() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--name 'some Name'"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), Collections.emptyList()); + RuntimeOptions options = new RuntimeOptions(resourceLoader, new Env(properties), Collections.emptyList()); Pattern actualPattern = options.getNameFilters().iterator().next(); assertEquals("some Name", actualPattern.pattern()); } @Test public void ensure_name_with_spaces_works_with_args() { - RuntimeOptions options = new RuntimeOptions("--name 'some Name'"); + RuntimeOptions options = createRuntimeOptions("--name", "some Name"); Pattern actualPattern = options.getNameFilters().iterator().next(); assertEquals("some Name", actualPattern.pattern()); } @Test public void assigns_single_junit_option() { - RuntimeOptions options = new RuntimeOptions(asList("--junit,option")); + RuntimeOptions options = createRuntimeOptions("--junit,option"); assertEquals(asList("option"), options.getJunitOptions()); } @Test public void assigns_multiple_junit_options() { - RuntimeOptions options = new RuntimeOptions(asList("--junit,option1,option2=value")); + RuntimeOptions options = createRuntimeOptions("--junit,option1,option2=value"); assertEquals(asList("option1", "option2=value"), options.getJunitOptions()); } @@ -195,7 +200,7 @@ public void assigns_multiple_junit_options() { public void clobbers_junit_options_from_cli_if_junit_options_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--junit,option_from_property"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--junit,option_to_be_clobbered")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--junit,option_to_be_clobbered"); assertEquals(asList("option_from_property"), runtimeOptions.getJunitOptions()); } @@ -203,7 +208,7 @@ public void clobbers_junit_options_from_cli_if_junit_options_specified_in_cucumb public void overrides_options_with_system_properties_without_clobbering_non_overridden_ones() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--glue lookatme this_clobbers_feature_paths"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--strict", "--glue", "somewhere", "somewhere_else")); + RuntimeOptions options = createRuntimeOptions(properties, "--strict", "--glue", "somewhere", "somewhere_else"); assertEquals(asList("this_clobbers_feature_paths"), options.getFeaturePaths()); assertEquals(asList("lookatme"), options.getGlue()); assertTrue(options.isStrict()); @@ -213,7 +218,7 @@ public void overrides_options_with_system_properties_without_clobbering_non_over public void ensure_cli_glue_is_preserved_when_cucumber_options_property_defined() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--tags @foo"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--glue", "somewhere")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--glue", "somewhere"); assertEquals(asList("somewhere"), runtimeOptions.getGlue()); } @@ -221,7 +226,7 @@ public void ensure_cli_glue_is_preserved_when_cucumber_options_property_defined( public void clobbers_filters_from_cli_if_filters_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--tags @clobber_with_this"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@should_be_clobbered")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--tags", "@should_be_clobbered"); assertEquals(asList("@clobber_with_this"), runtimeOptions.getTagFilters()); } @@ -229,23 +234,16 @@ public void clobbers_filters_from_cli_if_filters_specified_in_cucumber_options_p public void clobbers_tag_and_name_filters_from_cli_if_line_filters_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "path/file.feature:3"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@should_be_clobbered", "--name", "should_be_clobbered")); - assertEquals(Collections.emptyList(), runtimeOptions.getTagFilters()); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--tags", "@should_be_clobbered", "--name", "should_be_clobbered"); + assertEquals(Collections.emptyList(), runtimeOptions.getTagFilters()); } - @Test - public void clobbers_tag_and_name_filters_from_cli_if_rerun_file_specified_in_cucumber_options_property() { - Properties properties = new Properties(); - properties.setProperty("cucumber.options", "@rerun.txt"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@should_be_clobbered", "--name", "should_be_clobbered")); - assertEquals(Collections.emptyList(), runtimeOptions.getTagFilters()); - } @Test public void preserves_filters_from_cli_if_filters_not_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--strict"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@keep_this")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--tags", "@keep_this"); assertEquals(asList("@keep_this"), runtimeOptions.getTagFilters()); } @@ -253,7 +251,7 @@ public void preserves_filters_from_cli_if_filters_not_specified_in_cucumber_opti public void clobbers_features_from_cli_if_features_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "new newer"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("old", "older")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "old", "older"); assertEquals(asList("new", "newer"), runtimeOptions.getFeaturePaths()); } @@ -261,7 +259,7 @@ public void clobbers_features_from_cli_if_features_specified_in_cucumber_options public void strips_lines_from_features_from_cli_if_filters_are_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--tags @Tag"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("path/file.feature:3")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "path/file.feature:3"); assertEquals(asList("path/file.feature"), runtimeOptions.getFeaturePaths()); } @@ -269,7 +267,7 @@ public void strips_lines_from_features_from_cli_if_filters_are_specified_in_cucu public void preserves_features_from_cli_if_features_not_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--plugin pretty"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("old", "older")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "old", "older"); assertEquals(asList("old", "older"), runtimeOptions.getFeaturePaths()); } @@ -277,7 +275,7 @@ public void preserves_features_from_cli_if_features_not_specified_in_cucumber_op public void clobbers_line_filters_from_cli_if_features_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "new newer"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@keep_this", "path/file1.feature:1")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--tags", "@keep_this", "path/file1.feature:1"); assertEquals(asList("new", "newer"), runtimeOptions.getFeaturePaths()); assertEquals(asList("@keep_this"), runtimeOptions.getTagFilters()); } @@ -286,8 +284,8 @@ public void clobbers_line_filters_from_cli_if_features_specified_in_cucumber_opt public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--plugin pretty"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:target/cucumber-reports", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + RuntimeOptions options = createRuntimeOptions(properties, "--plugin", "html:target/cucumber-reports", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.PrettyFormatter"); assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.HTMLFormatter"); } @@ -296,8 +294,8 @@ public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucum public void adds_to_formatter_plugins_with_add_plugin_option() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--add-plugin pretty"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:target/cucumber-reports", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + RuntimeOptions options = createRuntimeOptions(properties, "--plugin", "html:target/cucumber-reports", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.HTMLFormatter"); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.PrettyFormatter"); } @@ -306,8 +304,8 @@ public void adds_to_formatter_plugins_with_add_plugin_option() { public void clobbers_summary_plugins_from_cli_if_summary_printer_specified_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--plugin default_summary"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "null_summary", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + RuntimeOptions options = createRuntimeOptions(properties, "--plugin", "null_summary", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); assertPluginNotExists(plugins.getPlugins(), "io.cucumber.core.plugin.NullSummaryPrinter"); } @@ -316,8 +314,8 @@ public void clobbers_summary_plugins_from_cli_if_summary_printer_specified_in_cu public void adds_to_summary_plugins_with_add_plugin_option() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--add-plugin default_summary"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "null_summary", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + RuntimeOptions options = createRuntimeOptions(properties, "--plugin", "null_summary", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.NullSummaryPrinter"); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @@ -326,8 +324,8 @@ public void adds_to_summary_plugins_with_add_plugin_option() { public void does_not_clobber_plugins_of_different_type_when_specifying_plugins_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--plugin default_summary"); - RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "pretty", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + RuntimeOptions options = createRuntimeOptions(properties, "--plugin", "pretty", "--glue", "somewhere"); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); // assertPluginExists(options.getPlugins(), "io.cucumber.core.plugin.CucumberPrettyFormatter"); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @@ -336,14 +334,14 @@ public void does_not_clobber_plugins_of_different_type_when_specifying_plugins_i public void allows_removal_of_strict_in_cucumber_options_property() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--no-strict"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--strict")); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--strict"); assertFalse(runtimeOptions.isStrict()); } @Test public void fail_on_unsupported_options() { try { - new RuntimeOptions(asList("-concreteUnsupportedOption", "somewhere", "somewhere_else")); + createRuntimeOptions("-concreteUnsupportedOption", "somewhere", "somewhere_else"); fail(); } catch (CucumberException e) { assertEquals("Unknown option: -concreteUnsupportedOption", e.getMessage()); @@ -352,13 +350,13 @@ public void fail_on_unsupported_options() { @Test public void threads_default_1() { - RuntimeOptions options = new RuntimeOptions(Collections.emptyList()); + RuntimeOptions options = createRuntimeOptions(); assertEquals(1, options.getThreads()); } @Test public void ensure_threads_param_is_used() { - RuntimeOptions options = new RuntimeOptions(asList("--threads", "10")); + RuntimeOptions options = createRuntimeOptions("--threads", "10"); assertEquals(10, options.getThreads()); } @@ -366,7 +364,7 @@ public void ensure_threads_param_is_used() { public void ensure_less_than_1_thread_is_not_allowed() { expectedException.expect(CucumberException.class); expectedException.expectMessage("--threads must be > 0"); - new RuntimeOptions(asList("--threads", "0")); + createRuntimeOptions("--threads", "0"); } public static final class AwareFormatter implements StrictAware, ColorAware, EventListener { @@ -399,18 +397,17 @@ public void setEventPublisher(EventPublisher publisher) { } @Test - public void set_monochrome_on_color_aware_formatters() throws Exception { - RuntimeOptions options = new RuntimeOptions(new Env(), asList("--monochrome", "--plugin", AwareFormatter.class.getName())); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - plugins.getPlugins(); + public void set_monochrome_on_color_aware_formatters() { + RuntimeOptions options = createRuntimeOptions("--monochrome", "--plugin", AwareFormatter.class.getName()); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); AwareFormatter formatter = (AwareFormatter) plugins.getPlugins().get(0); assertTrue(formatter.isMonochrome()); } @Test - public void set_strict_on_strict_aware_formatters() throws Exception { - RuntimeOptions options = new RuntimeOptions(new Env(), asList("--strict", "--plugin", AwareFormatter.class.getName())); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + public void set_strict_on_strict_aware_formatters() { + RuntimeOptions options = createRuntimeOptions("--strict", "--plugin", AwareFormatter.class.getName()); + Plugins plugins = new Plugins(new PluginFactory(), eventBus, options); AwareFormatter formatter = (AwareFormatter) plugins.getPlugins().get(0); assertTrue(formatter.isStrict()); } @@ -418,7 +415,7 @@ public void set_strict_on_strict_aware_formatters() throws Exception { @Test public void ensure_default_snippet_type_is_underscore() { Properties properties = new Properties(); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), Collections.emptyList()); + RuntimeOptions runtimeOptions = createRuntimeOptions(); assertEquals(SnippetType.UNDERSCORE, runtimeOptions.getSnippetType()); } @@ -426,10 +423,18 @@ public void ensure_default_snippet_type_is_underscore() { public void set_snippet_type() { Properties properties = new Properties(); properties.setProperty("cucumber.options", "--snippets camelcase"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), Collections.emptyList()); + RuntimeOptions runtimeOptions = createRuntimeOptions(properties); assertEquals(SnippetType.CAMELCASE, runtimeOptions.getSnippetType()); } + private RuntimeOptions createRuntimeOptions(Properties properties, String... argv) { + return new RuntimeOptions(resourceLoader, new Env(properties), asList(argv)); + } + + private RuntimeOptions createRuntimeOptions(String... argv) { + return new RuntimeOptions(resourceLoader, new Env(), asList(argv)); + } + private void assertPluginExists(List plugins, String pluginName) { assertTrue(pluginName + " not found among the plugins", pluginExists(plugins, pluginName)); } diff --git a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java index 0f4f573746..f29e91da5c 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java @@ -4,6 +4,8 @@ import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.options.Env; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.StubStepDefinition; import gherkin.events.PickleEvent; @@ -22,6 +24,7 @@ import java.util.List; import java.util.Locale; +import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; @@ -31,7 +34,7 @@ public class HookOrderTest { private final static String ENGLISH = "en"; - private final RuntimeOptions runtimeOptions = new RuntimeOptions(""); + private final RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); private final EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); private final StubStepDefinition stepDefinition = new StubStepDefinition("pattern1", new TypeRegistry(Locale.ENGLISH)); diff --git a/core/src/test/java/io/cucumber/core/runner/HookTest.java b/core/src/test/java/io/cucumber/core/runner/HookTest.java index db99dfe50e..fe2b82b8b8 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTest.java @@ -5,6 +5,8 @@ import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.Backend; import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.options.Env; import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import gherkin.pickles.Argument; @@ -20,6 +22,7 @@ import java.util.Collections; +import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; @@ -29,8 +32,9 @@ public class HookTest { private final static String ENGLISH = "en"; + private final MultiLoader resoureceLoader = new MultiLoader(RuntimeOptions.class.getClassLoader()); private final EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); - private final RuntimeOptions runtimeOptions = new RuntimeOptions(""); + private final RuntimeOptions runtimeOptions = new RuntimeOptions(resoureceLoader, Env.INSTANCE, emptyList()); private final PickleStep pickleStep = new PickleStep("pattern1", Collections.emptyList(), singletonList(new PickleLocation(2, 2))); private final PickleEvent pickleEvent = new PickleEvent("uri", new Pickle("scenario1", ENGLISH, singletonList(pickleStep), Collections.emptyList(), singletonList(new PickleLocation(1, 1)))); diff --git a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java index 57225283c9..7998abaaca 100644 --- a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -7,6 +7,8 @@ import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.backend.Backend; import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.options.Env; import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; @@ -25,6 +27,7 @@ import java.util.List; import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; @@ -44,7 +47,7 @@ public class RunnerTest { private static final List MOCK_LOCATIONS = asList(mock(PickleLocation.class)); - private final RuntimeOptions runtimeOptions = new RuntimeOptions(""); + private final RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); private final EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); @@ -189,7 +192,7 @@ public void loadGlue(Glue glue, List gluePaths) { public void steps_are_not_executed_on_dry_run() throws Throwable { final StepDefinition stepDefinition = mock(StepDefinition.class); final PickleEvent pickleEvent = createPickleEventMatchingStepDefinitions(asList(stepDefinition)); - RuntimeOptions runtimeOptions = new RuntimeOptions("--dry-run"); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, singletonList("--dry-run")); TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions){ @Override public void loadGlue(Glue glue, List gluePaths) { @@ -203,7 +206,7 @@ public void loadGlue(Glue glue, List gluePaths) { @Test public void hooks_not_executed_in_dry_run_mode() throws Throwable { - RuntimeOptions runtimeOptions = new RuntimeOptions("--dry-run"); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, singletonList("--dry-run")); final HookDefinition beforeHook = addBeforeHook(); final HookDefinition afterHook = addAfterHook(); diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index d5a9c5d238..4f261899ab 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -73,7 +73,7 @@ public enum TimeServiceType { private TimeServiceType timeServiceType = TimeServiceType.FIXED_INCREMENT_ON_STEP_START; private long timeServiceIncrement = 0L; private Object formatterUnderTest = null; - private Iterable runtimeArgs = Collections.emptyList(); + private List runtimeArgs = Collections.emptyList(); private TestHelper() { } @@ -272,11 +272,6 @@ private static void mockHook(final SimpleEntry hookEntry, public void run() { - final StringBuilder args = new StringBuilder(); - for (final String arg : runtimeArgs) { - args.append(" ").append(arg); - } - final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); final ResourceLoader resourceLoader = TestClasspathResourceLoader.create(classLoader); @@ -297,7 +292,7 @@ public void run() { : new TestFeatureSupplier(bus, features); Runtime.Builder runtimeBuilder = Runtime.builder() - .withArg(args.toString()) + .withArgs(runtimeArgs) .withClassLoader(classLoader) .withResourceLoader(resourceLoader) .withBackendSupplier(backendSupplier) diff --git a/core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java index b8630fa429..f5778015d3 100644 --- a/core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java @@ -6,6 +6,7 @@ import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.options.Env; import io.cucumber.core.options.RuntimeOptions; import org.junit.Rule; import org.junit.Test; @@ -27,7 +28,7 @@ public class BackendModuleBackendSupplierTest { @Test public void should_create_a_backend() { ClassLoader classLoader = getClass().getClassLoader(); - RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions, singletonList("io.cucumber.core.backend")); @@ -37,7 +38,7 @@ public void should_create_a_backend() { @Test public void should_throw_an_exception_when_no_backend_could_be_found() { ClassLoader classLoader = getClass().getClassLoader(); - RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions, singletonList("no.backend.here")); diff --git a/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java index 63c993a4af..44f3407b4f 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java @@ -5,6 +5,8 @@ import cucumber.api.TestCase; import cucumber.api.event.TestCaseFinished; import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.options.RuntimeOptions; @@ -37,7 +39,7 @@ private TestCaseFinished testCaseFinishedWithStatus(Result.Type resultStatus) { } private void createExitStatus(String... runtimeArgs) { - RuntimeOptions runtimeOptions = new RuntimeOptions(asList(runtimeArgs)); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, asList(runtimeArgs)); this.bus = new TimeServiceEventBus(TimeService.SYSTEM); exitStatus = new Runtime.ExitStatus(runtimeOptions); exitStatus.setEventPublisher(bus); diff --git a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java index 1d4ba995ba..b08e86dd28 100644 --- a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java @@ -2,20 +2,21 @@ import io.cucumber.core.event.EventBus; +import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runtime.BackendModuleBackendSupplier; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.runtime.SingletonRunnerSupplier; import org.junit.Before; import org.junit.Test; import java.util.Collections; +import static io.cucumber.core.options.Env.INSTANCE; +import static java.util.Collections.emptyList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertSame; @@ -29,8 +30,8 @@ public class SingletonRunnerSupplierTest { @Before public void before() { ClassLoader classLoader = getClass().getClassLoader(); - RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, INSTANCE, emptyList()); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); BackendModuleBackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); EventBus eventBus = new TimeServiceEventBus(TimeService.SYSTEM); diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 29b7cbf0d3..9cb0dbffcc 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -4,6 +4,7 @@ import cucumber.api.event.EventHandler; import cucumber.api.event.TestCaseStarted; import io.cucumber.core.event.EventBus; +import io.cucumber.core.options.Env; import io.cucumber.core.runner.Runner; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; @@ -33,7 +34,7 @@ public class ThreadLocalRunnerSupplierTest { @Before public void before() { ClassLoader classLoader = getClass().getClassLoader(); - RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); BackendModuleBackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index d7180199df..4551b7c04e 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -5,6 +5,7 @@ import cucumber.api.event.TestStepFinished; import cucumber.api.java.ObjectFactory; import cucumber.api.java.en.Given; +import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.Runner; @@ -36,6 +37,7 @@ import static java.lang.Thread.currentThread; import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; @@ -69,7 +71,7 @@ public void createBackendAndLoadNoGlue() { ObjectFactory factory = new SingletonFactory(defs); TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); this.backend = new JavaBackend(factory, classFinder, typeRegistry); - RuntimeOptions runtimeOptions = new RuntimeOptions(""); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); BackendSupplier backendSupplier = new BackendSupplier() { @Override diff --git a/junit/src/main/java/cucumber/api/junit/Cucumber.java b/junit/src/main/java/cucumber/api/junit/Cucumber.java index 6c5c02aee9..8aa33d02ec 100644 --- a/junit/src/main/java/cucumber/api/junit/Cucumber.java +++ b/junit/src/main/java/cucumber/api/junit/Cucumber.java @@ -16,7 +16,6 @@ import io.cucumber.core.runtime.FeaturePathFeatureSupplier; import io.cucumber.core.filter.Filters; import io.cucumber.core.plugin.Plugins; -import io.cucumber.core.filter.RerunFilters; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.model.FeatureLoader; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; @@ -79,13 +78,13 @@ public Cucumber(Class clazz) throws InitializationError { super(clazz); ClassLoader classLoader = clazz.getClassLoader(); Assertions.assertNoCucumberAnnotatedMethods(clazz); + ResourceLoader resourceLoader = new MultiLoader(classLoader); - RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(clazz); + RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(clazz, resourceLoader); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); this.bus = new TimeServiceEventBus(TimeService.SYSTEM); - ResourceLoader resourceLoader = new MultiLoader(classLoader); FeatureLoader featureLoader = new FeatureLoader(resourceLoader); FeaturePathFeatureSupplier featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions, bus); @@ -93,8 +92,7 @@ public Cucumber(Class clazz) throws InitializationError { BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); Plugins plugins = new Plugins(new PluginFactory(), bus, runtimeOptions); this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); - RerunFilters rerunFilters = new RerunFilters(runtimeOptions, featureLoader); - this.filters = new Filters(runtimeOptions, rerunFilters); + this.filters = new Filters(runtimeOptions); this.junitOptions = new JUnitOptions(runtimeOptions.isStrict(), runtimeOptions.getJunitOptions()); final StepDefinitionReporter stepDefinitionReporter = plugins.stepDefinitionReporter(); diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index 05884dae30..48de7a349b 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -1,7 +1,9 @@ package io.cucumber.junit; +import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeService; @@ -10,7 +12,6 @@ import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import io.cucumber.core.filter.Filters; -import io.cucumber.core.filter.RerunFilters; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.model.FeatureLoader; import org.junit.Test; @@ -154,7 +155,7 @@ private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, Strin } private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, JUnitOptions junitOption) throws InitializationError { - final RuntimeOptions runtimeOptions = new RuntimeOptions(""); + final RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); final TimeService timeServiceStub = new TimeService() { @Override @@ -176,8 +177,7 @@ public Iterable resources(String path, String suffix) { return emptyList(); } }); - RerunFilters rerunFilters = new RerunFilters(runtimeOptions, featureLoader); - Filters filters = new Filters(runtimeOptions, rerunFilters); + Filters filters = new Filters(runtimeOptions); ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); return new FeatureRunner(cucumberFeature, filters, runnerSupplier, junitOption); } diff --git a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java b/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java index 2690f520bb..ab6e29fe9a 100644 --- a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java @@ -12,7 +12,6 @@ import io.cucumber.core.model.FeatureCompiler; import io.cucumber.core.filter.Filters; import io.cucumber.core.plugin.Plugins; -import io.cucumber.core.filter.RerunFilters; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.model.FeatureLoader; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; @@ -47,7 +46,7 @@ public TestNGCucumberRunner(Class clazz) { ClassLoader classLoader = clazz.getClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); - RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(clazz); + RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(clazz, resourceLoader); runtimeOptions = runtimeOptionsFactory.create(); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); @@ -55,8 +54,7 @@ public TestNGCucumberRunner(Class clazz) { bus = new TimeServiceEventBus(TimeService.SYSTEM); new Plugins(new PluginFactory(), bus, runtimeOptions); FeatureLoader featureLoader = new FeatureLoader(resourceLoader); - RerunFilters rerunFilters = new RerunFilters(runtimeOptions, featureLoader); - filters = new Filters(runtimeOptions, rerunFilters); + filters = new Filters(runtimeOptions); this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions, bus); } From 1ecba8560bccdf0597412cc0270e5065cbab8d28 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sat, 8 Sep 2018 21:55:38 +0200 Subject: [PATCH 031/155] [Core] Remove dependency from filters to options --- .../main/java/io/cucumber/core/filter/Filters.java | 9 ++++----- .../main/java/io/cucumber/core/filter/Options.java | 13 +++++++++++++ .../io/cucumber/core/options/RuntimeOptions.java | 7 ++++++- .../java/io/cucumber/core/runtime/Runtime.java | 14 ++++++++------ 4 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/filter/Options.java diff --git a/core/src/main/java/io/cucumber/core/filter/Filters.java b/core/src/main/java/io/cucumber/core/filter/Filters.java index cbc96943a1..ba4bfed509 100644 --- a/core/src/main/java/io/cucumber/core/filter/Filters.java +++ b/core/src/main/java/io/cucumber/core/filter/Filters.java @@ -1,6 +1,5 @@ package io.cucumber.core.filter; -import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import java.util.ArrayList; @@ -12,17 +11,17 @@ public final class Filters { private final List filters; - public Filters(RuntimeOptions runtimeOptions) { + public Filters(Options options) { filters = new ArrayList<>(); - List tagFilters = runtimeOptions.getTagFilters(); + List tagFilters = options.getTagFilters(); if (!tagFilters.isEmpty()) { this.filters.add(new TagPredicate(tagFilters)); } - List nameFilters = runtimeOptions.getNameFilters(); + List nameFilters = options.getNameFilters(); if (!nameFilters.isEmpty()) { this.filters.add(new NamePredicate(nameFilters)); } - Map> lineFilters = runtimeOptions.getLineFilters(); + Map> lineFilters = options.getLineFilters(); if (!lineFilters.isEmpty()) { this.filters.add(new LinePredicate(lineFilters)); } diff --git a/core/src/main/java/io/cucumber/core/filter/Options.java b/core/src/main/java/io/cucumber/core/filter/Options.java new file mode 100644 index 0000000000..7b44cc257a --- /dev/null +++ b/core/src/main/java/io/cucumber/core/filter/Options.java @@ -0,0 +1,13 @@ +package io.cucumber.core.filter; + +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public interface Options { + List getTagFilters(); + + List getNameFilters(); + + Map> getLineFilters(); +} diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 670aaa8298..d125dad957 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -29,7 +29,12 @@ import static java.util.Arrays.asList; // IMPORTANT! Make sure USAGE.txt is always uptodate if this class changes. -public final class RuntimeOptions implements io.cucumber.core.plugin.Options, io.cucumber.core.runner.Options { +public final class RuntimeOptions + implements + io.cucumber.core.plugin.Options, + io.cucumber.core.runner.Options, + io.cucumber.core.filter.Options { + static final String VERSION = ResourceBundle.getBundle("io.cucumber.core.version").getString("cucumber-jvm.version"); private static final String USAGE_RESOURCE = "/cucumber/api/cli/USAGE.txt"; private static final Pattern RERUN_PATH_SPECIFICATION = Pattern.compile("(?m:^| |)(.*?\\.feature(?:(?::\\d+)*))"); diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index e3bacc184c..4b6279a6cc 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -3,8 +3,8 @@ import cucumber.api.Plugin; import cucumber.api.Result; import cucumber.api.StepDefinitionReporter; +import cucumber.api.event.ConcurrentEventListener; import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; import cucumber.api.event.EventPublisher; import cucumber.api.event.TestCaseFinished; import cucumber.api.event.TestRunFinished; @@ -56,7 +56,7 @@ public final class Runtime { private final ExecutorService executor; private Runtime(final Plugins plugins, - final RuntimeOptions runtimeOptions, + final ExitStatus exitStatus, final EventBus bus, final Filters filters, final RunnerSupplier runnerSupplier, @@ -69,8 +69,7 @@ private Runtime(final Plugins plugins, this.runnerSupplier = runnerSupplier; this.featureSupplier = featureSupplier; this.executor = executor; - this.exitStatus = new ExitStatus(runtimeOptions); - exitStatus.setEventPublisher(bus); + this.exitStatus = exitStatus; } public void run() { @@ -197,6 +196,8 @@ public Runtime build() { for (final Plugin plugin : additionalPlugins) { plugins.addPlugin(plugin); } + final ExitStatus exitStatus = new ExitStatus(runtimeOptions); + plugins.addPlugin(exitStatus); final RunnerSupplier runnerSupplier = runtimeOptions.isMultiThreaded() ? new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier) @@ -214,7 +215,8 @@ public Runtime build() { : new FeaturePathFeatureSupplier(featureLoader, runtimeOptions, this.eventBus); final Filters filters = new Filters(runtimeOptions); - return new Runtime(plugins, runtimeOptions, eventBus, filters, runnerSupplier, featureSupplier, executor); + + return new Runtime(plugins, exitStatus, eventBus, filters, runnerSupplier, featureSupplier, executor); } } @@ -251,7 +253,7 @@ public boolean awaitTermination(long timeout, TimeUnit unit) { } } - static final class ExitStatus implements EventListener { + static final class ExitStatus implements ConcurrentEventListener { private static final byte DEFAULT = 0x0; private static final byte ERRORS = 0x1; From e029121744ad9f3736894a8e751d4b50fe59bf79 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 9 Sep 2018 23:42:03 +0200 Subject: [PATCH 032/155] [Core] Move core api packages to io.cucumber.core.api --- core/pom.xml | 2 +- .../cucumber/core}/api/Scenario.java | 4 +- .../cucumber/core}/api/TypeRegistry.java | 2 +- .../core}/api/TypeRegistryConfigurer.java | 2 +- .../cucumber/core}/api/cli/Main.java | 2 +- .../cucumber/core/api/event}/Argument.java | 2 +- .../core}/api/event/CanonicalEventOrder.java | 2 +- .../api/event/ConcurrentEventListener.java | 6 +-- .../cucumber/core}/api/event/EmbedEvent.java | 4 +- .../cucumber/core}/api/event/Event.java | 2 +- .../core}/api/event/EventHandler.java | 2 +- .../core}/api/event/EventListener.java | 4 +- .../core}/api/event/EventPublisher.java | 2 +- .../core/api/event}/HookTestStep.java | 11 ++++-- .../cucumber/core/api/event}/HookType.java | 2 +- .../core/api/event}/PickleStepTestStep.java | 2 +- .../cucumber/core/api/event}/Result.java | 2 +- .../api/event/SnippetsSuggestedEvent.java | 2 +- .../cucumber/core/api/event}/TestCase.java | 2 +- .../core}/api/event/TestCaseEvent.java | 4 +- .../core}/api/event/TestCaseFinished.java | 5 +-- .../core}/api/event/TestCaseStarted.java | 4 +- .../core}/api/event/TestRunFinished.java | 2 +- .../core}/api/event/TestRunStarted.java | 2 +- .../core}/api/event/TestSourceRead.java | 2 +- .../cucumber/core/api/event}/TestStep.java | 9 +++-- .../core}/api/event/TestStepFinished.java | 8 +--- .../core}/api/event/TestStepStarted.java | 7 +--- .../core}/api/event/TimeStampedEvent.java | 2 +- .../cucumber/core}/api/event/WriteEvent.java | 4 +- .../core/api/options}/CucumberOptions.java | 6 ++- .../core/api/options}/SnippetType.java | 2 +- .../cucumber/core/api/plugin}/ColorAware.java | 4 +- .../cucumber/core/api/plugin}/Formatter.java | 5 +-- .../cucumber/core/api/plugin}/Plugin.java | 18 +++++---- .../api/plugin}/StepDefinitionReporter.java | 3 +- .../core/api/plugin}/StrictAware.java | 4 +- .../core/api/plugin}/SummaryPrinter.java | 4 +- .../io/cucumber/core/backend/Backend.java | 2 +- .../cucumber/core/backend/HookDefinition.java | 2 +- .../cucumber/core/backend}/Pending.java | 5 +-- .../core/backend/StepDefinitionMatch.java | 2 +- .../cucumber/core/event/AbstractEventBus.java | 2 +- .../core/event/AbstractEventPublisher.java | 6 +-- .../java/io/cucumber/core/event/EventBus.java | 4 +- .../cucumber/core/options/PluginOption.java | 10 ++--- .../cucumber/core/options/RuntimeOptions.java | 3 +- .../core/options/RuntimeOptionsFactory.java | 2 +- .../plugin/CanonicalOrderEventPublisher.java | 4 +- .../core/plugin/DefaultSummaryPrinter.java | 14 +++---- .../cucumber/core/plugin/HTMLFormatter.java | 28 +++++++------- .../cucumber/core/plugin/JSONFormatter.java | 34 ++++++++--------- .../cucumber/core/plugin/JUnitFormatter.java | 28 +++++++------- .../core/plugin/NullSummaryPrinter.java | 2 +- .../java/io/cucumber/core/plugin/Options.java | 4 +- .../cucumber/core/plugin/PluginFactory.java | 2 +- .../java/io/cucumber/core/plugin/Plugins.java | 18 ++++----- .../cucumber/core/plugin/PrettyFormatter.java | 30 +++++++-------- .../core/plugin/ProgressFormatter.java | 18 ++++----- .../cucumber/core/plugin/RerunFormatter.java | 14 +++---- .../java/io/cucumber/core/plugin/Stats.java | 22 +++++------ .../cucumber/core/plugin/TestNGFormatter.java | 24 ++++++------ .../core/plugin/TestSourcesModel.java | 2 +- .../core/plugin/TimelineFormatter.java | 18 ++++----- .../core/plugin/UndefinedStepsTracker.java | 10 ++--- .../cucumber/core/plugin/UsageFormatter.java | 16 ++++---- .../AmbiguousPickleStepDefinitionsMatch.java | 2 +- .../io/cucumber/core/runner/CachingGlue.java | 2 +- .../core/runner/DefinitionArgument.java | 2 +- .../FailedPickleStepInstantiationMatch.java | 2 +- .../core/runner/HookDefinitionMatch.java | 2 +- .../io/cucumber/core/runner/HookTestStep.java | 4 +- .../java/io/cucumber/core/runner/Options.java | 2 +- .../runner/PickleStepDefinitionMatch.java | 2 +- .../core/runner/PickleStepTestStep.java | 7 ++-- .../java/io/cucumber/core/runner/Runner.java | 6 +-- .../io/cucumber/core/runner/Scenario.java | 8 ++-- .../io/cucumber/core/runner/TestCase.java | 10 ++--- .../io/cucumber/core/runner/TestStep.java | 12 +++--- .../UndefinedPickleStepDefinitionMatch.java | 2 +- .../runtime/BackendModuleBackendSupplier.java | 4 +- .../runtime/FeaturePathFeatureSupplier.java | 2 +- .../io/cucumber/core/runtime/Runtime.java | 20 +++++----- .../runtime/ThreadLocalRunnerSupplier.java | 4 +- .../core/snippets/SnippetGenerator.java | 2 +- .../core/stepexpression/TypeRegistry.java | 2 +- .../api/event/CanonicalEventOrderTest.java | 11 +++++- .../cucumber/core/api/event}/ResultTest.java | 17 +++++---- .../io/cucumber/core/backend/StubBackend.java | 2 +- .../cucumber/core/io/ResourceLoaderTest.java | 2 +- .../options/RuntimeOptionsFactoryTest.java | 6 +-- .../core/options/RuntimeOptionsTest.java | 12 +++--- .../plugin/AnyStepDefinitionReporter.java | 2 +- .../io/cucumber/core/plugin/FormatterSpy.java | 16 ++++---- .../core/plugin/HTMLFormatterTest.java | 2 +- .../core/plugin/JSONFormatterTest.java | 4 +- .../core/plugin/JUnitFormatterTest.java | 2 +- .../core/plugin/PluginFactoryTest.java | 8 ++-- .../core/plugin/PrettyFormatterTest.java | 2 +- .../core/plugin/RerunFormatterTest.java | 2 +- .../io/cucumber/core/plugin/StatsTest.java | 2 +- .../cucumber/core/plugin/StubFormatter.java | 4 +- .../core/plugin/TestNGFormatterTest.java | 2 +- .../core/plugin/TimelineFormatterTest.java | 2 +- .../plugin/UndefinedStepsTrackerTest.java | 2 +- .../core/plugin/UsageFormatterTest.java | 10 ++--- .../AmbiguousStepDefinitionMatchsTest.java | 2 +- .../io/cucumber/core/runner/EventBusTest.java | 12 +++--- .../FailedStepInstantiationMatchTest.java | 2 +- .../cucumber/core/runner/HookOrderTest.java | 2 +- .../io/cucumber/core/runner/HookTest.java | 2 +- .../core/runner/HookTestStepTest.java | 8 ++-- .../core/runner/PickleStepTestStepTest.java | 36 +++++++++--------- .../io/cucumber/core/runner/RunnerTest.java | 4 +- .../core/runner/ScenarioResultTest.java | 6 +-- .../core/runner/StepDurationTimeService.java | 8 ++-- .../core/runner/TestBackendSupplier.java | 2 +- .../io/cucumber/core/runner/TestCaseTest.java | 10 ++--- .../core/runner/TestDefinitionArgument.java | 2 +- .../io/cucumber/core/runner/TestHelper.java | 34 ++++++++--------- .../core/runner/TestPendingException.java | 14 +++++++ .../core/runner/TestRunnerSupplier.java | 2 +- .../UndefinedStepDefinitionMatchTest.java | 2 +- .../cucumber/core/runtime/ExitStatusTest.java | 6 +-- .../io/cucumber/core/runtime/RuntimeTest.java | 14 +++---- .../core/runtime/TestFeatureSupplier.java | 2 +- .../ThreadLocalRunnerSupplierTest.java | 4 +- .../snippets/FunctionNameGeneratorTest.java | 2 +- .../io/cucumber/core/{io => }/bar.properties | 0 .../io/cucumber/core/{io => }/foo.properties | 0 .../core/{io => }/has spaces.properties | 0 .../java/calculator/ParameterTypes.java | 4 +- .../calculator/RpnCalculatorStepdefs.java | 2 +- .../calculator/RunCukesByCompositionTest.java | 2 +- .../java/calculator/RunCukesTest.java | 2 +- .../java/calculator/ParameterTypes.java | 4 +- .../calculator/RpnCalculatorStepdefs.java | 2 +- .../java/calculator/RunCukesTest.java | 2 +- .../calculator/RpnCalculatorStepdefs.java | 2 +- .../java/calculator/RunCukesTest.java | 2 +- .../calculator/TypeRegistryConfiguration.java | 4 +- .../examples/spring/txn/RunCukesTest.java | 2 +- .../spring/txn/TypeRegistryConfiguration.java | 4 +- .../cucumber/api/java}/PendingException.java | 4 +- .../java/cucumber/api/java}/Transpose.java | 2 +- .../java/io/cucumber/java/Java8Snippet.java | 2 +- .../java/io/cucumber/java/JavaBackend.java | 2 +- .../io/cucumber/java/JavaHookDefinition.java | 2 +- .../java/io/cucumber/java/JavaSnippet.java | 2 +- .../java/io/cucumber/java/ParameterInfo.java | 2 +- .../io/cucumber/java/Java8SnippetTest.java | 2 +- .../java/io/cucumber/java/JavaHookTest.java | 4 +- .../io/cucumber/java/JavaSnippetTest.java | 38 +++++++++---------- .../cucumber/java/JavaStepDefinitionTest.java | 6 +-- .../java/JavaStepDefinitionTransposeTest.java | 2 +- .../java/io/cucumber/java/test/Authors.java | 2 +- .../cucumber/java/test/ScenarioStepDefs.java | 2 +- .../java/test/TypeRegistryConfiguration.java | 4 +- .../java/cucumber/api/java8/HookBody.java | 2 +- .../cucumber/java8/Java8HookDefinition.java | 2 +- .../cucumber/java8/test/LambdaStepdefs.java | 2 +- .../java8/test/TypeRegistryConfiguration.java | 4 +- .../java/cucumber/api/junit/Cucumber.java | 8 ++-- .../java/io/cucumber/junit/JUnitReporter.java | 14 +++---- .../java/io/cucumber/junit/CucumberTest.java | 2 +- .../io/cucumber/junit/JUnitReporterTest.java | 13 +++---- .../RunCukesTestNoStepNotifications.java | 2 +- .../cucumber/junit/TestPendingException.java | 14 +++++++ .../io/cucumber/junit/stub/StubBackend.java | 2 +- .../io/cucumber/kotlin/LambdaStepdefs.kt | 2 +- .../kotlin/TypeRegistryConfiguration.kt | 4 +- picocontainer/pom.xml | 2 +- .../io/cucumber/picocontainer/StepDefs.java | 4 +- .../spring/contextconfig/RunCukesTest.java | 2 +- .../dirtiescontextconfig/RunCukesTest.java | 2 +- .../metaconfig/dirties/RunCukesTest.java | 2 +- .../metaconfig/general/RunCukesTest.java | 2 +- .../threading/RunParallelCukesTest.java | 2 +- .../spring/webappconfig/RunCukesTest.java | 2 +- .../api/testng/TestCaseResultListener.java | 6 +-- .../api/testng/TestNGCucumberRunner.java | 6 +-- .../testng/TestCaseResultListenerTest.java | 7 ++-- .../api/testng/TestPendingException.java | 14 +++++++ .../io/cucumber/testng/RunCukesStrict.java | 2 +- .../RunFeatureWithThreeScenariosTest.java | 2 +- .../RunScenarioWithUndefinedStepsStrict.java | 2 +- .../io/cucumber/testng/stub/StubBackend.java | 2 +- 187 files changed, 569 insertions(+), 530 deletions(-) rename core/src/main/java/{cucumber => io/cucumber/core}/api/Scenario.java (96%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/TypeRegistry.java (97%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/TypeRegistryConfigurer.java (83%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/cli/Main.java (96%) rename core/src/main/java/{cucumber/api => io/cucumber/core/api/event}/Argument.java (91%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/CanonicalEventOrder.java (98%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/ConcurrentEventListener.java (89%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/EmbedEvent.java (84%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/Event.java (95%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/EventHandler.java (69%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/EventListener.java (82%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/EventPublisher.java (98%) rename core/src/main/java/{cucumber/api => io/cucumber/core/api/event}/HookTestStep.java (51%) rename core/src/main/java/{cucumber/api => io/cucumber/core/api/event}/HookType.java (82%) rename core/src/main/java/{cucumber/api => io/cucumber/core/api/event}/PickleStepTestStep.java (97%) rename core/src/main/java/{cucumber/api => io/cucumber/core/api/event}/Result.java (98%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/SnippetsSuggestedEvent.java (94%) rename core/src/main/java/{cucumber/api => io/cucumber/core/api/event}/TestCase.java (87%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/TestCaseEvent.java (82%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/TestCaseFinished.java (78%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/TestCaseStarted.java (80%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/TestRunFinished.java (79%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/TestRunStarted.java (79%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/TestSourceRead.java (88%) rename core/src/main/java/{cucumber/api => io/cucumber/core/api/event}/TestStep.java (64%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/TestStepFinished.java (82%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/TestStepStarted.java (83%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/TimeStampedEvent.java (87%) rename core/src/main/java/{cucumber => io/cucumber/core}/api/event/WriteEvent.java (79%) rename core/src/main/java/{cucumber/api => io/cucumber/core/api/options}/CucumberOptions.java (94%) rename core/src/main/java/{cucumber/api => io/cucumber/core/api/options}/SnippetType.java (98%) rename core/src/main/java/{cucumber/api/formatter => io/cucumber/core/api/plugin}/ColorAware.java (87%) rename core/src/main/java/{cucumber/api/formatter => io/cucumber/core/api/plugin}/Formatter.java (72%) rename core/src/main/java/{cucumber/api => io/cucumber/core/api/plugin}/Plugin.java (66%) rename core/src/main/java/{cucumber/api => io/cucumber/core/api/plugin}/StepDefinitionReporter.java (78%) rename core/src/main/java/{cucumber/api/formatter => io/cucumber/core/api/plugin}/StrictAware.java (84%) rename core/src/main/java/{cucumber/api => io/cucumber/core/api/plugin}/SummaryPrinter.java (64%) rename core/src/main/java/{cucumber/api => io/cucumber/core/backend}/Pending.java (90%) rename core/src/test/java/{cucumber => io/cucumber/core}/api/event/CanonicalEventOrderTest.java (93%) rename core/src/test/java/{cucumber/api => io/cucumber/core/api/event}/ResultTest.java (86%) create mode 100644 core/src/test/java/io/cucumber/core/runner/TestPendingException.java rename core/src/test/resources/io/cucumber/core/{io => }/bar.properties (100%) rename core/src/test/resources/io/cucumber/core/{io => }/foo.properties (100%) rename core/src/test/resources/io/cucumber/core/{io => }/has spaces.properties (100%) rename {core/src/main/java/cucumber/api => java/src/main/java/cucumber/api/java}/PendingException.java (82%) rename {core/src/main/java/cucumber/api => java/src/main/java/cucumber/api/java}/Transpose.java (97%) create mode 100644 junit/src/test/java/io/cucumber/junit/TestPendingException.java create mode 100644 testng/src/test/java/cucumber/api/testng/TestPendingException.java diff --git a/core/pom.xml b/core/pom.xml index c754d3cd4e..af341e4287 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -97,7 +97,7 @@ - cucumber.api.cli.Main + io.cucumber.core.api.cli.Main diff --git a/core/src/main/java/cucumber/api/Scenario.java b/core/src/main/java/io/cucumber/core/api/Scenario.java similarity index 96% rename from core/src/main/java/cucumber/api/Scenario.java rename to core/src/main/java/io/cucumber/core/api/Scenario.java index 0d6226cb97..47cc5d4926 100644 --- a/core/src/main/java/cucumber/api/Scenario.java +++ b/core/src/main/java/io/cucumber/core/api/Scenario.java @@ -1,4 +1,6 @@ -package cucumber.api; +package io.cucumber.core.api; + +import io.cucumber.core.api.event.Result; import java.util.Collection; import java.util.List; diff --git a/core/src/main/java/cucumber/api/TypeRegistry.java b/core/src/main/java/io/cucumber/core/api/TypeRegistry.java similarity index 97% rename from core/src/main/java/cucumber/api/TypeRegistry.java rename to core/src/main/java/io/cucumber/core/api/TypeRegistry.java index b72ba1ce69..c61709e49a 100644 --- a/core/src/main/java/cucumber/api/TypeRegistry.java +++ b/core/src/main/java/io/cucumber/core/api/TypeRegistry.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api; import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.datatable.DataTableType; diff --git a/core/src/main/java/cucumber/api/TypeRegistryConfigurer.java b/core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java similarity index 83% rename from core/src/main/java/cucumber/api/TypeRegistryConfigurer.java rename to core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java index 865ce7331a..cd90a71bd9 100644 --- a/core/src/main/java/cucumber/api/TypeRegistryConfigurer.java +++ b/core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api; import java.util.Locale; diff --git a/core/src/main/java/cucumber/api/cli/Main.java b/core/src/main/java/io/cucumber/core/api/cli/Main.java similarity index 96% rename from core/src/main/java/cucumber/api/cli/Main.java rename to core/src/main/java/io/cucumber/core/api/cli/Main.java index 5207eb26dc..fc37c2b717 100644 --- a/core/src/main/java/cucumber/api/cli/Main.java +++ b/core/src/main/java/io/cucumber/core/api/cli/Main.java @@ -1,4 +1,4 @@ -package cucumber.api.cli; +package io.cucumber.core.api.cli; import io.cucumber.core.runtime.Runtime; diff --git a/core/src/main/java/cucumber/api/Argument.java b/core/src/main/java/io/cucumber/core/api/event/Argument.java similarity index 91% rename from core/src/main/java/cucumber/api/Argument.java rename to core/src/main/java/io/cucumber/core/api/event/Argument.java index 13906ace1f..bc3f1ea623 100644 --- a/core/src/main/java/cucumber/api/Argument.java +++ b/core/src/main/java/io/cucumber/core/api/event/Argument.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api.event; /** * Represents an argument in for a step definition. diff --git a/core/src/main/java/cucumber/api/event/CanonicalEventOrder.java b/core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java similarity index 98% rename from core/src/main/java/cucumber/api/event/CanonicalEventOrder.java rename to core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java index f960b7cd4b..998fd70d9a 100644 --- a/core/src/main/java/cucumber/api/event/CanonicalEventOrder.java +++ b/core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; import java.util.Comparator; import java.util.List; diff --git a/core/src/main/java/cucumber/api/event/ConcurrentEventListener.java b/core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java similarity index 89% rename from core/src/main/java/cucumber/api/event/ConcurrentEventListener.java rename to core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java index 0b471abe0e..616e24b9ca 100644 --- a/core/src/main/java/cucumber/api/event/ConcurrentEventListener.java +++ b/core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java @@ -1,11 +1,11 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; -import cucumber.api.Plugin; +import io.cucumber.core.api.plugin.Plugin; /** * When cucumber executes test in parallel or in a framework * that supports parallel execution (e.g. JUnit or TestNG) - * {@link cucumber.api.TestCase} events from different + * {@link TestCase} events from different * pickles may interleave. *

    * This interface marks an {@link EventListener} as capable of diff --git a/core/src/main/java/cucumber/api/event/EmbedEvent.java b/core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java similarity index 84% rename from core/src/main/java/cucumber/api/event/EmbedEvent.java rename to core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java index 97204c48c6..8a6b080504 100644 --- a/core/src/main/java/cucumber/api/event/EmbedEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java @@ -1,6 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.TestCase; +package io.cucumber.core.api.event; public final class EmbedEvent extends TestCaseEvent { public final byte[] data; diff --git a/core/src/main/java/cucumber/api/event/Event.java b/core/src/main/java/io/cucumber/core/api/event/Event.java similarity index 95% rename from core/src/main/java/cucumber/api/event/Event.java rename to core/src/main/java/io/cucumber/core/api/event/Event.java index b5c88f2208..6e3d00d0e2 100644 --- a/core/src/main/java/cucumber/api/event/Event.java +++ b/core/src/main/java/io/cucumber/core/api/event/Event.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; import java.util.Comparator; diff --git a/core/src/main/java/cucumber/api/event/EventHandler.java b/core/src/main/java/io/cucumber/core/api/event/EventHandler.java similarity index 69% rename from core/src/main/java/cucumber/api/event/EventHandler.java rename to core/src/main/java/io/cucumber/core/api/event/EventHandler.java index ed4d2ff334..ae514f4ff6 100644 --- a/core/src/main/java/cucumber/api/event/EventHandler.java +++ b/core/src/main/java/io/cucumber/core/api/event/EventHandler.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; public interface EventHandler { diff --git a/core/src/main/java/cucumber/api/event/EventListener.java b/core/src/main/java/io/cucumber/core/api/event/EventListener.java similarity index 82% rename from core/src/main/java/cucumber/api/event/EventListener.java rename to core/src/main/java/io/cucumber/core/api/event/EventListener.java index f14e070ff2..2b027d738c 100644 --- a/core/src/main/java/cucumber/api/event/EventListener.java +++ b/core/src/main/java/io/cucumber/core/api/event/EventListener.java @@ -1,6 +1,6 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; -import cucumber.api.Plugin; +import io.cucumber.core.api.plugin.Plugin; /** * This is the interface you should implement if your plugin listens to cucumber execution events diff --git a/core/src/main/java/cucumber/api/event/EventPublisher.java b/core/src/main/java/io/cucumber/core/api/event/EventPublisher.java similarity index 98% rename from core/src/main/java/cucumber/api/event/EventPublisher.java rename to core/src/main/java/io/cucumber/core/api/event/EventPublisher.java index d14ad16e47..0c002de9e8 100644 --- a/core/src/main/java/cucumber/api/event/EventPublisher.java +++ b/core/src/main/java/io/cucumber/core/api/event/EventPublisher.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; public interface EventPublisher { diff --git a/core/src/main/java/cucumber/api/HookTestStep.java b/core/src/main/java/io/cucumber/core/api/event/HookTestStep.java similarity index 51% rename from core/src/main/java/cucumber/api/HookTestStep.java rename to core/src/main/java/io/cucumber/core/api/event/HookTestStep.java index c014c498ac..579833c5e8 100644 --- a/core/src/main/java/cucumber/api/HookTestStep.java +++ b/core/src/main/java/io/cucumber/core/api/event/HookTestStep.java @@ -1,11 +1,16 @@ -package cucumber.api; +package io.cucumber.core.api.event; + +import io.cucumber.core.api.event.HookType; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestStep; /** * Hooks are invoked before and after each scenario and before and * after each gherkin step in a scenario. * - * @see cucumber.api.event.TestCaseStarted - * @see cucumber.api.event.TestCaseFinished + * @see TestCaseStarted + * @see TestCaseFinished */ public interface HookTestStep extends TestStep { diff --git a/core/src/main/java/cucumber/api/HookType.java b/core/src/main/java/io/cucumber/core/api/event/HookType.java similarity index 82% rename from core/src/main/java/cucumber/api/HookType.java rename to core/src/main/java/io/cucumber/core/api/event/HookType.java index acd0923678..5c11fda48b 100644 --- a/core/src/main/java/cucumber/api/HookType.java +++ b/core/src/main/java/io/cucumber/core/api/event/HookType.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api.event; public enum HookType { Before, After, BeforeStep, AfterStep; diff --git a/core/src/main/java/cucumber/api/PickleStepTestStep.java b/core/src/main/java/io/cucumber/core/api/event/PickleStepTestStep.java similarity index 97% rename from core/src/main/java/cucumber/api/PickleStepTestStep.java rename to core/src/main/java/io/cucumber/core/api/event/PickleStepTestStep.java index 3ad92d4d17..9659331868 100644 --- a/core/src/main/java/cucumber/api/PickleStepTestStep.java +++ b/core/src/main/java/io/cucumber/core/api/event/PickleStepTestStep.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api.event; import java.util.List; diff --git a/core/src/main/java/cucumber/api/Result.java b/core/src/main/java/io/cucumber/core/api/event/Result.java similarity index 98% rename from core/src/main/java/cucumber/api/Result.java rename to core/src/main/java/io/cucumber/core/api/event/Result.java index 7c65ac36c7..1093f4a6ab 100644 --- a/core/src/main/java/cucumber/api/Result.java +++ b/core/src/main/java/io/cucumber/core/api/event/Result.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api.event; import java.io.PrintWriter; import java.io.StringWriter; diff --git a/core/src/main/java/cucumber/api/event/SnippetsSuggestedEvent.java b/core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java similarity index 94% rename from core/src/main/java/cucumber/api/event/SnippetsSuggestedEvent.java rename to core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java index d5cc0d8a31..2d7c9554fe 100644 --- a/core/src/main/java/cucumber/api/event/SnippetsSuggestedEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; import gherkin.pickles.PickleLocation; diff --git a/core/src/main/java/cucumber/api/TestCase.java b/core/src/main/java/io/cucumber/core/api/event/TestCase.java similarity index 87% rename from core/src/main/java/cucumber/api/TestCase.java rename to core/src/main/java/io/cucumber/core/api/event/TestCase.java index 90fcce0bcb..a25bd827b3 100644 --- a/core/src/main/java/cucumber/api/TestCase.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestCase.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api.event; import gherkin.pickles.PickleTag; diff --git a/core/src/main/java/cucumber/api/event/TestCaseEvent.java b/core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java similarity index 82% rename from core/src/main/java/cucumber/api/event/TestCaseEvent.java rename to core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java index 5454791a80..a187eab55f 100644 --- a/core/src/main/java/cucumber/api/event/TestCaseEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java @@ -1,6 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.TestCase; +package io.cucumber.core.api.event; public abstract class TestCaseEvent extends TimeStampedEvent { diff --git a/core/src/main/java/cucumber/api/event/TestCaseFinished.java b/core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java similarity index 78% rename from core/src/main/java/cucumber/api/event/TestCaseFinished.java rename to core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java index 1925f5f07a..6c9e8cf9b2 100644 --- a/core/src/main/java/cucumber/api/event/TestCaseFinished.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java @@ -1,7 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.Result; -import cucumber.api.TestCase; +package io.cucumber.core.api.event; public final class TestCaseFinished extends TestCaseEvent { public final Result result; diff --git a/core/src/main/java/cucumber/api/event/TestCaseStarted.java b/core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java similarity index 80% rename from core/src/main/java/cucumber/api/event/TestCaseStarted.java rename to core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java index 8931d46156..151df6d18c 100644 --- a/core/src/main/java/cucumber/api/event/TestCaseStarted.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java @@ -1,6 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.TestCase; +package io.cucumber.core.api.event; public final class TestCaseStarted extends TestCaseEvent { public final TestCase testCase; diff --git a/core/src/main/java/cucumber/api/event/TestRunFinished.java b/core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java similarity index 79% rename from core/src/main/java/cucumber/api/event/TestRunFinished.java rename to core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java index bff272433b..9a76474578 100644 --- a/core/src/main/java/cucumber/api/event/TestRunFinished.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; public final class TestRunFinished extends TimeStampedEvent { diff --git a/core/src/main/java/cucumber/api/event/TestRunStarted.java b/core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java similarity index 79% rename from core/src/main/java/cucumber/api/event/TestRunStarted.java rename to core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java index 1dc1453a2b..49158b15a8 100644 --- a/core/src/main/java/cucumber/api/event/TestRunStarted.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; public final class TestRunStarted extends TimeStampedEvent { diff --git a/core/src/main/java/cucumber/api/event/TestSourceRead.java b/core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java similarity index 88% rename from core/src/main/java/cucumber/api/event/TestSourceRead.java rename to core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java index 56e85650c9..c5ea11eff3 100644 --- a/core/src/main/java/cucumber/api/event/TestSourceRead.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; public final class TestSourceRead extends TimeStampedEvent { public final String uri; diff --git a/core/src/main/java/cucumber/api/TestStep.java b/core/src/main/java/io/cucumber/core/api/event/TestStep.java similarity index 64% rename from core/src/main/java/cucumber/api/TestStep.java rename to core/src/main/java/io/cucumber/core/api/event/TestStep.java index fcd3eb05e1..af57497b06 100644 --- a/core/src/main/java/cucumber/api/TestStep.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestStep.java @@ -1,11 +1,14 @@ -package cucumber.api; +package io.cucumber.core.api.event; + +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; /** * A test step can either represent the execution of a hook * or a pickle step. Each step is tied to some glue code. * - * @see cucumber.api.event.TestCaseStarted - * @see cucumber.api.event.TestCaseFinished + * @see TestCaseStarted + * @see TestCaseFinished */ public interface TestStep { diff --git a/core/src/main/java/cucumber/api/event/TestStepFinished.java b/core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java similarity index 82% rename from core/src/main/java/cucumber/api/event/TestStepFinished.java rename to core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java index 7c132771eb..cae97cd152 100644 --- a/core/src/main/java/cucumber/api/event/TestStepFinished.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java @@ -1,10 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.HookTestStep; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.TestStep; +package io.cucumber.core.api.event; /** * A test step finished event is broadcast when ever a step finishes. diff --git a/core/src/main/java/cucumber/api/event/TestStepStarted.java b/core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java similarity index 83% rename from core/src/main/java/cucumber/api/event/TestStepStarted.java rename to core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java index 1748f3669e..d180ba9e31 100644 --- a/core/src/main/java/cucumber/api/event/TestStepStarted.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java @@ -1,9 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.HookTestStep; -import cucumber.api.PickleStepTestStep; -import cucumber.api.TestCase; -import cucumber.api.TestStep; +package io.cucumber.core.api.event; /** * A test step started event is broadcast when ever a step starts. diff --git a/core/src/main/java/cucumber/api/event/TimeStampedEvent.java b/core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java similarity index 87% rename from core/src/main/java/cucumber/api/event/TimeStampedEvent.java rename to core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java index 576a69a7bb..26ecdd1197 100644 --- a/core/src/main/java/cucumber/api/event/TimeStampedEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java @@ -1,4 +1,4 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; abstract class TimeStampedEvent implements Event { private final Long timeStamp; diff --git a/core/src/main/java/cucumber/api/event/WriteEvent.java b/core/src/main/java/io/cucumber/core/api/event/WriteEvent.java similarity index 79% rename from core/src/main/java/cucumber/api/event/WriteEvent.java rename to core/src/main/java/io/cucumber/core/api/event/WriteEvent.java index 9ddc693650..2be0df6878 100644 --- a/core/src/main/java/cucumber/api/event/WriteEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/WriteEvent.java @@ -1,6 +1,4 @@ -package cucumber.api.event; - -import cucumber.api.TestCase; +package io.cucumber.core.api.event; public final class WriteEvent extends TestCaseEvent { public final String text; diff --git a/core/src/main/java/cucumber/api/CucumberOptions.java b/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java similarity index 94% rename from core/src/main/java/cucumber/api/CucumberOptions.java rename to core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java index ac0b57e4c4..e22c425b07 100644 --- a/core/src/main/java/cucumber/api/CucumberOptions.java +++ b/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java @@ -1,4 +1,6 @@ -package cucumber.api; +package io.cucumber.core.api.options; + +import io.cucumber.core.api.cli.Main; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -6,7 +8,7 @@ import java.lang.annotation.Target; /** - * This annotation provides the same options as the cucumber command line, {@link cucumber.api.cli.Main}. + * This annotation provides the same options as the cucumber command line, {@link Main}. */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) diff --git a/core/src/main/java/cucumber/api/SnippetType.java b/core/src/main/java/io/cucumber/core/api/options/SnippetType.java similarity index 98% rename from core/src/main/java/cucumber/api/SnippetType.java rename to core/src/main/java/io/cucumber/core/api/options/SnippetType.java index 9b5f86ff4a..c17f3fcb0c 100644 --- a/core/src/main/java/cucumber/api/SnippetType.java +++ b/core/src/main/java/io/cucumber/core/api/options/SnippetType.java @@ -1,4 +1,4 @@ -package cucumber.api; +package io.cucumber.core.api.options; public enum SnippetType { UNDERSCORE("underscore", new UnderscoreJoiner()), diff --git a/core/src/main/java/cucumber/api/formatter/ColorAware.java b/core/src/main/java/io/cucumber/core/api/plugin/ColorAware.java similarity index 87% rename from core/src/main/java/cucumber/api/formatter/ColorAware.java rename to core/src/main/java/io/cucumber/core/api/plugin/ColorAware.java index 1bbce1521c..642a1c7905 100644 --- a/core/src/main/java/cucumber/api/formatter/ColorAware.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/ColorAware.java @@ -1,6 +1,4 @@ -package cucumber.api.formatter; - -import cucumber.api.Plugin; +package io.cucumber.core.api.plugin; /** * Interface for Plugins that use ANSI escape codes to print coloured output. diff --git a/core/src/main/java/cucumber/api/formatter/Formatter.java b/core/src/main/java/io/cucumber/core/api/plugin/Formatter.java similarity index 72% rename from core/src/main/java/cucumber/api/formatter/Formatter.java rename to core/src/main/java/io/cucumber/core/api/plugin/Formatter.java index 4bc2389f2c..d8fecd4033 100644 --- a/core/src/main/java/cucumber/api/formatter/Formatter.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/Formatter.java @@ -1,7 +1,6 @@ -package cucumber.api.formatter; +package io.cucumber.core.api.plugin; -import cucumber.api.Plugin; -import cucumber.api.event.EventListener; +import io.cucumber.core.api.event.EventListener; /** * @deprecated as of version 4.0.0; use {@link EventListener } and {@link Plugin } instead. diff --git a/core/src/main/java/cucumber/api/Plugin.java b/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java similarity index 66% rename from core/src/main/java/cucumber/api/Plugin.java rename to core/src/main/java/io/cucumber/core/api/plugin/Plugin.java index e566927a1f..467a04e23e 100644 --- a/core/src/main/java/cucumber/api/Plugin.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java @@ -1,4 +1,8 @@ -package cucumber.api; +package io.cucumber.core.api.plugin; + +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventListener; import java.io.File; import java.net.URI; @@ -25,12 +29,12 @@ *

    * Plugins may also implement one of these interfaces: *

      - *
    • {@link cucumber.api.formatter.ColorAware}
    • - *
    • {@link cucumber.api.formatter.StrictAware}
    • - *
    • {@link cucumber.api.event.EventListener}
    • - *
    • {@link cucumber.api.event.ConcurrentEventListener}
    • - *
    • {@link cucumber.api.StepDefinitionReporter}
    • - *
    • {@link cucumber.api.SummaryPrinter}
    • + *
    • {@link ColorAware}
    • + *
    • {@link StrictAware}
    • + *
    • {@link EventListener}
    • + *
    • {@link ConcurrentEventListener}
    • + *
    • {@link StepDefinitionReporter}
    • + *
    • {@link SummaryPrinter}
    • *
    */ public interface Plugin { diff --git a/core/src/main/java/cucumber/api/StepDefinitionReporter.java b/core/src/main/java/io/cucumber/core/api/plugin/StepDefinitionReporter.java similarity index 78% rename from core/src/main/java/cucumber/api/StepDefinitionReporter.java rename to core/src/main/java/io/cucumber/core/api/plugin/StepDefinitionReporter.java index 5083829c38..7552aecb63 100644 --- a/core/src/main/java/cucumber/api/StepDefinitionReporter.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/StepDefinitionReporter.java @@ -1,5 +1,6 @@ -package cucumber.api; +package io.cucumber.core.api.plugin; +import io.cucumber.core.api.plugin.Plugin; import io.cucumber.core.backend.StepDefinition; public interface StepDefinitionReporter extends Plugin { diff --git a/core/src/main/java/cucumber/api/formatter/StrictAware.java b/core/src/main/java/io/cucumber/core/api/plugin/StrictAware.java similarity index 84% rename from core/src/main/java/cucumber/api/formatter/StrictAware.java rename to core/src/main/java/io/cucumber/core/api/plugin/StrictAware.java index 6faa35efdc..6955552df3 100755 --- a/core/src/main/java/cucumber/api/formatter/StrictAware.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/StrictAware.java @@ -1,6 +1,4 @@ -package cucumber.api.formatter; - -import cucumber.api.Plugin; +package io.cucumber.core.api.plugin; /** * Interface for Plugins that need to know if the Runtime is strict. diff --git a/core/src/main/java/cucumber/api/SummaryPrinter.java b/core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java similarity index 64% rename from core/src/main/java/cucumber/api/SummaryPrinter.java rename to core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java index a5ba643673..8e0576c708 100644 --- a/core/src/main/java/cucumber/api/SummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java @@ -1,4 +1,6 @@ -package cucumber.api; +package io.cucumber.core.api.plugin; + +import io.cucumber.core.api.plugin.Plugin; /** * Interface for plugins that print a summary after test execution. diff --git a/core/src/main/java/io/cucumber/core/backend/Backend.java b/core/src/main/java/io/cucumber/core/backend/Backend.java index 61438d0fc1..23020b3278 100644 --- a/core/src/main/java/io/cucumber/core/backend/Backend.java +++ b/core/src/main/java/io/cucumber/core/backend/Backend.java @@ -1,6 +1,6 @@ package io.cucumber.core.backend; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import gherkin.pickles.PickleStep; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/backend/HookDefinition.java b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java index 63b8cbc9d2..4570a9c043 100644 --- a/core/src/main/java/io/cucumber/core/backend/HookDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java @@ -1,6 +1,6 @@ package io.cucumber.core.backend; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleTag; import java.util.Collection; diff --git a/core/src/main/java/cucumber/api/Pending.java b/core/src/main/java/io/cucumber/core/backend/Pending.java similarity index 90% rename from core/src/main/java/cucumber/api/Pending.java rename to core/src/main/java/io/cucumber/core/backend/Pending.java index c8460c5298..cba5693a47 100644 --- a/core/src/main/java/cucumber/api/Pending.java +++ b/core/src/main/java/io/cucumber/core/backend/Pending.java @@ -1,4 +1,5 @@ -package cucumber.api; +package io.cucumber.core.backend; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -9,8 +10,6 @@ * Any exception class annotated with this annotation will be treated as a "pending" exception. * That is - if the exception is thrown from a step definition or hook, the scenario's status will * be pending instead of failed. - * - * @see PendingException */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java index 06fd2ec701..c9a04f08dc 100644 --- a/core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java @@ -1,6 +1,6 @@ package io.cucumber.core.backend; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; public interface StepDefinitionMatch { void runStep(Scenario scenario) throws Throwable; diff --git a/core/src/main/java/io/cucumber/core/event/AbstractEventBus.java b/core/src/main/java/io/cucumber/core/event/AbstractEventBus.java index 4f8f873d31..6d163cbb9f 100644 --- a/core/src/main/java/io/cucumber/core/event/AbstractEventBus.java +++ b/core/src/main/java/io/cucumber/core/event/AbstractEventBus.java @@ -1,6 +1,6 @@ package io.cucumber.core.event; -import cucumber.api.event.Event; +import io.cucumber.core.api.event.Event; public abstract class AbstractEventBus extends AbstractEventPublisher implements EventBus { diff --git a/core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java b/core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java index 33c2298987..e231cea99d 100644 --- a/core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java @@ -1,8 +1,8 @@ package io.cucumber.core.event; -import cucumber.api.event.Event; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventPublisher; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventPublisher; import java.util.ArrayList; import java.util.HashMap; diff --git a/core/src/main/java/io/cucumber/core/event/EventBus.java b/core/src/main/java/io/cucumber/core/event/EventBus.java index d7dc1a1446..f0ae9765c9 100644 --- a/core/src/main/java/io/cucumber/core/event/EventBus.java +++ b/core/src/main/java/io/cucumber/core/event/EventBus.java @@ -1,7 +1,7 @@ package io.cucumber.core.event; -import cucumber.api.event.Event; -import cucumber.api.event.EventPublisher; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.EventPublisher; public interface EventBus extends EventPublisher { diff --git a/core/src/main/java/io/cucumber/core/options/PluginOption.java b/core/src/main/java/io/cucumber/core/options/PluginOption.java index 0b90e027a5..6564fb44c7 100644 --- a/core/src/main/java/io/cucumber/core/options/PluginOption.java +++ b/core/src/main/java/io/cucumber/core/options/PluginOption.java @@ -1,10 +1,10 @@ package io.cucumber.core.options; -import cucumber.api.Plugin; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.SummaryPrinter; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.EventListener; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.api.plugin.SummaryPrinter; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventListener; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.plugin.DefaultSummaryPrinter; import io.cucumber.core.plugin.HTMLFormatter; diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index d125dad957..294add09d8 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -1,8 +1,7 @@ package io.cucumber.core.options; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; import io.cucumber.datatable.DataTable; diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java index e048a90ddc..4241a7404d 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java @@ -1,6 +1,6 @@ package io.cucumber.core.options; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; diff --git a/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java b/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java index 6f2ba52d30..659b5d73d0 100644 --- a/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java @@ -1,7 +1,7 @@ package io.cucumber.core.plugin; -import cucumber.api.event.Event; -import cucumber.api.event.TestRunFinished; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.event.AbstractEventPublisher; import java.util.Collections; diff --git a/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java index e856e285f6..c766a5b1cb 100644 --- a/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java @@ -1,12 +1,12 @@ package io.cucumber.core.plugin; -import cucumber.api.SummaryPrinter; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestRunFinished; -import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.StrictAware; +import io.cucumber.core.api.plugin.SummaryPrinter; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.api.plugin.StrictAware; import java.io.PrintStream; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index 860b65f0d9..a3ef5a8eff 100644 --- a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -1,19 +1,19 @@ package io.cucumber.core.plugin; -import cucumber.api.HookTestStep; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.event.EmbedEvent; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestSourceRead; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; -import cucumber.api.event.WriteEvent; +import io.cucumber.core.api.event.HookTestStep; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.EmbedEvent; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; +import io.cucumber.core.api.event.WriteEvent; import io.cucumber.core.exception.CucumberException; import gherkin.ast.Background; import gherkin.ast.DataTable; diff --git a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java index 472a79548f..6fe0d0b4e6 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java @@ -1,21 +1,21 @@ package io.cucumber.core.plugin; -import cucumber.api.HookTestStep; -import cucumber.api.HookType; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.TestStep; -import cucumber.api.event.EmbedEvent; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestSourceRead; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; -import cucumber.api.event.WriteEvent; +import io.cucumber.core.api.event.HookTestStep; +import io.cucumber.core.api.event.HookType; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestStep; +import io.cucumber.core.api.event.EmbedEvent; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; +import io.cucumber.core.api.event.WriteEvent; import gherkin.ast.Background; import gherkin.ast.DocString; import gherkin.ast.Feature; @@ -353,7 +353,7 @@ private Map createMatchMap(TestStep step, Result result) { PickleStepTestStep testStep = (PickleStepTestStep) step; if (!testStep.getDefinitionArgument().isEmpty()) { List> argumentList = new ArrayList>(); - for (cucumber.api.Argument argument : testStep.getDefinitionArgument()) { + for (io.cucumber.core.api.event.Argument argument : testStep.getDefinitionArgument()) { Map argumentMap = new HashMap(); if (argument.getValue() != null) { argumentMap.put("val", argument.getValue()); diff --git a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java index a233ce31a7..fb42c815fc 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java @@ -1,16 +1,16 @@ package io.cucumber.core.plugin; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestSourceRead; -import cucumber.api.event.TestStepFinished; -import cucumber.api.formatter.StrictAware; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.plugin.StrictAware; import io.cucumber.core.exception.CucumberException; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -195,7 +195,7 @@ private static class TestCase { NUMBER_FORMAT.applyPattern("0.######"); } - private TestCase(cucumber.api.TestCase testCase) { + private TestCase(io.cucumber.core.api.event.TestCase testCase) { this.testCase = testCase; } @@ -205,7 +205,7 @@ private TestCase(cucumber.api.TestCase testCase) { static boolean treatConditionallySkippedAsFailure = false; final List steps = new ArrayList(); final List results = new ArrayList(); - private final cucumber.api.TestCase testCase; + private final io.cucumber.core.api.event.TestCase testCase; private Element createElement(Document doc) { return doc.createElement("testcase"); @@ -216,7 +216,7 @@ private void writeElement(Document doc, Element tc) { tc.setAttribute("name", calculateElementName(testCase)); } - private String calculateElementName(cucumber.api.TestCase testCase) { + private String calculateElementName(io.cucumber.core.api.event.TestCase testCase) { String testCaseName = testCase.getName(); if (testCaseName.equals(previousTestCaseName)) { return getUniqueTestNameForScenarioExample(testCaseName, ++exampleNumber); diff --git a/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java index 6d739fb823..467de751c1 100644 --- a/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import cucumber.api.SummaryPrinter; +import io.cucumber.core.api.plugin.SummaryPrinter; public final class NullSummaryPrinter implements SummaryPrinter { diff --git a/core/src/main/java/io/cucumber/core/plugin/Options.java b/core/src/main/java/io/cucumber/core/plugin/Options.java index 35c7b73156..1f709cbc0e 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Options.java +++ b/core/src/main/java/io/cucumber/core/plugin/Options.java @@ -1,7 +1,5 @@ package io.cucumber.core.plugin; -import java.util.List; - public interface Options { Iterable plugins(); @@ -11,7 +9,7 @@ public interface Options { interface Plugin { - Class pluginClass(); + Class pluginClass(); String argument(); diff --git a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java index 22f134b6d1..92c256bf25 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java +++ b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import cucumber.api.Plugin; +import io.cucumber.core.api.plugin.Plugin; import io.cucumber.core.exception.CucumberException; import java.io.File; diff --git a/core/src/main/java/io/cucumber/core/plugin/Plugins.java b/core/src/main/java/io/cucumber/core/plugin/Plugins.java index 62918028b0..87a40fdc46 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Plugins.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugins.java @@ -1,14 +1,14 @@ package io.cucumber.core.plugin; -import cucumber.api.Plugin; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.Event; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.StrictAware; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.api.plugin.StrictAware; import io.cucumber.core.backend.StepDefinition; import java.util.ArrayList; diff --git a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java index 7eb8e5afdb..a998c341b3 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java @@ -1,20 +1,20 @@ package io.cucumber.core.plugin; -import cucumber.api.Argument; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.TestStep; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestSourceRead; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; -import cucumber.api.event.WriteEvent; -import cucumber.api.formatter.ColorAware; +import io.cucumber.core.api.event.Argument; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestStep; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; +import io.cucumber.core.api.event.WriteEvent; +import io.cucumber.core.api.plugin.ColorAware; import io.cucumber.core.util.FixJava; import io.cucumber.core.util.Mapper; import gherkin.ast.Background; diff --git a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java index 02e49e74ec..569025123d 100644 --- a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java @@ -1,14 +1,14 @@ package io.cucumber.core.plugin; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.WriteEvent; -import cucumber.api.formatter.ColorAware; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.WriteEvent; +import io.cucumber.core.api.plugin.ColorAware; import java.util.HashMap; import java.util.Map; diff --git a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java index b07c8bed39..3fca8a60d8 100644 --- a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java @@ -1,12 +1,12 @@ package io.cucumber.core.plugin; -import cucumber.api.TestCase; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestRunFinished; -import cucumber.api.formatter.StrictAware; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.plugin.StrictAware; import java.util.ArrayList; import java.util.HashMap; diff --git a/core/src/main/java/io/cucumber/core/plugin/Stats.java b/core/src/main/java/io/cucumber/core/plugin/Stats.java index dda3496baf..df2bd03c0e 100755 --- a/core/src/main/java/io/cucumber/core/plugin/Stats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Stats.java @@ -1,16 +1,16 @@ package io.cucumber.core.plugin; -import cucumber.api.Result; -import cucumber.api.PickleStepTestStep; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestRunStarted; -import cucumber.api.event.TestStepFinished; -import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.StrictAware; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestRunStarted; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.api.plugin.StrictAware; import java.io.PrintStream; import java.text.DecimalFormat; diff --git a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java index f08841c238..5a66bcdd46 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java @@ -1,17 +1,17 @@ package io.cucumber.core.plugin; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestSourceRead; -import cucumber.api.event.TestStepFinished; -import cucumber.api.formatter.StrictAware; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.plugin.StrictAware; import io.cucumber.core.exception.CucumberException; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java b/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java index 385a1d5624..a077da1241 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import cucumber.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestSourceRead; import gherkin.AstBuilder; import gherkin.GherkinDialect; import gherkin.GherkinDialectProvider; diff --git a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index 598196578b..e2b04938f8 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -1,14 +1,14 @@ package io.cucumber.core.plugin; -import cucumber.api.TestCase; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseEvent; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseEvent; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.exception.CucumberException; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; diff --git a/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java index bdbaccef15..7ef3b633bb 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java +++ b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java @@ -1,10 +1,10 @@ package io.cucumber.core.plugin; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.SnippetsSuggestedEvent; -import cucumber.api.event.TestSourceRead; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.SnippetsSuggestedEvent; +import io.cucumber.core.api.event.TestSourceRead; import gherkin.AstBuilder; import gherkin.GherkinDialect; import gherkin.GherkinDialectProvider; diff --git a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java index c1d385fbe7..02cd0eae75 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java @@ -1,13 +1,13 @@ package io.cucumber.core.plugin; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Plugin; -import cucumber.api.Result; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestStepFinished; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestStepFinished; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; diff --git a/core/src/main/java/io/cucumber/core/runner/AmbiguousPickleStepDefinitionsMatch.java b/core/src/main/java/io/cucumber/core/runner/AmbiguousPickleStepDefinitionsMatch.java index 43a4336ddb..6ee81e9143 100644 --- a/core/src/main/java/io/cucumber/core/runner/AmbiguousPickleStepDefinitionsMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/AmbiguousPickleStepDefinitionsMatch.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleStep; import io.cucumber.core.stepexpression.Argument; diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index b924ef37f5..7d110ae590 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -5,7 +5,7 @@ import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.stepexpression.Argument; -import cucumber.api.StepDefinitionReporter; +import io.cucumber.core.api.plugin.StepDefinitionReporter; import gherkin.pickles.PickleStep; import java.util.ArrayList; diff --git a/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java b/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java index c09ce5357b..ddbaeb7aff 100644 --- a/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java +++ b/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.Argument; +import io.cucumber.core.api.event.Argument; import io.cucumber.core.stepexpression.ExpressionArgument; import java.util.ArrayList; diff --git a/core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java b/core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java index 64e06e849a..4b0263367b 100644 --- a/core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleStep; import io.cucumber.core.stepexpression.Argument; diff --git a/core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java index de6e5f674a..6fb30f9b6a 100644 --- a/core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinitionMatch; diff --git a/core/src/main/java/io/cucumber/core/runner/HookTestStep.java b/core/src/main/java/io/cucumber/core/runner/HookTestStep.java index 0415b9b3bd..3244f23bf2 100644 --- a/core/src/main/java/io/cucumber/core/runner/HookTestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/HookTestStep.java @@ -1,8 +1,8 @@ package io.cucumber.core.runner; -import cucumber.api.HookType; +import io.cucumber.core.api.event.HookType; -final class HookTestStep extends TestStep implements cucumber.api.HookTestStep { +final class HookTestStep extends TestStep implements io.cucumber.core.api.event.HookTestStep { private final HookType hookType; HookTestStep(HookType hookType, HookDefinitionMatch definitionMatch) { diff --git a/core/src/main/java/io/cucumber/core/runner/Options.java b/core/src/main/java/io/cucumber/core/runner/Options.java index a09023d685..68213f519e 100644 --- a/core/src/main/java/io/cucumber/core/runner/Options.java +++ b/core/src/main/java/io/cucumber/core/runner/Options.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java index a61be1eef2..a2bc994c68 100644 --- a/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.backend.StepDefinitionMatch; import io.cucumber.core.exception.CucumberException; diff --git a/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java index 5d4cfe0a92..84505680ca 100644 --- a/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java @@ -1,13 +1,14 @@ package io.cucumber.core.runner; -import cucumber.api.TestCase; +import io.cucumber.core.api.event.Argument; +import io.cucumber.core.api.event.TestCase; import gherkin.pickles.PickleStep; import io.cucumber.core.event.EventBus; import java.util.Collections; import java.util.List; -final class PickleStepTestStep extends TestStep implements cucumber.api.PickleStepTestStep { +final class PickleStepTestStep extends TestStep implements io.cucumber.core.api.event.PickleStepTestStep { private final String uri; private final PickleStep step; private final List afterStepHookSteps; @@ -78,7 +79,7 @@ public String getStepText() { } @Override - public List getDefinitionArgument() { + public List getDefinitionArgument() { return DefinitionArgument.createArguments(definitionMatch.getArguments()); } diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index 95d39e574f..5faa8bb34f 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -1,8 +1,8 @@ package io.cucumber.core.runner; -import cucumber.api.HookType; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.event.SnippetsSuggestedEvent; +import io.cucumber.core.api.event.HookType; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.api.event.SnippetsSuggestedEvent; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; diff --git a/core/src/main/java/io/cucumber/core/runner/Scenario.java b/core/src/main/java/io/cucumber/core/runner/Scenario.java index a0ff46dbb9..1bb856b2b0 100644 --- a/core/src/main/java/io/cucumber/core/runner/Scenario.java +++ b/core/src/main/java/io/cucumber/core/runner/Scenario.java @@ -1,8 +1,8 @@ package io.cucumber.core.runner; -import cucumber.api.Result; -import cucumber.api.event.EmbedEvent; -import cucumber.api.event.WriteEvent; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.EmbedEvent; +import io.cucumber.core.api.event.WriteEvent; import gherkin.pickles.PickleTag; import io.cucumber.core.event.EventBus; @@ -14,7 +14,7 @@ import static java.util.Collections.max; -class Scenario implements cucumber.api.Scenario { +class Scenario implements io.cucumber.core.api.Scenario { private final List stepResults = new ArrayList(); private final EventBus bus; diff --git a/core/src/main/java/io/cucumber/core/runner/TestCase.java b/core/src/main/java/io/cucumber/core/runner/TestCase.java index 5e02dc2785..fd1a763e21 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestCase.java +++ b/core/src/main/java/io/cucumber/core/runner/TestCase.java @@ -1,9 +1,9 @@ package io.cucumber.core.runner; -import cucumber.api.Result; -import cucumber.api.TestStep; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestStep; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; import gherkin.events.PickleEvent; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleTag; @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; -final class TestCase implements cucumber.api.TestCase { +final class TestCase implements io.cucumber.core.api.event.TestCase { private final PickleEvent pickleEvent; private final List testSteps; private final boolean dryRun; diff --git a/core/src/main/java/io/cucumber/core/runner/TestStep.java b/core/src/main/java/io/cucumber/core/runner/TestStep.java index 7d33f08cb4..86e28b2b03 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/TestStep.java @@ -1,16 +1,16 @@ package io.cucumber.core.runner; -import cucumber.api.Pending; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; +import io.cucumber.core.backend.Pending; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; import io.cucumber.core.backend.StepDefinitionMatch; import io.cucumber.core.event.EventBus; import java.util.Arrays; -abstract class TestStep implements cucumber.api.TestStep { +abstract class TestStep implements io.cucumber.core.api.event.TestStep { private static final String[] ASSUMPTION_VIOLATED_EXCEPTIONS = { "org.junit.AssumptionViolatedException", "org.junit.internal.AssumptionViolatedException", diff --git a/core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java index 6841922275..bd52292f34 100644 --- a/core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/UndefinedPickleStepDefinitionMatch.java @@ -1,7 +1,7 @@ package io.cucumber.core.runner; import io.cucumber.core.stepexpression.Argument; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleStep; import java.util.Collections; diff --git a/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java b/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java index 72d85fd0e2..ac7968e940 100644 --- a/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java @@ -1,6 +1,6 @@ package io.cucumber.core.runtime; -import cucumber.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.io.ClassFinder; @@ -65,7 +65,7 @@ public Locale locale() { } @Override - public void configureTypeRegistry(cucumber.api.TypeRegistry typeRegistry) { + public void configureTypeRegistry(io.cucumber.core.api.TypeRegistry typeRegistry) { //noop } diff --git a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java index 2bbd89b19d..fc8ea6c9d0 100644 --- a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java @@ -1,6 +1,6 @@ package io.cucumber.core.runtime; -import cucumber.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.model.FeatureLoader; import io.cucumber.core.options.RuntimeOptions; diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 4b6279a6cc..0bc6cf1113 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -1,14 +1,14 @@ package io.cucumber.core.runtime; -import cucumber.api.Plugin; -import cucumber.api.Result; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestRunStarted; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.event.EventBus; @@ -36,7 +36,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import static cucumber.api.Result.SEVERITY; +import static io.cucumber.core.api.event.Result.SEVERITY; import static java.util.Collections.emptyList; import static java.util.Collections.max; import static java.util.Collections.min; diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java index 9bfc4d7eda..746d1525fc 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java @@ -1,7 +1,7 @@ package io.cucumber.core.runtime; -import cucumber.api.event.Event; -import cucumber.api.event.EventHandler; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.event.AbstractEventBus; diff --git a/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java b/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java index f7bff1b3af..5c96dd048d 100644 --- a/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java +++ b/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java @@ -1,6 +1,6 @@ package io.cucumber.core.snippets; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.cucumberexpressions.GeneratedExpression; import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.datatable.DataTable; diff --git a/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java b/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java index 625421c26b..0414224917 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java @@ -9,7 +9,7 @@ import java.util.Locale; -public final class TypeRegistry implements cucumber.api.TypeRegistry { +public final class TypeRegistry implements io.cucumber.core.api.TypeRegistry { private final ParameterTypeRegistry parameterTypeRegistry; diff --git a/core/src/test/java/cucumber/api/event/CanonicalEventOrderTest.java b/core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java similarity index 93% rename from core/src/test/java/cucumber/api/event/CanonicalEventOrderTest.java rename to core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java index e05d71f754..3efe00fce2 100644 --- a/core/src/test/java/cucumber/api/event/CanonicalEventOrderTest.java +++ b/core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java @@ -1,7 +1,14 @@ -package cucumber.api.event; +package io.cucumber.core.api.event; -import cucumber.api.TestCase; +import io.cucumber.core.api.event.TestCase; import gherkin.pickles.PickleLocation; +import io.cucumber.core.api.event.CanonicalEventOrder; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.SnippetsSuggestedEvent; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestRunStarted; +import io.cucumber.core.api.event.TestSourceRead; import org.junit.Test; import java.util.Arrays; diff --git a/core/src/test/java/cucumber/api/ResultTest.java b/core/src/test/java/io/cucumber/core/api/event/ResultTest.java similarity index 86% rename from core/src/test/java/cucumber/api/ResultTest.java rename to core/src/test/java/io/cucumber/core/api/event/ResultTest.java index 05e521e1ef..2b9f5fc4e7 100644 --- a/core/src/test/java/cucumber/api/ResultTest.java +++ b/core/src/test/java/io/cucumber/core/api/event/ResultTest.java @@ -1,16 +1,17 @@ -package cucumber.api; +package io.cucumber.core.api.event; +import io.cucumber.core.api.event.Result; import org.junit.Test; import java.util.List; -import static cucumber.api.Result.SEVERITY; -import static cucumber.api.Result.Type.AMBIGUOUS; -import static cucumber.api.Result.Type.FAILED; -import static cucumber.api.Result.Type.PASSED; -import static cucumber.api.Result.Type.PENDING; -import static cucumber.api.Result.Type.SKIPPED; -import static cucumber.api.Result.Type.UNDEFINED; +import static io.cucumber.core.api.event.Result.SEVERITY; +import static io.cucumber.core.api.event.Result.Type.AMBIGUOUS; +import static io.cucumber.core.api.event.Result.Type.FAILED; +import static io.cucumber.core.api.event.Result.Type.PASSED; +import static io.cucumber.core.api.event.Result.Type.PENDING; +import static io.cucumber.core.api.event.Result.Type.SKIPPED; +import static io.cucumber.core.api.event.Result.Type.UNDEFINED; import static java.util.Arrays.asList; import static java.util.Collections.sort; import static org.hamcrest.CoreMatchers.equalTo; diff --git a/core/src/test/java/io/cucumber/core/backend/StubBackend.java b/core/src/test/java/io/cucumber/core/backend/StubBackend.java index 647e71b62d..e9f4fa88ab 100644 --- a/core/src/test/java/io/cucumber/core/backend/StubBackend.java +++ b/core/src/test/java/io/cucumber/core/backend/StubBackend.java @@ -1,6 +1,6 @@ package io.cucumber.core.backend; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.io.ResourceLoader; import gherkin.pickles.PickleStep; import io.cucumber.core.stepexpression.TypeRegistry; diff --git a/core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java b/core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java index 2eb110fedd..77b4987af4 100644 --- a/core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java +++ b/core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java @@ -26,7 +26,7 @@ public void loads_resources_from_filesystem_dir() { @Test public void loads_resource_from_filesystem_file() { - File file = new File(dir, "io/cucumber/core/io/bar.properties"); + File file = new File(dir, "io/cucumber/core/bar.properties"); Iterable files = new FileResourceLoader().resources(file.getPath(), ".doesntmatter"); assertEquals(1, toList(files).size()); } diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java index 757468e4c4..639c4558f4 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java @@ -1,8 +1,8 @@ package io.cucumber.core.options; -import cucumber.api.CucumberOptions; -import cucumber.api.Plugin; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.exception.CucumberException; diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index b09f7892c8..043c0251ee 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -1,11 +1,11 @@ package io.cucumber.core.options; -import cucumber.api.Plugin; -import cucumber.api.SnippetType; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.StrictAware; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.api.plugin.StrictAware; import io.cucumber.core.event.EventBus; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; diff --git a/core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java b/core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java index 7dbaa69e57..b7a04b0d2f 100644 --- a/core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java +++ b/core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import cucumber.api.StepDefinitionReporter; +import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.backend.StepDefinition; public class AnyStepDefinitionReporter implements StepDefinitionReporter { diff --git a/core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java b/core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java index 355f413253..3abe54c488 100644 --- a/core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java +++ b/core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java @@ -1,13 +1,13 @@ package io.cucumber.core.plugin; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; public class FormatterSpy implements EventListener { StringBuilder calls = new StringBuilder(); diff --git a/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java index a8799b89db..0fd3ccab16 100644 --- a/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import cucumber.api.Result; +import io.cucumber.core.api.event.Result; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.util.FixJava; diff --git a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java index 61aaaf9abf..7d89796185 100755 --- a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java @@ -1,7 +1,7 @@ package io.cucumber.core.plugin; -import cucumber.api.Result; -import cucumber.api.SnippetType; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.TestClasspathResourceLoader; import io.cucumber.core.event.EventBus; diff --git a/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java index 4b96fa0eb6..9b0bd91f18 100644 --- a/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import cucumber.api.Result; +import io.cucumber.core.api.event.Result; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.model.CucumberFeature; import org.custommonkey.xmlunit.Diff; diff --git a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java index 0895797bcf..73e8662bef 100644 --- a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java @@ -1,9 +1,9 @@ package io.cucumber.core.plugin; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.event.TestStepFinished; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.event.EventBus; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.runner.TimeServiceEventBus; diff --git a/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java index b5ad8b6730..0d793a3f87 100755 --- a/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import cucumber.api.Result; +import io.cucumber.core.api.event.Result; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.model.CucumberFeature; diff --git a/core/src/test/java/io/cucumber/core/plugin/RerunFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/RerunFormatterTest.java index e4721d76d8..c449ded9f6 100755 --- a/core/src/test/java/io/cucumber/core/plugin/RerunFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/RerunFormatterTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import cucumber.api.Result; +import io.cucumber.core.api.event.Result; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.model.CucumberFeature; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/plugin/StatsTest.java b/core/src/test/java/io/cucumber/core/plugin/StatsTest.java index cc7e5cec08..5c9f7827b6 100755 --- a/core/src/test/java/io/cucumber/core/plugin/StatsTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/StatsTest.java @@ -5,7 +5,7 @@ import static org.hamcrest.CoreMatchers.endsWith; import static org.hamcrest.CoreMatchers.startsWith; -import cucumber.api.Result; +import io.cucumber.core.api.event.Result; import java.io.ByteArrayOutputStream; import java.io.PrintStream; diff --git a/core/src/test/java/io/cucumber/core/plugin/StubFormatter.java b/core/src/test/java/io/cucumber/core/plugin/StubFormatter.java index 828b449e23..f39132b0b9 100644 --- a/core/src/test/java/io/cucumber/core/plugin/StubFormatter.java +++ b/core/src/test/java/io/cucumber/core/plugin/StubFormatter.java @@ -1,7 +1,7 @@ package io.cucumber.core.plugin; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; public class StubFormatter implements EventListener { diff --git a/core/src/test/java/io/cucumber/core/plugin/TestNGFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/TestNGFormatterTest.java index 0f22524166..49d727b020 100644 --- a/core/src/test/java/io/cucumber/core/plugin/TestNGFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/TestNGFormatterTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import cucumber.api.Result; +import io.cucumber.core.api.event.Result; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.model.CucumberFeature; import org.custommonkey.xmlunit.Diff; diff --git a/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java index 73d249e4b6..9b89f6da08 100644 --- a/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import cucumber.api.Result; +import io.cucumber.core.api.event.Result; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.model.CucumberFeature; import gherkin.deps.com.google.gson.Gson; diff --git a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java index 0f8f4fc491..c6f9c34880 100644 --- a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import cucumber.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; diff --git a/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java index eb1b0a269c..0c5ac99bbe 100644 --- a/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java @@ -1,10 +1,10 @@ package io.cucumber.core.plugin; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.TestStep; -import cucumber.api.event.TestStepFinished; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestStep; +import io.cucumber.core.api.event.TestStepFinished; import org.junit.Test; import org.mockito.Mockito; diff --git a/core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java b/core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java index 298c59842a..68c9c3c564 100644 --- a/core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java +++ b/core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.Argument; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; diff --git a/core/src/test/java/io/cucumber/core/runner/EventBusTest.java b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java index 3c9c641933..b739930385 100644 --- a/core/src/test/java/io/cucumber/core/runner/EventBusTest.java +++ b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java @@ -1,11 +1,11 @@ package io.cucumber.core.runner; -import cucumber.api.PickleStepTestStep; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.event.EventHandler; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; import io.cucumber.core.event.EventBus; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java b/core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java index 3df5f3f76a..a01e418202 100644 --- a/core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import org.junit.Before; diff --git a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java index f29e91da5c..e052a95f74 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.event.EventBus; diff --git a/core/src/test/java/io/cucumber/core/runner/HookTest.java b/core/src/test/java/io/cucumber/core/runner/HookTest.java index fe2b82b8b8..e99d60b679 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.Backend; diff --git a/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java index 044c5f70f3..3268495e13 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java @@ -1,9 +1,9 @@ package io.cucumber.core.runner; -import cucumber.api.HookType; -import cucumber.api.Result; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; +import io.cucumber.core.api.event.HookType; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; import io.cucumber.core.event.EventBus; diff --git a/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java index 519c2ca6b3..d40a4ad323 100644 --- a/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java @@ -1,10 +1,10 @@ package io.cucumber.core.runner; -import cucumber.api.PendingException; -import cucumber.api.Result; -import cucumber.api.event.TestCaseEvent; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; +import io.cucumber.core.runner.TestPendingException; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCaseEvent; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; @@ -18,11 +18,11 @@ import java.util.Collections; import java.util.List; -import static cucumber.api.HookType.AfterStep; -import static cucumber.api.HookType.BeforeStep; -import static cucumber.api.Result.Type.FAILED; -import static cucumber.api.Result.Type.PASSED; -import static cucumber.api.Result.Type.SKIPPED; +import static io.cucumber.core.api.event.HookType.AfterStep; +import static io.cucumber.core.api.event.HookType.BeforeStep; +import static io.cucumber.core.api.event.Result.Type.FAILED; +import static io.cucumber.core.api.event.Result.Type.PASSED; +import static io.cucumber.core.api.event.Result.Type.SKIPPED; import static java.util.Collections.singletonList; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; @@ -96,7 +96,7 @@ public void result_is_skipped_when_skip_step_is_not_run_all() { @Test public void result_is_skipped_when_before_step_hook_does_not_pass() throws Throwable { - doThrow(AssumptionViolatedException.class).when(beforeHookDefinition).execute(any(cucumber.api.Scenario.class)); + doThrow(AssumptionViolatedException.class).when(beforeHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); assertEquals(SKIPPED, scenario.getStatus()); @@ -104,7 +104,7 @@ public void result_is_skipped_when_before_step_hook_does_not_pass() throws Throw @Test public void step_execution_is_dry_run_when_before_step_hook_does_not_pass() throws Throwable { - doThrow(AssumptionViolatedException.class).when(beforeHookDefinition).execute(any(cucumber.api.Scenario.class)); + doThrow(AssumptionViolatedException.class).when(beforeHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); step.run(testCase, bus, scenario, false); verify(definitionMatch).dryRunStep(any(Scenario.class)); } @@ -112,7 +112,7 @@ public void step_execution_is_dry_run_when_before_step_hook_does_not_pass() thro @Test public void result_is_result_from_hook_when_before_step_hook_does_not_pass() throws Throwable { Exception exception = new RuntimeException(); - doThrow(exception).when(beforeHookDefinition).execute(any(cucumber.api.Scenario.class)); + doThrow(exception).when(beforeHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); Result failure = new Result(Result.Type.FAILED, 0L, exception); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); @@ -142,7 +142,7 @@ public void result_is_result_from_step_when_step_hook_does_not_pass() throws Thr public void result_is_result_from_hook_when_after_step_hook_does_not_pass() throws Throwable { Exception exception = new RuntimeException(); Result failure = new Result(Result.Type.FAILED, 0L, exception); - doThrow(exception).when(afterHookDefinition).execute(any(cucumber.api.Scenario.class)); + doThrow(exception).when(afterHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); assertEquals(FAILED, scenario.getStatus()); @@ -154,16 +154,16 @@ public void result_is_result_from_hook_when_after_step_hook_does_not_pass() thro } @Test public void after_step_hook_is_run_when_before_step_hook_does_not_pass() throws Throwable { - doThrow(RuntimeException.class).when(beforeHookDefinition).execute(any(cucumber.api.Scenario.class)); + doThrow(RuntimeException.class).when(beforeHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); step.run(testCase, bus, scenario, false); - verify(afterHookDefinition).execute(any(cucumber.api.Scenario.class)); + verify(afterHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); } @Test public void after_step_hook_is_run_when_step_does_not_pass() throws Throwable { doThrow(Exception.class).when(definitionMatch).runStep(any(Scenario.class)); step.run(testCase, bus, scenario, false); - verify(afterHookDefinition).execute(any(cucumber.api.Scenario.class)); + verify(afterHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); } @Test @@ -215,7 +215,7 @@ public void result_is_failed_when_step_definition_throws_exception() throws Thro @Test public void result_is_pending_when_step_definition_throws_pending_exception() throws Throwable { - doThrow(PendingException.class).when(definitionMatch).runStep(any(Scenario.class)); + doThrow(TestPendingException.class).when(definitionMatch).runStep(any(Scenario.class)); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); diff --git a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java index 7998abaaca..3f5e9b753f 100644 --- a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -1,7 +1,7 @@ package io.cucumber.core.runner; -import cucumber.api.Scenario; -import cucumber.api.SnippetType; +import io.cucumber.core.api.Scenario; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; diff --git a/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java index 65fcf8efe7..2f1ec7fdfd 100644 --- a/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java @@ -1,8 +1,8 @@ package io.cucumber.core.runner; -import cucumber.api.Result; -import cucumber.api.event.EmbedEvent; -import cucumber.api.event.WriteEvent; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.EmbedEvent; +import io.cucumber.core.api.event.WriteEvent; import gherkin.events.PickleEvent; import io.cucumber.core.event.EventBus; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java b/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java index dd2b2b5520..73a34fb0e2 100644 --- a/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java +++ b/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java @@ -1,9 +1,9 @@ package io.cucumber.core.runner; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.event.TestStepStarted; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestStepStarted; public class StepDurationTimeService implements TimeService, EventListener { private long stepDuration; diff --git a/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java index 31cf5a6836..422dd8e1cc 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendSupplier; import gherkin.pickles.PickleStep; diff --git a/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java index f2f1d8ca8e..39ff26a96f 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java +++ b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java @@ -1,8 +1,8 @@ package io.cucumber.core.runner; -import cucumber.api.Scenario; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; +import io.cucumber.core.api.Scenario; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; @@ -14,8 +14,8 @@ import java.util.Collections; -import static cucumber.api.HookType.AfterStep; -import static cucumber.api.HookType.BeforeStep; +import static io.cucumber.core.api.event.HookType.AfterStep; +import static io.cucumber.core.api.event.HookType.BeforeStep; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.mockito.ArgumentMatchers.isA; diff --git a/core/src/test/java/io/cucumber/core/runner/TestDefinitionArgument.java b/core/src/test/java/io/cucumber/core/runner/TestDefinitionArgument.java index 47670377f9..c114f1ab93 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestDefinitionArgument.java +++ b/core/src/test/java/io/cucumber/core/runner/TestDefinitionArgument.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.Argument; +import io.cucumber.core.api.event.Argument; import java.util.List; diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index 4f261899ab..081761bd72 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -1,11 +1,11 @@ package io.cucumber.core.runner; -import cucumber.api.PendingException; -import cucumber.api.Plugin; -import cucumber.api.Result; -import cucumber.api.Scenario; -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.EventListener; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.Scenario; +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.Event; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; @@ -44,11 +44,11 @@ import java.util.List; import java.util.Map; -import static cucumber.api.Result.Type.FAILED; -import static cucumber.api.Result.Type.PASSED; -import static cucumber.api.Result.Type.PENDING; -import static cucumber.api.Result.Type.SKIPPED; -import static cucumber.api.Result.Type.UNDEFINED; +import static io.cucumber.core.api.event.Result.Type.FAILED; +import static io.cucumber.core.api.event.Result.Type.PASSED; +import static io.cucumber.core.api.event.Result.Type.PENDING; +import static io.cucumber.core.api.event.Result.Type.SKIPPED; +import static io.cucumber.core.api.event.Result.Type.UNDEFINED; import static java.util.Locale.ENGLISH; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; @@ -159,7 +159,7 @@ private static void mockSteps(Glue glue, List features, public void execute(Object[] args) throws Throwable { super.execute(args); if (stepResult.is(PENDING)) { - throw new PendingException(); + throw new TestPendingException(); } else if (stepResult.is(FAILED)) { throw stepResult.getError(); } else if (stepResult.is(SKIPPED) && (stepResult.getError() != null)) { @@ -251,9 +251,9 @@ private static void mockHook(final SimpleEntry hookEntry, doAnswer(action).when(hook).execute((Scenario) any()); } if (hookEntry.getValue().is(FAILED)) { - doThrow(hookEntry.getValue().getError()).when(hook).execute((cucumber.api.Scenario) any()); + doThrow(hookEntry.getValue().getError()).when(hook).execute((Scenario) any()); } else if (hookEntry.getValue().is(PENDING)) { - doThrow(new PendingException()).when(hook).execute((cucumber.api.Scenario) any()); + doThrow(new TestPendingException()).when(hook).execute((io.cucumber.core.api.Scenario) any()); } if ("before".equals(hookEntry.getKey())) { beforeHooks.add(hook); @@ -390,8 +390,8 @@ public Builder withTimeServiceIncrement(long timeServiceIncrement) { * Defaults to {@link TimeServiceType#FIXED_INCREMENT_ON_STEP_START} *

    * Note: when running tests with multiple threads & not using {@link TimeServiceType#REAL_TIME} - * it can inadvertently affect the order of {@link cucumber.api.event.Event}s - * published to any {@link cucumber.api.event.ConcurrentEventListener}s used during the test run + * it can inadvertently affect the order of {@link Event}s + * published to any {@link ConcurrentEventListener}s used during the test run * * @return this instance */ @@ -448,7 +448,7 @@ public static Result result(Result.Type status) { case AMBIGUOUS: return result(status, mockAmbiguousStepDefinitionException()); case PENDING: - return result(status, new PendingException()); + return result(status, new TestPendingException()); default: return result(status, null); } diff --git a/core/src/test/java/io/cucumber/core/runner/TestPendingException.java b/core/src/test/java/io/cucumber/core/runner/TestPendingException.java new file mode 100644 index 0000000000..ed61b383e6 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/runner/TestPendingException.java @@ -0,0 +1,14 @@ +package io.cucumber.core.runner; + +import io.cucumber.core.backend.Pending; + +@Pending +public final class TestPendingException extends RuntimeException { + public TestPendingException() { + this("TODO: implement me"); + } + + public TestPendingException(String message) { + super(message); + } +} diff --git a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java index d097b26b4c..c9da887014 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.Backend; import io.cucumber.core.event.EventBus; diff --git a/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java b/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java index 2a2a09acfc..9c5c48f76d 100644 --- a/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleStep; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java index 44f3407b4f..92cf73b9b1 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java @@ -1,9 +1,9 @@ package io.cucumber.core.runtime; -import cucumber.api.Result; -import cucumber.api.TestCase; -import cucumber.api.event.TestCaseFinished; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestCaseFinished; import io.cucumber.core.event.EventBus; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.options.Env; diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index e5cbbcad09..17a8827faa 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -1,12 +1,12 @@ package io.cucumber.core.runtime; -import cucumber.api.HookType; -import cucumber.api.Plugin; -import cucumber.api.Result; -import cucumber.api.Scenario; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.TestCase; -import cucumber.api.event.TestCaseFinished; +import io.cucumber.core.api.event.HookType; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.Scenario; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.api.event.TestCaseFinished; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.io.TestClasspathResourceLoader; diff --git a/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java index 3fb8271f98..3db5b557b4 100644 --- a/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java +++ b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java @@ -1,6 +1,6 @@ package io.cucumber.core.runtime; -import cucumber.api.event.TestSourceRead; +import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.event.EventBus; diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 9cb0dbffcc..771764983e 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -1,8 +1,8 @@ package io.cucumber.core.runtime; -import cucumber.api.event.EventHandler; -import cucumber.api.event.TestCaseStarted; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.TestCaseStarted; import io.cucumber.core.event.EventBus; import io.cucumber.core.options.Env; import io.cucumber.core.runner.Runner; diff --git a/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java b/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java index be6808d35a..bbe46b1742 100644 --- a/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java +++ b/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.snippets; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/core/src/test/resources/io/cucumber/core/io/bar.properties b/core/src/test/resources/io/cucumber/core/bar.properties similarity index 100% rename from core/src/test/resources/io/cucumber/core/io/bar.properties rename to core/src/test/resources/io/cucumber/core/bar.properties diff --git a/core/src/test/resources/io/cucumber/core/io/foo.properties b/core/src/test/resources/io/cucumber/core/foo.properties similarity index 100% rename from core/src/test/resources/io/cucumber/core/io/foo.properties rename to core/src/test/resources/io/cucumber/core/foo.properties diff --git a/core/src/test/resources/io/cucumber/core/io/has spaces.properties b/core/src/test/resources/io/cucumber/core/has spaces.properties similarity index 100% rename from core/src/test/resources/io/cucumber/core/io/has spaces.properties rename to core/src/test/resources/io/cucumber/core/has spaces.properties diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java index c7d071ec65..846f7c5fd1 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java @@ -1,7 +1,7 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistry; import io.cucumber.examples.java.calculator.ShoppingStepdefs.Price; import io.cucumber.datatable.DataTableType; import io.cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index faa18bb85b..be986911d1 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import cucumber.api.java.After; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java index 7df7291b7a..6b5c08aa2d 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java @@ -1,6 +1,6 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.testng.CucumberFeatureWrapper; import cucumber.api.testng.PickleEventWrapper; import cucumber.api.testng.TestNGCucumberRunner; diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index 70831989cf..a41e838573 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.testng.AbstractTestNGCucumberTests; import org.testng.annotations.DataProvider; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java index 641a16e327..485adba05e 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java @@ -1,7 +1,7 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistry; import io.cucumber.datatable.DataTableType; import io.cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; import io.cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index f100ce1491..c64686efb6 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import cucumber.api.java.After; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index ac97a316e4..eef8597d45 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index 4d839968fa..ec395c3175 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import io.cucumber.datatable.DataTable; import cucumber.api.java8.En; diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index 1b9e0f83de..c5bce21396 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/TypeRegistryConfiguration.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/TypeRegistryConfiguration.java index 026f77333f..317bafe6d8 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/TypeRegistryConfiguration.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/TypeRegistryConfiguration.java @@ -1,7 +1,7 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistry; import io.cucumber.datatable.DataTableType; import io.cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; import io.cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java index c9b016d723..7d0cd706f1 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.examples.spring.txn; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/TypeRegistryConfiguration.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/TypeRegistryConfiguration.java index bb7da9c6d4..64afa07c2f 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/TypeRegistryConfiguration.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/TypeRegistryConfiguration.java @@ -1,7 +1,7 @@ package io.cucumber.examples.spring.txn; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistry; import io.cucumber.datatable.DataTableType; import io.cucumber.datatable.TableEntryTransformer; diff --git a/core/src/main/java/cucumber/api/PendingException.java b/java/src/main/java/cucumber/api/java/PendingException.java similarity index 82% rename from core/src/main/java/cucumber/api/PendingException.java rename to java/src/main/java/cucumber/api/java/PendingException.java index e91973c3aa..24606e14cc 100644 --- a/core/src/main/java/cucumber/api/PendingException.java +++ b/java/src/main/java/cucumber/api/java/PendingException.java @@ -1,4 +1,6 @@ -package cucumber.api; +package cucumber.api.java; + +import io.cucumber.core.backend.Pending; // We're deliberately not extending CucumberException (which is used to signal fatal errors) @Pending diff --git a/core/src/main/java/cucumber/api/Transpose.java b/java/src/main/java/cucumber/api/java/Transpose.java similarity index 97% rename from core/src/main/java/cucumber/api/Transpose.java rename to java/src/main/java/cucumber/api/java/Transpose.java index fb92a16f4c..713874285b 100644 --- a/core/src/main/java/cucumber/api/Transpose.java +++ b/java/src/main/java/cucumber/api/java/Transpose.java @@ -1,4 +1,4 @@ -package cucumber.api; +package cucumber.api.java; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/main/java/io/cucumber/java/Java8Snippet.java b/java/src/main/java/io/cucumber/java/Java8Snippet.java index dc27cbd3d8..0a25a55c9d 100644 --- a/java/src/main/java/io/cucumber/java/Java8Snippet.java +++ b/java/src/main/java/io/cucumber/java/Java8Snippet.java @@ -7,7 +7,7 @@ public String template() { return "" + "{0}(\"{1}\", ({3}) -> '{'\n" + " // {4}\n" + - "{5} throw new cucumber.api.PendingException();\n" + + "{5} throw new cucumber.api.java.PendingException();\n" + "'}');\n"; } } diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 185cd9c68b..80ca08b6ac 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -4,7 +4,7 @@ import static io.cucumber.java.ObjectFactoryLoader.loadObjectFactory; import static java.lang.Thread.currentThread; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.runtime.Invoker; import io.cucumber.core.stepexpression.TypeRegistry; import cucumber.api.java.After; diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index 005de5fa8f..7dfe3bba38 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -1,6 +1,6 @@ package io.cucumber.java; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import cucumber.api.java.ObjectFactory; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.backend.HookDefinition; diff --git a/java/src/main/java/io/cucumber/java/JavaSnippet.java b/java/src/main/java/io/cucumber/java/JavaSnippet.java index fd5af70d1d..3f4955bbc2 100644 --- a/java/src/main/java/io/cucumber/java/JavaSnippet.java +++ b/java/src/main/java/io/cucumber/java/JavaSnippet.java @@ -8,7 +8,7 @@ public String template() { "@{0}(\"{1}\")\n" + "public void {2}({3}) '{'\n" + " // {4}\n" + - "{5} throw new cucumber.api.PendingException();\n" + + "{5} throw new cucumber.api.java.PendingException();\n" + "'}'\n"; } } diff --git a/java/src/main/java/io/cucumber/java/ParameterInfo.java b/java/src/main/java/io/cucumber/java/ParameterInfo.java index 82bf03e659..17969ff52f 100644 --- a/java/src/main/java/io/cucumber/java/ParameterInfo.java +++ b/java/src/main/java/io/cucumber/java/ParameterInfo.java @@ -1,6 +1,6 @@ package io.cucumber.java; -import cucumber.api.Transpose; +import cucumber.api.java.Transpose; import java.lang.annotation.Annotation; import java.lang.reflect.Method; diff --git a/java/src/test/java/io/cucumber/java/Java8SnippetTest.java b/java/src/test/java/io/cucumber/java/Java8SnippetTest.java index 0d375aa901..dbebc6d4ec 100644 --- a/java/src/test/java/io/cucumber/java/Java8SnippetTest.java +++ b/java/src/test/java/io/cucumber/java/Java8SnippetTest.java @@ -21,7 +21,7 @@ public void generatesPlainSnippet() { String expected = "" + "Given(\"I have {int} cukes in my {string} belly\", (Integer int1, String string) -> {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "});\n"; System.out.println(expected); assertEquals(expected, snippetFor("I have 4 cukes in my \"big\" belly")); diff --git a/java/src/test/java/io/cucumber/java/JavaHookTest.java b/java/src/test/java/io/cucumber/java/JavaHookTest.java index 50625a3111..9b1648308a 100644 --- a/java/src/test/java/io/cucumber/java/JavaHookTest.java +++ b/java/src/test/java/io/cucumber/java/JavaHookTest.java @@ -1,6 +1,6 @@ package io.cucumber.java; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import cucumber.api.java.After; import cucumber.api.java.AfterStep; import cucumber.api.java.Before; @@ -186,7 +186,7 @@ public void fails_if_hook_argument_is_not_scenario_result() throws Throwable { verify(glue).addAfterHook(javaHookDefinitionArgumentCaptor.capture()); HookDefinition bad = javaHookDefinitionArgumentCaptor.getValue(); - expectedException.expectMessage("When a hook declares an argument it must be of type cucumber.api.Scenario. public void io.cucumber.java.JavaHookTest$BadHook.after(java.lang.String)"); + expectedException.expectMessage("When a hook declares an argument it must be of type io.cucumber.core.api.Scenario. public void io.cucumber.java.JavaHookTest$BadHook.after(java.lang.String)"); bad.execute(mock(Scenario.class)); } diff --git a/java/src/test/java/io/cucumber/java/JavaSnippetTest.java b/java/src/test/java/io/cucumber/java/JavaSnippetTest.java index 114f99e698..8def71f965 100644 --- a/java/src/test/java/io/cucumber/java/JavaSnippetTest.java +++ b/java/src/test/java/io/cucumber/java/JavaSnippetTest.java @@ -1,6 +1,6 @@ package io.cucumber.java; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.snippets.SnippetGenerator; import gherkin.pickles.Argument; import gherkin.pickles.PickleCell; @@ -35,7 +35,7 @@ public void generatesPlainSnippet() { "@Given(\"I have {int} cukes in my {string} belly\")\n" + "public void i_have_cukes_in_my_belly(Integer int1, String string) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 4 cukes in my \"big\" belly")); } @@ -58,7 +58,7 @@ public Size transform(String... strings) { "@Given(\"I have {double} cukes in my {size} belly\")\n" + "public void i_have_cukes_in_my_belly(Double double1, Size size) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 4.2 cukes in my large belly", customParameterType)); } @@ -83,7 +83,7 @@ public List transform(String... strings) { "@Given(\"I have {sizes} bellies\")\n" + "public void i_have_bellies(java.util.List sizes) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have large and small bellies", customParameterType)); } @@ -94,7 +94,7 @@ public void generatesCopyPasteReadyStepSnippetForNumberParameters() { "@Given(\"before {int} after\")\n" + "public void before_after(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("before 5 after")); } @@ -105,7 +105,7 @@ public void generatesCopyPasteReadySnippetWhenStepHasIllegalJavaIdentifierChars( "@Given(\"I have {int} cukes in: my {string} red-belly!\")\n" + "public void i_have_cukes_in_my_red_belly(Integer int1, String string) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 4 cukes in: my \"big\" red-belly!")); } @@ -116,7 +116,7 @@ public void generatesCopyPasteReadySnippetWhenStepHasIntegersInsideStringParamet "@Given(\"the DI system receives a message saying {string}\")\n" + "public void the_DI_system_receives_a_message_saying(String string) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("the DI system receives a message saying \"{ dataIngestion: { feeds: [ feed: { merchantId: 666, feedId: 1, feedFileLocation: feed.csv } ] }\"")); } @@ -127,7 +127,7 @@ public void generatesSnippetWithDollarSigns() { "@Given(\"I have ${int}\")\n" + "public void i_have_$(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have $5")); } @@ -138,7 +138,7 @@ public void generatesSnippetWithQuestionMarks() { "@Given(\"is there an error?:\")\n" + "public void is_there_an_error() {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("is there an error?:")); } @@ -149,7 +149,7 @@ public void generatesSnippetWithLotsOfNonIdentifierCharacters() { "@Given(\"\\\\([a-z]*)?.+\")\n" + "public void a_z() {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("([a-z]*)?.+")); } @@ -160,7 +160,7 @@ public void generatesSnippetWithParentheses() { "@Given(\"I have {int} cukes \\\\(maybe more)\")\n" + "public void i_have_cukes_maybe_more(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 5 cukes (maybe more)")); } @@ -171,7 +171,7 @@ public void generatesSnippetWithBrackets() { "@Given(\"I have {int} cukes [maybe more]\")\n" + "public void i_have_cukes_maybe_more(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 5 cukes [maybe more]")); } @@ -182,7 +182,7 @@ public void generatesSnippetWithDocString() { "@Given(\"I have:\")\n" + "public void i_have(String docString) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetForDocString("I have:", new PickleString(null, "hello"))); } @@ -206,13 +206,13 @@ public String transform(String... strings) { "@Given(\"I have a {docString}:\")\n" + "public void i_have_a(String docString, String docString1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n" + "\n" + "@Given(\"I have a {string}:\")\n" + "public void i_have_a(String string, String docString) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetForDocString("I have a \"Documentation String\":", new PickleString(null, "hello"), customParameterType)); } @@ -240,7 +240,7 @@ public void generatesSnippetWithDataTable() { " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + " //\n" + " // For other transformations you can register a DataTableType.\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; PickleTable dataTable = new PickleTable(asList(new PickleRow(asList(new PickleCell(null, "col1"))))); assertEquals(expected, snippetForDataTable("I have:", dataTable)); @@ -272,7 +272,7 @@ public String transform(String... strings) { " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + " //\n" + " // For other transformations you can register a DataTableType.\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n" + "\n" + "@Given(\"I have in table {string}:\")\n" + @@ -284,7 +284,7 @@ public String transform(String... strings) { " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + " //\n" + " // For other transformations you can register a DataTableType.\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; PickleTable dataTable = new PickleTable(asList(new PickleRow(asList(new PickleCell(null, "col1"))))); assertEquals(expected, snippetForDataTable("I have in table \"M6\":", dataTable, customParameterType)); @@ -296,7 +296,7 @@ public void generateSnippetWithOutlineParam() { "@Given(\"Then it responds \")\n" + "public void then_it_responds_param() {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.PendingException();\n" + + " throw new cucumber.api.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("Then it responds ")); diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 4551b7c04e..267140a41f 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -1,8 +1,8 @@ package io.cucumber.java; -import cucumber.api.Result; -import cucumber.api.event.EventHandler; -import cucumber.api.event.TestStepFinished; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.TestStepFinished; import cucumber.api.java.ObjectFactory; import cucumber.api.java.en.Given; import io.cucumber.core.options.Env; diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java index d640c35c1d..7670397781 100755 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java @@ -1,6 +1,6 @@ package io.cucumber.java; -import cucumber.api.Transpose; +import cucumber.api.java.Transpose; import cucumber.api.java.ObjectFactory; import io.cucumber.core.backend.StepDefinition; import gherkin.pickles.PickleCell; diff --git a/java/src/test/java/io/cucumber/java/test/Authors.java b/java/src/test/java/io/cucumber/java/test/Authors.java index 6a7561c3f7..980e64cdde 100644 --- a/java/src/test/java/io/cucumber/java/test/Authors.java +++ b/java/src/test/java/io/cucumber/java/test/Authors.java @@ -1,6 +1,6 @@ package io.cucumber.java.test; -import cucumber.api.Transpose; +import cucumber.api.java.Transpose; import cucumber.api.java.en.Given; import java.util.List; diff --git a/java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java b/java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java index 12f852684b..540e057b8a 100644 --- a/java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java +++ b/java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java @@ -1,6 +1,6 @@ package io.cucumber.java.test; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import cucumber.api.java.Before; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; diff --git a/java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java b/java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java index 0e1cc6d9a4..35dc165fe3 100644 --- a/java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java +++ b/java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java @@ -1,7 +1,7 @@ package io.cucumber.java.test; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistry; import io.cucumber.datatable.DataTable; import io.cucumber.datatable.DataTableType; import io.cucumber.datatable.TableEntryTransformer; diff --git a/java8/src/main/java/cucumber/api/java8/HookBody.java b/java8/src/main/java/cucumber/api/java8/HookBody.java index a08688fc6d..235286c29d 100644 --- a/java8/src/main/java/cucumber/api/java8/HookBody.java +++ b/java8/src/main/java/cucumber/api/java8/HookBody.java @@ -1,6 +1,6 @@ package cucumber.api.java8; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; public interface HookBody { void accept(Scenario scenario) throws Throwable; diff --git a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java index 2b49d98624..616b6316af 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java @@ -2,7 +2,7 @@ import static java.util.Arrays.asList; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import cucumber.api.java8.HookBody; import cucumber.api.java8.HookNoArgsBody; import io.cucumber.core.backend.HookDefinition; diff --git a/java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java b/java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java index 6c69f99a52..33f8864dae 100644 --- a/java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java @@ -5,7 +5,7 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; -import cucumber.api.Scenario; +import io.cucumber.core.api.Scenario; import io.cucumber.datatable.DataTable; import cucumber.api.java8.En; diff --git a/java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java b/java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java index afc602a72e..16c6468b9f 100644 --- a/java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java +++ b/java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java @@ -1,7 +1,7 @@ package io.cucumber.java8.test; -import cucumber.api.TypeRegistryConfigurer; -import cucumber.api.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.api.TypeRegistry; import io.cucumber.datatable.DataTableType; import io.cucumber.java8.test.LambdaStepdefs.Person; diff --git a/junit/src/main/java/cucumber/api/junit/Cucumber.java b/junit/src/main/java/cucumber/api/junit/Cucumber.java index 8aa33d02ec..53e7677c7b 100644 --- a/junit/src/main/java/cucumber/api/junit/Cucumber.java +++ b/junit/src/main/java/cucumber/api/junit/Cucumber.java @@ -1,9 +1,9 @@ package cucumber.api.junit; -import cucumber.api.CucumberOptions; -import cucumber.api.StepDefinitionReporter; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestRunStarted; +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.junit.Assertions; import io.cucumber.junit.FeatureRunner; import io.cucumber.junit.JUnitOptions; diff --git a/junit/src/main/java/io/cucumber/junit/JUnitReporter.java b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java index 436e838004..1ee87653c9 100644 --- a/junit/src/main/java/io/cucumber/junit/JUnitReporter.java +++ b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java @@ -1,12 +1,12 @@ package io.cucumber.junit; -import cucumber.api.Result; -import cucumber.api.PickleStepTestStep; -import cucumber.api.event.EventHandler; -import cucumber.api.event.TestCaseFinished; -import cucumber.api.event.TestCaseStarted; -import cucumber.api.event.TestStepFinished; -import cucumber.api.event.TestStepStarted; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.PickleStepTestStep; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.api.event.TestStepStarted; import io.cucumber.junit.PickleRunners.PickleRunner; import io.cucumber.core.event.EventBus; import org.junit.runner.Description; diff --git a/junit/src/test/java/io/cucumber/junit/CucumberTest.java b/junit/src/test/java/io/cucumber/junit/CucumberTest.java index 6aa38ee511..af2e7bb0b9 100644 --- a/junit/src/test/java/io/cucumber/junit/CucumberTest.java +++ b/junit/src/test/java/io/cucumber/junit/CucumberTest.java @@ -1,7 +1,7 @@ package io.cucumber.junit; import cucumber.annotation.DummyWhen; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.junit.Cucumber; import io.cucumber.core.exception.CucumberException; import org.junit.After; diff --git a/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java index 8db02bb75f..7779e6188a 100644 --- a/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java +++ b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java @@ -1,8 +1,7 @@ package io.cucumber.junit; -import cucumber.api.PendingException; -import cucumber.api.Result; -import cucumber.api.PickleStepTestStep; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.PickleStepTestStep; import io.cucumber.core.event.EventBus; import io.cucumber.junit.JUnitReporter.EachTestNotifier; import io.cucumber.junit.JUnitReporter.NoTestNotifier; @@ -157,7 +156,7 @@ public void test_step_finished_fires_assumption_failed_and_test_finished_for_pen createDefaultRunNotifier(); Description description = mock(Description.class); setUpStepNotifierAndStepErrors(description); - Throwable exception = new PendingException(); + Throwable exception = new TestPendingException(); Result result = mockResult(Result.Type.PENDING, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -177,7 +176,7 @@ public void test_step_finished_fires_assumption_failed_and_test_finished_for_pen createDefaultRunNotifier(); Description description = mock(Description.class); setUpStepNotifierAndStepErrors(description); - Throwable exception = new PendingException(); + Throwable exception = new TestPendingException(); Result result = mockResult(Result.Type.PENDING, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -196,7 +195,7 @@ public void test_step_finished_adds_the_step_exeption_for_pending_steps() { createNonStrictReporter(); createDefaultRunNotifier(); setUpNoStepNotifierAndStepErrors(); - Throwable exception = new PendingException(); + Throwable exception = new TestPendingException(); Result result = mockResult(Result.Type.PENDING, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -283,7 +282,7 @@ public void test_step_finished_adds_the_step_exeption_for_failed_steps() { createNonStrictReporter(); createDefaultRunNotifier(); setUpNoStepNotifierAndStepErrors(); - Throwable exception = new PendingException(); + Throwable exception = new TestPendingException(); Result result = mockResult(Result.Type.FAILED, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); diff --git a/junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java b/junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java index ec5dc5fdd1..78f1fe7382 100644 --- a/junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java +++ b/junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java @@ -1,6 +1,6 @@ package io.cucumber.junit; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/junit/src/test/java/io/cucumber/junit/TestPendingException.java b/junit/src/test/java/io/cucumber/junit/TestPendingException.java new file mode 100644 index 0000000000..eaa5ca54ac --- /dev/null +++ b/junit/src/test/java/io/cucumber/junit/TestPendingException.java @@ -0,0 +1,14 @@ +package io.cucumber.junit; + +import io.cucumber.core.backend.Pending; + +@Pending +public final class TestPendingException extends RuntimeException { + public TestPendingException() { + this("TODO: implement me"); + } + + public TestPendingException(String message) { + super(message); + } +} diff --git a/junit/src/test/java/io/cucumber/junit/stub/StubBackend.java b/junit/src/test/java/io/cucumber/junit/stub/StubBackend.java index 6e860f1477..b8ba7f84c9 100644 --- a/junit/src/test/java/io/cucumber/junit/stub/StubBackend.java +++ b/junit/src/test/java/io/cucumber/junit/stub/StubBackend.java @@ -1,6 +1,6 @@ package io.cucumber.junit.stub; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.TypeRegistry; diff --git a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt index 9d66dd11ae..bd9d2bff5a 100644 --- a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt @@ -1,6 +1,6 @@ package io.cucumber.runtime.kotlin.test; -import cucumber.api.Scenario +import io.cucumber.core.api.Scenario import io.cucumber.datatable.DataTable import cucumber.api.java8.En import org.junit.Assert.* diff --git a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt index 8cdf678b63..e9d395e27d 100644 --- a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt @@ -1,7 +1,7 @@ package io.cucumber.runtime.kotlin.test -import cucumber.api.TypeRegistryConfigurer -import cucumber.api.TypeRegistry +import io.cucumber.core.api.TypeRegistryConfigurer +import io.cucumber.core.api.TypeRegistry import io.cucumber.datatable.DataTableType import io.cucumber.datatable.TableEntryTransformer import java.util.Locale diff --git a/picocontainer/pom.xml b/picocontainer/pom.xml index 0e7b377767..8007af6de0 100644 --- a/picocontainer/pom.xml +++ b/picocontainer/pom.xml @@ -53,7 +53,7 @@ - + diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java b/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java index 4c80017940..5873c3eea4 100644 --- a/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java @@ -1,7 +1,7 @@ package io.cucumber.picocontainer; -import cucumber.api.PendingException; -import cucumber.api.Scenario; +import cucumber.api.java.PendingException; +import io.cucumber.core.api.Scenario; import cucumber.api.java.After; import cucumber.api.java.Before; import cucumber.api.java.en.Given; diff --git a/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java index 399d314609..abcc086d20 100644 --- a/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.spring.contextconfig; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java index a468972d1c..61114f71e3 100644 --- a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.spring.dirtiescontextconfig; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java index 65a203aeed..efe25e9660 100644 --- a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.spring.metaconfig.dirties; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java index ee2b1acdd3..75cc171111 100644 --- a/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.spring.metaconfig.general; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/spring/src/test/java/io/cucumber/spring/threading/RunParallelCukesTest.java b/spring/src/test/java/io/cucumber/spring/threading/RunParallelCukesTest.java index b51dac867f..dd85677097 100644 --- a/spring/src/test/java/io/cucumber/spring/threading/RunParallelCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/threading/RunParallelCukesTest.java @@ -3,7 +3,7 @@ import static java.util.concurrent.Executors.newFixedThreadPool; import static org.junit.Assert.assertEquals; -import cucumber.api.cli.Main; +import io.cucumber.core.api.cli.Main; import org.junit.Test; import java.util.concurrent.Callable; diff --git a/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java index 662ea1f10a..3feac61a08 100644 --- a/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.spring.webappconfig; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java b/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java index 2640e93df9..d08fc1e402 100644 --- a/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java +++ b/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java @@ -1,8 +1,8 @@ package cucumber.api.testng; -import cucumber.api.Result; -import cucumber.api.event.EventHandler; -import cucumber.api.event.TestCaseFinished; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.api.event.TestCaseFinished; import io.cucumber.core.event.EventBus; import io.cucumber.core.exception.CucumberException; import org.testng.SkipException; diff --git a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java b/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java index ab6e29fe9a..d99d1e99e6 100644 --- a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java @@ -1,7 +1,7 @@ package cucumber.api.testng; -import cucumber.api.event.TestRunFinished; -import cucumber.api.event.TestRunStarted; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.runner.Runner; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; @@ -40,7 +40,7 @@ public class TestNGCucumberRunner { /** * Bootstrap the cucumber runtime * - * @param clazz Which has the cucumber.api.CucumberOptions and org.testng.annotations.Test annotations + * @param clazz Which has the io.cucumber.core.api.options.CucumberOptions and org.testng.annotations.Test annotations */ public TestNGCucumberRunner(Class clazz) { ClassLoader classLoader = clazz.getClassLoader(); diff --git a/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java b/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java index 63efcb3ae6..945a70778a 100644 --- a/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java +++ b/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java @@ -1,7 +1,6 @@ package cucumber.api.testng; -import cucumber.api.PendingException; -import cucumber.api.Result; +import io.cucumber.core.api.event.Result; import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; @@ -87,7 +86,7 @@ public void should_not_be_skipped_for_pending_result_in_strict_mode() { resultListener.receiveResult(mockPendingResult()); assertFalse(resultListener.isPassed()); - assertTrue(resultListener.getError() instanceof PendingException); + assertTrue(resultListener.getError() instanceof TestPendingException); } @Test @@ -121,7 +120,7 @@ private Result mockAmbiguousResult() { } private Result mockPendingResult() { - return new Result(Result.Type.PENDING, 0L, new PendingException()); + return new Result(Result.Type.PENDING, 0L, new TestPendingException()); } } diff --git a/testng/src/test/java/cucumber/api/testng/TestPendingException.java b/testng/src/test/java/cucumber/api/testng/TestPendingException.java new file mode 100644 index 0000000000..1cd7db3265 --- /dev/null +++ b/testng/src/test/java/cucumber/api/testng/TestPendingException.java @@ -0,0 +1,14 @@ +package cucumber.api.testng; + +import io.cucumber.core.backend.Pending; + +@Pending +public final class TestPendingException extends RuntimeException { + public TestPendingException() { + this("TODO: implement me"); + } + + public TestPendingException(String message) { + super(message); + } +} diff --git a/testng/src/test/java/io/cucumber/testng/RunCukesStrict.java b/testng/src/test/java/io/cucumber/testng/RunCukesStrict.java index 71314ed61a..2df36855ce 100644 --- a/testng/src/test/java/io/cucumber/testng/RunCukesStrict.java +++ b/testng/src/test/java/io/cucumber/testng/RunCukesStrict.java @@ -1,6 +1,6 @@ package io.cucumber.testng; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.testng.AbstractTestNGCucumberTests; @CucumberOptions(strict = true) diff --git a/testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java b/testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java index f6fbc8b216..acb007b216 100644 --- a/testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java +++ b/testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java @@ -1,6 +1,6 @@ package io.cucumber.testng; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.testng.AbstractTestNGCucumberTests; @CucumberOptions( diff --git a/testng/src/test/java/io/cucumber/testng/RunScenarioWithUndefinedStepsStrict.java b/testng/src/test/java/io/cucumber/testng/RunScenarioWithUndefinedStepsStrict.java index 296367a68c..fd41bd06e3 100644 --- a/testng/src/test/java/io/cucumber/testng/RunScenarioWithUndefinedStepsStrict.java +++ b/testng/src/test/java/io/cucumber/testng/RunScenarioWithUndefinedStepsStrict.java @@ -1,6 +1,6 @@ package io.cucumber.testng; -import cucumber.api.CucumberOptions; +import io.cucumber.core.api.options.CucumberOptions; import cucumber.api.testng.AbstractTestNGCucumberTests; @CucumberOptions( diff --git a/testng/src/test/java/io/cucumber/testng/stub/StubBackend.java b/testng/src/test/java/io/cucumber/testng/stub/StubBackend.java index d07d55e939..59e4d5dc0e 100644 --- a/testng/src/test/java/io/cucumber/testng/stub/StubBackend.java +++ b/testng/src/test/java/io/cucumber/testng/stub/StubBackend.java @@ -1,6 +1,6 @@ package io.cucumber.runtime.stub; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.Glue; From d961d56210e172a074cdf6693a8dc2a7b08f68d2 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 9 Sep 2018 23:51:38 +0200 Subject: [PATCH 033/155] [Core] Add deprecation notice to main --- core/src/main/java/cucumber/api/cli/Main.java | 14 ++++++++++++++ .../main/java/io/cucumber/core/api/cli/Main.java | 2 +- .../io/cucumber/core/options/RuntimeOptions.java | 2 +- .../cucumber/core}/api/cli/USAGE.txt | 0 4 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/cucumber/api/cli/Main.java rename core/src/main/resources/{cucumber => io/cucumber/core}/api/cli/USAGE.txt (100%) diff --git a/core/src/main/java/cucumber/api/cli/Main.java b/core/src/main/java/cucumber/api/cli/Main.java new file mode 100644 index 0000000000..6434192913 --- /dev/null +++ b/core/src/main/java/cucumber/api/cli/Main.java @@ -0,0 +1,14 @@ +package cucumber.api.cli; + +/** + * @deprecated use {@link io.cucumber.core.api.cli.Main} + */ +@Deprecated +public class Main { + + + public static void main(String[] argv) { + System.err.println("You are using deprecated Main method. Please use io.cucumber.core.api.cli.Main"); + io.cucumber.core.api.cli.Main.main(argv); + } +} diff --git a/core/src/main/java/io/cucumber/core/api/cli/Main.java b/core/src/main/java/io/cucumber/core/api/cli/Main.java index fc37c2b717..2da085d7a2 100644 --- a/core/src/main/java/io/cucumber/core/api/cli/Main.java +++ b/core/src/main/java/io/cucumber/core/api/cli/Main.java @@ -12,7 +12,7 @@ public static void main(String[] argv) { /** * Launches the Cucumber-JVM command line. * - * @param argv runtime options. See details in the {@code cucumber.api.cli.Usage.txt} resource. + * @param argv runtime options. See details in the {@code cucumber.api.cucumber.api.cli.Usage.txt} resource. * @param classLoader classloader used to load the runtime * @return 0 if execution was successful, 1 if it was not (test failures) */ diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 294add09d8..687a838772 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -35,7 +35,7 @@ public final class RuntimeOptions io.cucumber.core.filter.Options { static final String VERSION = ResourceBundle.getBundle("io.cucumber.core.version").getString("cucumber-jvm.version"); - private static final String USAGE_RESOURCE = "/cucumber/api/cli/USAGE.txt"; + private static final String USAGE_RESOURCE = "/io/cucumber/core/api/cli/USAGE.txt"; private static final Pattern RERUN_PATH_SPECIFICATION = Pattern.compile("(?m:^| |)(.*?\\.feature(?:(?::\\d+)*))"); static String usageText; diff --git a/core/src/main/resources/cucumber/api/cli/USAGE.txt b/core/src/main/resources/io/cucumber/core/api/cli/USAGE.txt similarity index 100% rename from core/src/main/resources/cucumber/api/cli/USAGE.txt rename to core/src/main/resources/io/cucumber/core/api/cli/USAGE.txt From 7e7bc946545df4b340abf910a9fe522b1675a5de Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Mon, 10 Sep 2018 00:19:17 +0200 Subject: [PATCH 034/155] [JUnit] Move junit api packages to io.cucumber.junit.api --- .../java/calculator/RunCukesTest.java | 2 +- .../examples/java/wicket/RunCukesIT.java | 2 +- .../java/calculator/RunCukesTest.java | 2 +- .../examples/spring/txn/RunCukesTest.java | 2 +- .../guice/integration/RunCukesTest.java | 2 +- .../io/cucumber/java/test/RunCukesTest.java | 2 +- .../io/cucumber/java8/test/RunCukesTest.java | 2 +- .../io/cucumber/junit/NotificationLevel.java | 10 --- .../io/cucumber/junit/SkippedThrowable.java | 9 -- .../cucumber/junit/{ => api}/Assertions.java | 6 +- .../cucumber/junit/api}/Cucumber.java | 5 +- .../junit/{ => api}/FeatureRunner.java | 12 +-- .../junit/{ => api}/JUnitOptions.java | 12 +-- .../junit/{ => api}/JUnitReporter.java | 15 ++-- .../junit/{ => api}/PickleRunners.java | 2 +- .../cucumber/junit/api/SkippedThrowable.java | 18 ++++ .../junit/{ => api}/UndefinedThrowable.java | 8 +- .../{ => io}/cucumber/api/junit/OPTIONS.txt | 0 .../java/cucumber/annotation/DummyWhen.java | 12 --- .../junit/{ => api}/AssertionsTest.java | 5 +- .../junit/{ => api}/CucumberTest.java | 21 +++-- .../junit/{ => api}/DescriptionMatcher.java | 2 +- .../junit/{ => api}/FailureMatcher.java | 2 +- .../junit/{ => api}/FeatureRunnerTest.java | 2 +- .../junit/{ => api}/JUnitReporterTest.java | 8 +- ...ickleRunnerWithNoStepDescriptionsTest.java | 4 +- .../PickleRunnerWithStepDescriptionsTest.java | 6 +- .../junit/{ => api}/RunCukesTest.java | 3 +- .../RunCukesTestNoStepNotifications.java | 3 +- .../io/cucumber/junit/api}/SanityChecker.java | 2 +- .../cucumber/junit/{ => api}/SanityTest.java | 2 +- .../junit/{ => api}/TestPendingException.java | 2 +- .../junit/{ => api}/TestPickleBuilder.java | 2 +- .../junit/{ => api}/stub/StubBackend.java | 2 +- .../io/cucumber/junit/{ => api}/fa.feature | 0 .../io/cucumber/junit/{ => api}/fb.feature | 0 .../{ => junit}/error/lexer_error.feature | 0 .../kotlin/io/cucumber/kotlin/RunCukesTest.kt | 2 +- .../java/io/cucumber/needle/RunCukesTest.java | 2 +- .../io/cucumber/openejb/RunCukesTest.java | 2 +- .../cucumber/picocontainer/RunCukesTest.java | 2 +- .../cucumber/picocontainer/SanityChecker.java | 86 +++++++++++++++++++ .../io/cucumber/picocontainer/SanityTest.java | 1 - .../spring/contextconfig/RunCukesTest.java | 2 +- .../dirtiescontextconfig/RunCukesTest.java | 2 +- .../metaconfig/dirties/RunCukesTest.java | 2 +- .../metaconfig/general/RunCukesTest.java | 2 +- .../spring/webappconfig/RunCukesTest.java | 2 +- .../java/io/cucumber/weld/RunCukesTest.java | 2 +- 49 files changed, 186 insertions(+), 110 deletions(-) delete mode 100644 junit/src/main/java/io/cucumber/junit/NotificationLevel.java delete mode 100644 junit/src/main/java/io/cucumber/junit/SkippedThrowable.java rename junit/src/main/java/io/cucumber/junit/{ => api}/Assertions.java (90%) rename junit/src/main/java/{cucumber/api/junit => io/cucumber/junit/api}/Cucumber.java (97%) rename junit/src/main/java/io/cucumber/junit/{ => api}/FeatureRunner.java (89%) rename junit/src/main/java/io/cucumber/junit/{ => api}/JUnitOptions.java (88%) rename junit/src/main/java/io/cucumber/junit/{ => api}/JUnitReporter.java (94%) rename junit/src/main/java/io/cucumber/junit/{ => api}/PickleRunners.java (99%) create mode 100644 junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java rename junit/src/main/java/io/cucumber/junit/{ => api}/UndefinedThrowable.java (58%) rename junit/src/main/resources/{ => io}/cucumber/api/junit/OPTIONS.txt (100%) delete mode 100644 junit/src/test/java/cucumber/annotation/DummyWhen.java rename junit/src/test/java/io/cucumber/junit/{ => api}/AssertionsTest.java (84%) rename junit/src/test/java/io/cucumber/junit/{ => api}/CucumberTest.java (92%) rename junit/src/test/java/io/cucumber/junit/{ => api}/DescriptionMatcher.java (92%) rename junit/src/test/java/io/cucumber/junit/{ => api}/FailureMatcher.java (92%) rename junit/src/test/java/io/cucumber/junit/{ => api}/FeatureRunnerTest.java (99%) rename junit/src/test/java/io/cucumber/junit/{ => api}/JUnitReporterTest.java (99%) rename junit/src/test/java/io/cucumber/junit/{ => api}/PickleRunnerWithNoStepDescriptionsTest.java (95%) rename junit/src/test/java/io/cucumber/junit/{ => api}/PickleRunnerWithStepDescriptionsTest.java (97%) rename junit/src/test/java/io/cucumber/junit/{ => api}/RunCukesTest.java (58%) rename junit/src/test/java/io/cucumber/junit/{ => api}/RunCukesTestNoStepNotifications.java (77%) rename junit/src/{main/java/io/cucumber/junit => test/java/io/cucumber/junit/api}/SanityChecker.java (98%) rename junit/src/test/java/io/cucumber/junit/{ => api}/SanityTest.java (93%) rename junit/src/test/java/io/cucumber/junit/{ => api}/TestPendingException.java (90%) rename junit/src/test/java/io/cucumber/junit/{ => api}/TestPickleBuilder.java (97%) rename junit/src/test/java/io/cucumber/junit/{ => api}/stub/StubBackend.java (98%) rename junit/src/test/resources/io/cucumber/junit/{ => api}/fa.feature (100%) rename junit/src/test/resources/io/cucumber/junit/{ => api}/fb.feature (100%) rename junit/src/test/resources/io/cucumber/{ => junit}/error/lexer_error.feature (100%) create mode 100644 picocontainer/src/test/java/io/cucumber/picocontainer/SanityChecker.java diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index eef8597d45..534ea5524d 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,7 +1,7 @@ package io.cucumber.examples.java.calculator; import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java index d99ad5e2e3..57edd50ce6 100644 --- a/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java +++ b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java @@ -1,6 +1,6 @@ package io.cucumber.examples.java.wicket; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index c5bce21396..cbfe292145 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,7 +1,7 @@ package io.cucumber.examples.java.calculator; import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java index 7d0cd706f1..e9e44d8f74 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java @@ -1,7 +1,7 @@ package io.cucumber.examples.spring.txn; import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java b/guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java index 4031cdd5a1..10ba1c347f 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java +++ b/guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.guice.integration; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; /** diff --git a/java/src/test/java/io/cucumber/java/test/RunCukesTest.java b/java/src/test/java/io/cucumber/java/test/RunCukesTest.java index 001568e03a..3888a44e6c 100644 --- a/java/src/test/java/io/cucumber/java/test/RunCukesTest.java +++ b/java/src/test/java/io/cucumber/java/test/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.java.test; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java b/java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java index fd66ea886a..96c3db3894 100644 --- a/java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java +++ b/java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.java8.test; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/junit/src/main/java/io/cucumber/junit/NotificationLevel.java b/junit/src/main/java/io/cucumber/junit/NotificationLevel.java deleted file mode 100644 index a3ac37151b..0000000000 --- a/junit/src/main/java/io/cucumber/junit/NotificationLevel.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.cucumber.junit; - -public enum NotificationLevel { - SCENARIO, - STEP; - - String lowerCaseName() { - return name().toLowerCase(); - } -} diff --git a/junit/src/main/java/io/cucumber/junit/SkippedThrowable.java b/junit/src/main/java/io/cucumber/junit/SkippedThrowable.java deleted file mode 100644 index 3ddb734e8a..0000000000 --- a/junit/src/main/java/io/cucumber/junit/SkippedThrowable.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.cucumber.junit; - -class SkippedThrowable extends Throwable { - private static final long serialVersionUID = 1L; - - public SkippedThrowable(NotificationLevel scenarioOrStep) { - super(String.format("This %s is skipped", scenarioOrStep.lowerCaseName()), null, false, false); - } -} diff --git a/junit/src/main/java/io/cucumber/junit/Assertions.java b/junit/src/main/java/io/cucumber/junit/api/Assertions.java similarity index 90% rename from junit/src/main/java/io/cucumber/junit/Assertions.java rename to junit/src/main/java/io/cucumber/junit/api/Assertions.java index f12bae79ba..4c56c9dc41 100644 --- a/junit/src/main/java/io/cucumber/junit/Assertions.java +++ b/junit/src/main/java/io/cucumber/junit/api/Assertions.java @@ -1,15 +1,15 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import io.cucumber.core.exception.CucumberException; import java.lang.annotation.Annotation; import java.lang.reflect.Method; -public class Assertions { +class Assertions { private Assertions() { } - public static void assertNoCucumberAnnotatedMethods(Class clazz) { + static void assertNoCucumberAnnotatedMethods(Class clazz) { for (Method method : clazz.getDeclaredMethods()) { for (Annotation annotation : method.getAnnotations()) { if (annotation.annotationType().getName().startsWith("cucumber") //TODO: Remove once migrated diff --git a/junit/src/main/java/cucumber/api/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java similarity index 97% rename from junit/src/main/java/cucumber/api/junit/Cucumber.java rename to junit/src/main/java/io/cucumber/junit/api/Cucumber.java index 53e7677c7b..292b3e3c0d 100644 --- a/junit/src/main/java/cucumber/api/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java @@ -1,12 +1,9 @@ -package cucumber.api.junit; +package io.cucumber.junit.api; import io.cucumber.core.api.options.CucumberOptions; import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; -import io.cucumber.junit.Assertions; -import io.cucumber.junit.FeatureRunner; -import io.cucumber.junit.JUnitOptions; import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runtime.BackendModuleBackendSupplier; diff --git a/junit/src/main/java/io/cucumber/junit/FeatureRunner.java b/junit/src/main/java/io/cucumber/junit/api/FeatureRunner.java similarity index 89% rename from junit/src/main/java/io/cucumber/junit/FeatureRunner.java rename to junit/src/main/java/io/cucumber/junit/api/FeatureRunner.java index d7be98e2ae..067444da7f 100644 --- a/junit/src/main/java/io/cucumber/junit/FeatureRunner.java +++ b/junit/src/main/java/io/cucumber/junit/api/FeatureRunner.java @@ -1,10 +1,10 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import gherkin.ast.Feature; import gherkin.events.PickleEvent; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.filter.Filters; -import io.cucumber.junit.PickleRunners.PickleRunner; +import io.cucumber.junit.api.PickleRunners.PickleRunner; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.model.FeatureCompiler; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; @@ -17,17 +17,17 @@ import java.util.ArrayList; import java.util.List; -import static io.cucumber.junit.PickleRunners.withNoStepDescriptions; -import static io.cucumber.junit.PickleRunners.withStepDescriptions; +import static io.cucumber.junit.api.PickleRunners.withNoStepDescriptions; +import static io.cucumber.junit.api.PickleRunners.withStepDescriptions; -public class FeatureRunner extends ParentRunner { +class FeatureRunner extends ParentRunner { private final List children = new ArrayList<>(); private final CucumberFeature cucumberFeature; private Description description; - public FeatureRunner(CucumberFeature cucumberFeature, Filters filters, ThreadLocalRunnerSupplier runnerSupplier, JUnitOptions jUnitOptions) throws InitializationError { + FeatureRunner(CucumberFeature cucumberFeature, Filters filters, ThreadLocalRunnerSupplier runnerSupplier, JUnitOptions jUnitOptions) throws InitializationError { super(null); this.cucumberFeature = cucumberFeature; buildFeatureElementRunners(filters, runnerSupplier, jUnitOptions); diff --git a/junit/src/main/java/io/cucumber/junit/JUnitOptions.java b/junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java similarity index 88% rename from junit/src/main/java/io/cucumber/junit/JUnitOptions.java rename to junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java index 8ea80d3562..deac4e6a4e 100644 --- a/junit/src/main/java/io/cucumber/junit/JUnitOptions.java +++ b/junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java @@ -1,4 +1,4 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.util.FixJava; @@ -8,8 +8,8 @@ import java.util.ArrayList; import java.util.List; -public class JUnitOptions { - private static final String OPTIONS_RESOURCE = "/cucumber/api/junit/OPTIONS.txt"; +class JUnitOptions { + private static final String OPTIONS_RESOURCE = "/io/cucumber/api/junit/OPTIONS.txt"; private static String optionsText; private final boolean strict; @@ -24,7 +24,7 @@ public class JUnitOptions { * @param strict * @param argv the arguments */ - public JUnitOptions(boolean strict, List argv) { + JUnitOptions(boolean strict, List argv) { this.strict = strict; argv = new ArrayList<>(argv); // in case the one passed in is unmodifiable. parse(argv); @@ -51,10 +51,10 @@ private void parse(List args) { boolean filenameCompatibleNames() { return filenameCompatibleNames; } - public boolean stepNotifications(){ + boolean stepNotifications(){ return stepNotifications; } - public boolean isStrict() { + boolean isStrict() { return strict; } diff --git a/junit/src/main/java/io/cucumber/junit/JUnitReporter.java b/junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java similarity index 94% rename from junit/src/main/java/io/cucumber/junit/JUnitReporter.java rename to junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java index 1ee87653c9..83011e794d 100644 --- a/junit/src/main/java/io/cucumber/junit/JUnitReporter.java +++ b/junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java @@ -1,4 +1,4 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.PickleStepTestStep; @@ -7,7 +7,7 @@ import io.cucumber.core.api.event.TestCaseStarted; import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.api.event.TestStepStarted; -import io.cucumber.junit.PickleRunners.PickleRunner; +import io.cucumber.junit.api.PickleRunners.PickleRunner; import io.cucumber.core.event.EventBus; import org.junit.runner.Description; import org.junit.runner.notification.Failure; @@ -16,6 +16,9 @@ import java.util.ArrayList; +import static io.cucumber.junit.api.SkippedThrowable.NotificationLevel.SCENARIO; +import static io.cucumber.junit.api.SkippedThrowable.NotificationLevel.STEP; + class JUnitReporter { private final JUnitOptions junitOptions; @@ -67,7 +70,7 @@ public void receive(TestCaseFinished event) { }; - public JUnitReporter(EventBus bus, JUnitOptions junitOption) { + JUnitReporter(EventBus bus, JUnitOptions junitOption) { this.junitOptions = junitOption; this.bus = bus; bus.registerHandlerFor(TestCaseStarted.class, testCaseStartedHandler); @@ -76,7 +79,7 @@ public JUnitReporter(EventBus bus, JUnitOptions junitOption) { bus.registerHandlerFor(TestCaseFinished.class, testCaseFinishedHandler); } - public void finishExecutionUnit() { + void finishExecutionUnit() { bus.removeHandlerFor(TestCaseStarted.class, testCaseStartedHandler); bus.removeHandlerFor(TestStepStarted.class, testStepStartedHandler); bus.removeHandlerFor(TestStepFinished.class, testStepFinishedHandler); @@ -114,7 +117,7 @@ void handleStepResult(PickleStepTestStep testStep, Result result) { break; case SKIPPED: if (error == null) { - error = new SkippedThrowable(NotificationLevel.STEP); + error = new SkippedThrowable(STEP); } else { stepErrors.add(error); } @@ -155,7 +158,7 @@ void handleTestCaseResult(Result result) { break; case SKIPPED: if (stepErrors.isEmpty()) { - stepErrors.add(new SkippedThrowable(NotificationLevel.SCENARIO)); + stepErrors.add(new SkippedThrowable(SCENARIO)); } for (Throwable error : stepErrors) { pickleRunnerNotifier.addFailedAssumption(error); diff --git a/junit/src/main/java/io/cucumber/junit/PickleRunners.java b/junit/src/main/java/io/cucumber/junit/api/PickleRunners.java similarity index 99% rename from junit/src/main/java/io/cucumber/junit/PickleRunners.java rename to junit/src/main/java/io/cucumber/junit/api/PickleRunners.java index c1a43c1417..236290161d 100644 --- a/junit/src/main/java/io/cucumber/junit/PickleRunners.java +++ b/junit/src/main/java/io/cucumber/junit/api/PickleRunners.java @@ -1,4 +1,4 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import io.cucumber.core.runner.Runner; import io.cucumber.core.runtime.RunnerSupplier; diff --git a/junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java b/junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java new file mode 100644 index 0000000000..c27577d81b --- /dev/null +++ b/junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java @@ -0,0 +1,18 @@ +package io.cucumber.junit.api; + +class SkippedThrowable extends Throwable { + private static final long serialVersionUID = 1L; + + SkippedThrowable(NotificationLevel scenarioOrStep) { + super(String.format("This %s is skipped", scenarioOrStep.lowerCaseName()), null, false, false); + } + + enum NotificationLevel { + SCENARIO, + STEP; + + String lowerCaseName() { + return name().toLowerCase(); + } + } +} diff --git a/junit/src/main/java/io/cucumber/junit/UndefinedThrowable.java b/junit/src/main/java/io/cucumber/junit/api/UndefinedThrowable.java similarity index 58% rename from junit/src/main/java/io/cucumber/junit/UndefinedThrowable.java rename to junit/src/main/java/io/cucumber/junit/api/UndefinedThrowable.java index 4487e4464f..97c8c34281 100644 --- a/junit/src/main/java/io/cucumber/junit/UndefinedThrowable.java +++ b/junit/src/main/java/io/cucumber/junit/api/UndefinedThrowable.java @@ -1,14 +1,14 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; -public class UndefinedThrowable extends Throwable { +class UndefinedThrowable extends Throwable { private static final long serialVersionUID = 1L; - public UndefinedThrowable() { + UndefinedThrowable() { super("This step is undefined", null, false, false); } - public UndefinedThrowable(String stepText) { + UndefinedThrowable(String stepText) { super(String.format("The step \"%s\" is undefined", stepText), null, false, false); } } diff --git a/junit/src/main/resources/cucumber/api/junit/OPTIONS.txt b/junit/src/main/resources/io/cucumber/api/junit/OPTIONS.txt similarity index 100% rename from junit/src/main/resources/cucumber/api/junit/OPTIONS.txt rename to junit/src/main/resources/io/cucumber/api/junit/OPTIONS.txt diff --git a/junit/src/test/java/cucumber/annotation/DummyWhen.java b/junit/src/test/java/cucumber/annotation/DummyWhen.java deleted file mode 100644 index e21b686750..0000000000 --- a/junit/src/test/java/cucumber/annotation/DummyWhen.java +++ /dev/null @@ -1,12 +0,0 @@ -package cucumber.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface DummyWhen { - -} diff --git a/junit/src/test/java/io/cucumber/junit/AssertionsTest.java b/junit/src/test/java/io/cucumber/junit/api/AssertionsTest.java similarity index 84% rename from junit/src/test/java/io/cucumber/junit/AssertionsTest.java rename to junit/src/test/java/io/cucumber/junit/api/AssertionsTest.java index 63d4bceeba..a9f32dd29b 100644 --- a/junit/src/test/java/io/cucumber/junit/AssertionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/AssertionsTest.java @@ -1,6 +1,5 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; -import cucumber.api.junit.Cucumber; import io.cucumber.core.exception.CucumberException; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,7 +17,7 @@ public void should_throw_cucumber_exception_when_annotated() { @RunWith(Cucumber.class) - public final static class WithCucumberMethod { + final static class WithCucumberMethod { @StubCucumberAnnotation public void before() { diff --git a/junit/src/test/java/io/cucumber/junit/CucumberTest.java b/junit/src/test/java/io/cucumber/junit/api/CucumberTest.java similarity index 92% rename from junit/src/test/java/io/cucumber/junit/CucumberTest.java rename to junit/src/test/java/io/cucumber/junit/api/CucumberTest.java index af2e7bb0b9..c5352f6ecd 100644 --- a/junit/src/test/java/io/cucumber/junit/CucumberTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/CucumberTest.java @@ -1,8 +1,6 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; -import cucumber.annotation.DummyWhen; import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.junit.Cucumber; import io.cucumber.core.exception.CucumberException; import org.junit.After; import org.junit.Before; @@ -18,6 +16,10 @@ import org.mockito.Mockito; import java.io.File; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.util.List; import static java.util.Collections.emptyList; @@ -146,7 +148,7 @@ public void cucumber_can_run_pickles_in_parallel() throws Exception { public void cucumber_returns_description_tree_with_features_and_pickles() throws InitializationError { Description description = new Cucumber(RunCukesTestValidEmpty.class).getDescription(); - assertThat(description.getDisplayName(), is("io.cucumber.junit.CucumberTest$RunCukesTestValidEmpty")); + assertThat(description.getDisplayName(), is("io.cucumber.junit.api.CucumberTest$RunCukesTestValidEmpty")); Description feature = description.getChildren().get(0); assertThat(feature.getDisplayName(), is("Feature: Feature A")); Description pickle = feature.getChildren().get(0); @@ -185,7 +187,7 @@ public void no_stepdefs_in_cucumber_runner_invalid() { public class ImplicitFeatureAndGluePath { } - @CucumberOptions(features = {"classpath:io/cucumber/junit"}) + @CucumberOptions(features = {"classpath:io/cucumber/junit/api"}) public class ExplicitFeaturePath { } @@ -193,14 +195,19 @@ public class ExplicitFeaturePath { public class ExplicitFeaturePathWithNoFeatures { } - @CucumberOptions(features = {"classpath:io/cucumber/error/lexer_error.feature"}) + @CucumberOptions(features = {"classpath:io/cucumber/junit/error/lexer_error.feature"}) public class LexerErrorFeature { } - @CucumberOptions(features = {"classpath:io/cucumber/error/lexer_error.feature"}, plugin = {"json:target/lexor_error_feature.json"}) + @CucumberOptions(features = {"classpath:io/cucumber/junit/error/lexer_error.feature"}, plugin = {"json:target/lexor_error_feature.json"}) public class FormatterWithLexerErrorFeature { } + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + public static @interface DummyWhen { + + } } diff --git a/junit/src/test/java/io/cucumber/junit/DescriptionMatcher.java b/junit/src/test/java/io/cucumber/junit/api/DescriptionMatcher.java similarity index 92% rename from junit/src/test/java/io/cucumber/junit/DescriptionMatcher.java rename to junit/src/test/java/io/cucumber/junit/api/DescriptionMatcher.java index bd41aa4fb0..70c18cf4a7 100644 --- a/junit/src/test/java/io/cucumber/junit/DescriptionMatcher.java +++ b/junit/src/test/java/io/cucumber/junit/api/DescriptionMatcher.java @@ -1,4 +1,4 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import org.junit.runner.Description; import org.mockito.ArgumentMatcher; diff --git a/junit/src/test/java/io/cucumber/junit/FailureMatcher.java b/junit/src/test/java/io/cucumber/junit/api/FailureMatcher.java similarity index 92% rename from junit/src/test/java/io/cucumber/junit/FailureMatcher.java rename to junit/src/test/java/io/cucumber/junit/api/FailureMatcher.java index 7ff6ae5f87..8dc1876ac3 100644 --- a/junit/src/test/java/io/cucumber/junit/FailureMatcher.java +++ b/junit/src/test/java/io/cucumber/junit/api/FailureMatcher.java @@ -1,4 +1,4 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import org.junit.runner.notification.Failure; import org.mockito.ArgumentMatcher; diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java similarity index 99% rename from junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java rename to junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java index 48de7a349b..249774d71d 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java @@ -1,4 +1,4 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.Resource; diff --git a/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java b/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java similarity index 99% rename from junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java rename to junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java index 7779e6188a..15d219ebbb 100644 --- a/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java @@ -1,11 +1,11 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.PickleStepTestStep; import io.cucumber.core.event.EventBus; -import io.cucumber.junit.JUnitReporter.EachTestNotifier; -import io.cucumber.junit.JUnitReporter.NoTestNotifier; -import io.cucumber.junit.PickleRunners.PickleRunner; +import io.cucumber.junit.api.JUnitReporter.EachTestNotifier; +import io.cucumber.junit.api.JUnitReporter.NoTestNotifier; +import io.cucumber.junit.api.PickleRunners.PickleRunner; import gherkin.pickles.PickleStep; import org.junit.AssumptionViolatedException; import org.junit.Test; diff --git a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithNoStepDescriptionsTest.java similarity index 95% rename from junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java rename to junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithNoStepDescriptionsTest.java index 0e5c60d208..94d92eb3bb 100644 --- a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithNoStepDescriptionsTest.java @@ -1,8 +1,8 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import gherkin.events.PickleEvent; import io.cucumber.core.runtime.RunnerSupplier; -import io.cucumber.junit.PickleRunners.PickleRunner; +import io.cucumber.junit.api.PickleRunners.PickleRunner; import org.junit.Test; import java.util.Arrays; diff --git a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithStepDescriptionsTest.java similarity index 97% rename from junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java rename to junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithStepDescriptionsTest.java index d3d81464f0..b6c472d173 100644 --- a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithStepDescriptionsTest.java @@ -1,4 +1,4 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -6,8 +6,8 @@ import io.cucumber.core.model.FeatureCompiler; import io.cucumber.core.runtime.RunnerSupplier; -import io.cucumber.junit.PickleRunners.PickleRunner; -import io.cucumber.junit.PickleRunners.WithStepDescriptions; +import io.cucumber.junit.api.PickleRunners.PickleRunner; +import io.cucumber.junit.api.PickleRunners.WithStepDescriptions; import io.cucumber.core.model.CucumberFeature; import gherkin.events.PickleEvent; import gherkin.pickles.Compiler; diff --git a/junit/src/test/java/io/cucumber/junit/RunCukesTest.java b/junit/src/test/java/io/cucumber/junit/api/RunCukesTest.java similarity index 58% rename from junit/src/test/java/io/cucumber/junit/RunCukesTest.java rename to junit/src/test/java/io/cucumber/junit/api/RunCukesTest.java index 6d23149108..5aee36340d 100644 --- a/junit/src/test/java/io/cucumber/junit/RunCukesTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/RunCukesTest.java @@ -1,6 +1,5 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; -import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java b/junit/src/test/java/io/cucumber/junit/api/RunCukesTestNoStepNotifications.java similarity index 77% rename from junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java rename to junit/src/test/java/io/cucumber/junit/api/RunCukesTestNoStepNotifications.java index 78f1fe7382..ec8973b566 100644 --- a/junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java +++ b/junit/src/test/java/io/cucumber/junit/api/RunCukesTestNoStepNotifications.java @@ -1,7 +1,6 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/junit/src/main/java/io/cucumber/junit/SanityChecker.java b/junit/src/test/java/io/cucumber/junit/api/SanityChecker.java similarity index 98% rename from junit/src/main/java/io/cucumber/junit/SanityChecker.java rename to junit/src/test/java/io/cucumber/junit/api/SanityChecker.java index 7884d46221..b9e05fc0a3 100644 --- a/junit/src/main/java/io/cucumber/junit/SanityChecker.java +++ b/junit/src/test/java/io/cucumber/junit/api/SanityChecker.java @@ -1,4 +1,4 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import junit.framework.AssertionFailedError; import junit.framework.JUnit4TestAdapter; diff --git a/junit/src/test/java/io/cucumber/junit/SanityTest.java b/junit/src/test/java/io/cucumber/junit/api/SanityTest.java similarity index 93% rename from junit/src/test/java/io/cucumber/junit/SanityTest.java rename to junit/src/test/java/io/cucumber/junit/api/SanityTest.java index f0ca993f79..dd1c3a24cf 100644 --- a/junit/src/test/java/io/cucumber/junit/SanityTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/SanityTest.java @@ -1,4 +1,4 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import org.junit.Test; diff --git a/junit/src/test/java/io/cucumber/junit/TestPendingException.java b/junit/src/test/java/io/cucumber/junit/api/TestPendingException.java similarity index 90% rename from junit/src/test/java/io/cucumber/junit/TestPendingException.java rename to junit/src/test/java/io/cucumber/junit/api/TestPendingException.java index eaa5ca54ac..fc4a2bf45e 100644 --- a/junit/src/test/java/io/cucumber/junit/TestPendingException.java +++ b/junit/src/test/java/io/cucumber/junit/api/TestPendingException.java @@ -1,4 +1,4 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import io.cucumber.core.backend.Pending; diff --git a/junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java b/junit/src/test/java/io/cucumber/junit/api/TestPickleBuilder.java similarity index 97% rename from junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java rename to junit/src/test/java/io/cucumber/junit/api/TestPickleBuilder.java index bcf4799b33..dd10168c4b 100644 --- a/junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java +++ b/junit/src/test/java/io/cucumber/junit/api/TestPickleBuilder.java @@ -1,4 +1,4 @@ -package io.cucumber.junit; +package io.cucumber.junit.api; import io.cucumber.core.model.CucumberFeature; import gherkin.AstBuilder; diff --git a/junit/src/test/java/io/cucumber/junit/stub/StubBackend.java b/junit/src/test/java/io/cucumber/junit/api/stub/StubBackend.java similarity index 98% rename from junit/src/test/java/io/cucumber/junit/stub/StubBackend.java rename to junit/src/test/java/io/cucumber/junit/api/stub/StubBackend.java index b8ba7f84c9..2043a8ea5f 100644 --- a/junit/src/test/java/io/cucumber/junit/stub/StubBackend.java +++ b/junit/src/test/java/io/cucumber/junit/api/stub/StubBackend.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.stub; +package io.cucumber.junit.api.stub; import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.backend.StepDefinition; diff --git a/junit/src/test/resources/io/cucumber/junit/fa.feature b/junit/src/test/resources/io/cucumber/junit/api/fa.feature similarity index 100% rename from junit/src/test/resources/io/cucumber/junit/fa.feature rename to junit/src/test/resources/io/cucumber/junit/api/fa.feature diff --git a/junit/src/test/resources/io/cucumber/junit/fb.feature b/junit/src/test/resources/io/cucumber/junit/api/fb.feature similarity index 100% rename from junit/src/test/resources/io/cucumber/junit/fb.feature rename to junit/src/test/resources/io/cucumber/junit/api/fb.feature diff --git a/junit/src/test/resources/io/cucumber/error/lexer_error.feature b/junit/src/test/resources/io/cucumber/junit/error/lexer_error.feature similarity index 100% rename from junit/src/test/resources/io/cucumber/error/lexer_error.feature rename to junit/src/test/resources/io/cucumber/junit/error/lexer_error.feature diff --git a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt index 24c891861d..07332164b6 100644 --- a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt @@ -1,6 +1,6 @@ package io.cucumber.runtime.kotlin.test -import cucumber.api.junit.Cucumber +import io.cucumber.junit.api.Cucumber import org.junit.runner.RunWith @RunWith(Cucumber::class) diff --git a/needle/src/test/java/io/cucumber/needle/RunCukesTest.java b/needle/src/test/java/io/cucumber/needle/RunCukesTest.java index 253e4e95f0..bcb819351b 100755 --- a/needle/src/test/java/io/cucumber/needle/RunCukesTest.java +++ b/needle/src/test/java/io/cucumber/needle/RunCukesTest.java @@ -2,7 +2,7 @@ import org.junit.runner.RunWith; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; @RunWith(Cucumber.class) public class RunCukesTest { diff --git a/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java b/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java index 09fbc6a54c..e07b04d9da 100644 --- a/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java +++ b/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.openejb; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java index e480d9ed14..8a2ebd6f49 100644 --- a/picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.picocontainer; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/SanityChecker.java b/picocontainer/src/test/java/io/cucumber/picocontainer/SanityChecker.java new file mode 100644 index 0000000000..31b61b0c8d --- /dev/null +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/SanityChecker.java @@ -0,0 +1,86 @@ +package io.cucumber.picocontainer; + +import junit.framework.AssertionFailedError; +import junit.framework.JUnit4TestAdapter; +import junit.framework.Test; +import junit.framework.TestListener; +import junit.framework.TestResult; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; + +/** + * Listener that makes sure Cucumber fires events in the right order + */ +public class SanityChecker implements TestListener { + private static final String INDENT = " "; + private static final String INSANITY = "INSANITY"; + + private List tests = new ArrayList(); + private final StringWriter out = new StringWriter(); + + public static void run(Class testClass) { + run(testClass, false); + } + + public static void run(Class testClass, boolean debug) { + JUnit4TestAdapter testAdapter = new JUnit4TestAdapter(testClass); + TestResult result = new TestResult(); + SanityChecker listener = new SanityChecker(); + result.addListener(listener); + testAdapter.run(result); + String output = listener.getOutput(); + if (output.contains(INSANITY)) { + throw new RuntimeException("Something went wrong\n" + output); + } + if (debug) { + System.out.println("===== " + testClass.getName()); + System.out.println(output); + System.out.println("====="); + } + } + + @Override + public void addError(Test test, Throwable t) { + } + + @Override + public void addFailure(Test test, AssertionFailedError t) { + } + + @Override + public void startTest(Test started) { + spaces(); + out.append("START ").append(started.toString()).append("\n"); + tests.add(started); + } + + @Override + public void endTest(Test ended) { + try { + Test lastStarted = tests.remove(tests.size() - 1); + spaces(); + out.append("END ").append(ended.toString()).append("\n"); + if (!lastStarted.toString().equals(ended.toString())) { + out.append(INSANITY).append("\n"); + String errorMessage = String.format("Started : %s\nEnded : %s\n", lastStarted, ended); + out.append(errorMessage).append("\n"); + } + } catch (Exception e) { + out.append(INSANITY).append("\n"); + e.printStackTrace(new PrintWriter(out)); + } + } + + private void spaces() { + for (int i = 0; i < tests.size(); i++) { + out.append(INDENT); + } + } + + private String getOutput() { + return out.toString(); + } +} diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/SanityTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/SanityTest.java index cc2a5b2e6f..540f8584f1 100644 --- a/picocontainer/src/test/java/io/cucumber/picocontainer/SanityTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/SanityTest.java @@ -1,6 +1,5 @@ package io.cucumber.picocontainer; -import io.cucumber.junit.SanityChecker; import org.junit.Test; public class SanityTest { diff --git a/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java index abcc086d20..6a07ccc28c 100644 --- a/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/contextconfig/RunCukesTest.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java index 61114f71e3..df6966521a 100644 --- a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCukesTest.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java index efe25e9660..2794cb9a66 100644 --- a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCukesTest.java @@ -1,7 +1,7 @@ package io.cucumber.spring.metaconfig.dirties; import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java index 75cc171111..3cabe6c830 100644 --- a/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCukesTest.java @@ -1,7 +1,7 @@ package io.cucumber.spring.metaconfig.general; import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java b/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java index 3feac61a08..98761610ad 100644 --- a/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java +++ b/spring/src/test/java/io/cucumber/spring/webappconfig/RunCukesTest.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/weld/src/test/java/io/cucumber/weld/RunCukesTest.java b/weld/src/test/java/io/cucumber/weld/RunCukesTest.java index 716dd0251c..c926b94d96 100644 --- a/weld/src/test/java/io/cucumber/weld/RunCukesTest.java +++ b/weld/src/test/java/io/cucumber/weld/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.weld; -import cucumber.api.junit.Cucumber; +import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) From 95600181f89d3e83289b9a2c73546fbc0a10711a Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Mon, 10 Sep 2018 09:14:20 +0200 Subject: [PATCH 035/155] [TestNG] Move testng api packages to io.cucumber.testng.api --- .../calculator/RunCukesByCompositionTest.java | 6 ++-- .../java/calculator/RunCukesTest.java | 2 +- testng/README.md | 2 +- .../api}/AbstractTestNGCucumberTests.java | 2 +- .../testng/api}/CucumberExceptionWrapper.java | 2 +- .../testng/api}/CucumberFeatureWrapper.java | 4 +-- .../api}/CucumberFeatureWrapperImpl.java | 2 +- .../testng/api}/PickleEventWrapper.java | 4 +-- .../testng/api}/PickleEventWrapperImpl.java | 2 +- .../testng/api}/TestCaseResultListener.java | 2 +- .../testng/api}/TestNGCucumberRunner.java | 2 +- .../io/cucumber/testng/RunCukesStrict.java | 8 ----- .../java/io/cucumber/testng/RunCukesTest.java | 6 ---- .../RunFeatureWithThreeScenariosTest.java | 10 ------ .../RunScenarioWithUndefinedStepsStrict.java | 11 ------ .../api}/AbstractTestNGCucumberTestsTest.java | 6 +--- .../testng/api}/InvokedMethodListener.java | 2 +- .../io/cucumber/testng/api/RunCukesTest.java | 4 +++ .../api/RunFeatureWithThreeScenariosTest.java | 10 ++++++ .../testng/{stub => api}/StubBackend.java | 2 +- .../api}/TestCaseResultListenerTest.java | 2 +- .../testng/api}/TestNGCucumberRunnerTest.java | 34 ++++++++++++------- .../testng/api}/TestPendingException.java | 2 +- .../io/cucumber/testng/{ => api}/fa.feature | 0 .../io/cucumber/testng/{ => api}/fb.feature | 0 ..._same_steps_in_different_scenarios.feature | 0 .../testng/{ => api}/three_scenarios.feature | 0 .../testng/{ => api}/undefined_steps.feature | 0 28 files changed, 56 insertions(+), 71 deletions(-) rename testng/src/main/java/{cucumber/api/testng => io/cucumber/testng/api}/AbstractTestNGCucumberTests.java (97%) rename testng/src/main/java/{cucumber/api/testng => io/cucumber/testng/api}/CucumberExceptionWrapper.java (94%) rename testng/src/main/java/{cucumber/api/testng => io/cucumber/testng/api}/CucumberFeatureWrapper.java (55%) rename testng/src/main/java/{cucumber/api/testng => io/cucumber/testng/api}/CucumberFeatureWrapperImpl.java (93%) rename testng/src/main/java/{cucumber/api/testng => io/cucumber/testng/api}/PickleEventWrapper.java (62%) rename testng/src/main/java/{cucumber/api/testng => io/cucumber/testng/api}/PickleEventWrapperImpl.java (93%) rename testng/src/main/java/{cucumber/api/testng => io/cucumber/testng/api}/TestCaseResultListener.java (98%) rename testng/src/main/java/{cucumber/api/testng => io/cucumber/testng/api}/TestNGCucumberRunner.java (99%) delete mode 100644 testng/src/test/java/io/cucumber/testng/RunCukesStrict.java delete mode 100644 testng/src/test/java/io/cucumber/testng/RunCukesTest.java delete mode 100644 testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java delete mode 100644 testng/src/test/java/io/cucumber/testng/RunScenarioWithUndefinedStepsStrict.java rename testng/src/test/java/{cucumber/api/testng => io/cucumber/testng/api}/AbstractTestNGCucumberTestsTest.java (88%) rename testng/src/test/java/{cucumber/api/testng => io/cucumber/testng/api}/InvokedMethodListener.java (97%) create mode 100644 testng/src/test/java/io/cucumber/testng/api/RunCukesTest.java create mode 100644 testng/src/test/java/io/cucumber/testng/api/RunFeatureWithThreeScenariosTest.java rename testng/src/test/java/io/cucumber/testng/{stub => api}/StubBackend.java (96%) rename testng/src/test/java/{cucumber/api/testng => io/cucumber/testng/api}/TestCaseResultListenerTest.java (99%) rename testng/src/test/java/{cucumber/api/testng => io/cucumber/testng/api}/TestNGCucumberRunnerTest.java (72%) rename testng/src/test/java/{cucumber/api/testng => io/cucumber/testng/api}/TestPendingException.java (89%) rename testng/src/test/resources/io/cucumber/testng/{ => api}/fa.feature (100%) rename testng/src/test/resources/io/cucumber/testng/{ => api}/fb.feature (100%) rename testng/src/test/resources/io/cucumber/testng/{ => api}/feature_with_same_steps_in_different_scenarios.feature (100%) rename testng/src/test/resources/io/cucumber/testng/{ => api}/three_scenarios.feature (100%) rename testng/src/test/resources/io/cucumber/testng/{ => api}/undefined_steps.feature (100%) diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java index 6b5c08aa2d..24c7ce1aa8 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java @@ -1,9 +1,9 @@ package io.cucumber.examples.java.calculator; import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.testng.CucumberFeatureWrapper; -import cucumber.api.testng.PickleEventWrapper; -import cucumber.api.testng.TestNGCucumberRunner; +import io.cucumber.testng.api.CucumberFeatureWrapper; +import io.cucumber.testng.api.PickleEventWrapper; +import io.cucumber.testng.api.TestNGCucumberRunner; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index a41e838573..e6f225b4a9 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,7 +1,7 @@ package io.cucumber.examples.java.calculator; import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.testng.AbstractTestNGCucumberTests; +import io.cucumber.testng.api.AbstractTestNGCucumberTests; import org.testng.annotations.DataProvider; @CucumberOptions(plugin = "json:target/cucumber-report.json") diff --git a/testng/README.md b/testng/README.md index 28617de2f4..498b7b556e 100644 --- a/testng/README.md +++ b/testng/README.md @@ -24,7 +24,7 @@ Create an empty class that extends the `AbstractTestNGCucumberTests`. package io.cucumber.runtime.testng; import cucumber.api.CucumberOptions; -import cucumber.api.testng.AbstractTestNGCucumberTests; +import io.cucumber.testng.api.AbstractTestNGCucumberTests; @CucumberOptions(plugin = "json:target/cucumber-report.json") public class RunCukesTest extends AbstractTestNGCucumberTests { diff --git a/testng/src/main/java/cucumber/api/testng/AbstractTestNGCucumberTests.java b/testng/src/main/java/io/cucumber/testng/api/AbstractTestNGCucumberTests.java similarity index 97% rename from testng/src/main/java/cucumber/api/testng/AbstractTestNGCucumberTests.java rename to testng/src/main/java/io/cucumber/testng/api/AbstractTestNGCucumberTests.java index d261761410..8161135d36 100644 --- a/testng/src/main/java/cucumber/api/testng/AbstractTestNGCucumberTests.java +++ b/testng/src/main/java/io/cucumber/testng/api/AbstractTestNGCucumberTests.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; diff --git a/testng/src/main/java/cucumber/api/testng/CucumberExceptionWrapper.java b/testng/src/main/java/io/cucumber/testng/api/CucumberExceptionWrapper.java similarity index 94% rename from testng/src/main/java/cucumber/api/testng/CucumberExceptionWrapper.java rename to testng/src/main/java/io/cucumber/testng/api/CucumberExceptionWrapper.java index 397cef1b5d..d77fff8db1 100644 --- a/testng/src/main/java/cucumber/api/testng/CucumberExceptionWrapper.java +++ b/testng/src/main/java/io/cucumber/testng/api/CucumberExceptionWrapper.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import io.cucumber.core.exception.CucumberException; import gherkin.events.PickleEvent; diff --git a/testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapper.java b/testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapper.java similarity index 55% rename from testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapper.java rename to testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapper.java index cc1034af78..aa72c46a44 100644 --- a/testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapper.java +++ b/testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapper.java @@ -1,10 +1,10 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; /** * The only purpose of this interface is to be able to provide a custom *

    toString()
    , making TestNG reports look more descriptive. * - * @see AbstractTestNGCucumberTests#runScenario(cucumber.api.testng.PickleEventWrapper, cucumber.api.testng.CucumberFeatureWrapper) + * @see AbstractTestNGCucumberTests#runScenario(PickleEventWrapper, CucumberFeatureWrapper) */ public interface CucumberFeatureWrapper { diff --git a/testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapperImpl.java b/testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapperImpl.java similarity index 93% rename from testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapperImpl.java rename to testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapperImpl.java index b2a3bee79b..53dc4b2330 100644 --- a/testng/src/main/java/cucumber/api/testng/CucumberFeatureWrapperImpl.java +++ b/testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapperImpl.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import io.cucumber.core.model.CucumberFeature; diff --git a/testng/src/main/java/cucumber/api/testng/PickleEventWrapper.java b/testng/src/main/java/io/cucumber/testng/api/PickleEventWrapper.java similarity index 62% rename from testng/src/main/java/cucumber/api/testng/PickleEventWrapper.java rename to testng/src/main/java/io/cucumber/testng/api/PickleEventWrapper.java index d0706db6a9..265a6dbb61 100644 --- a/testng/src/main/java/cucumber/api/testng/PickleEventWrapper.java +++ b/testng/src/main/java/io/cucumber/testng/api/PickleEventWrapper.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import gherkin.events.PickleEvent; @@ -6,7 +6,7 @@ * The only purpose of this interface is to be able to provide a custom *
    toString()
    , making TestNG reports look more descriptive. * - * @see AbstractTestNGCucumberTests#runScenario(cucumber.api.testng.PickleEventWrapper, cucumber.api.testng.CucumberFeatureWrapper) + * @see AbstractTestNGCucumberTests#runScenario(PickleEventWrapper, CucumberFeatureWrapper) */ public interface PickleEventWrapper { diff --git a/testng/src/main/java/cucumber/api/testng/PickleEventWrapperImpl.java b/testng/src/main/java/io/cucumber/testng/api/PickleEventWrapperImpl.java similarity index 93% rename from testng/src/main/java/cucumber/api/testng/PickleEventWrapperImpl.java rename to testng/src/main/java/io/cucumber/testng/api/PickleEventWrapperImpl.java index 4a3d0af63f..ccdebd4f7a 100644 --- a/testng/src/main/java/cucumber/api/testng/PickleEventWrapperImpl.java +++ b/testng/src/main/java/io/cucumber/testng/api/PickleEventWrapperImpl.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import gherkin.events.PickleEvent; diff --git a/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java b/testng/src/main/java/io/cucumber/testng/api/TestCaseResultListener.java similarity index 98% rename from testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java rename to testng/src/main/java/io/cucumber/testng/api/TestCaseResultListener.java index d08fc1e402..1d1d869c83 100644 --- a/testng/src/main/java/cucumber/api/testng/TestCaseResultListener.java +++ b/testng/src/main/java/io/cucumber/testng/api/TestCaseResultListener.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.EventHandler; diff --git a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java similarity index 99% rename from testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java rename to testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java index d99d1e99e6..2413b0cb49 100644 --- a/testng/src/main/java/cucumber/api/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; diff --git a/testng/src/test/java/io/cucumber/testng/RunCukesStrict.java b/testng/src/test/java/io/cucumber/testng/RunCukesStrict.java deleted file mode 100644 index 2df36855ce..0000000000 --- a/testng/src/test/java/io/cucumber/testng/RunCukesStrict.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.cucumber.testng; - -import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.testng.AbstractTestNGCucumberTests; - -@CucumberOptions(strict = true) -public class RunCukesStrict extends AbstractTestNGCucumberTests { -} diff --git a/testng/src/test/java/io/cucumber/testng/RunCukesTest.java b/testng/src/test/java/io/cucumber/testng/RunCukesTest.java deleted file mode 100644 index ed84a73808..0000000000 --- a/testng/src/test/java/io/cucumber/testng/RunCukesTest.java +++ /dev/null @@ -1,6 +0,0 @@ -package io.cucumber.testng; - -import cucumber.api.testng.AbstractTestNGCucumberTests; - -public class RunCukesTest extends AbstractTestNGCucumberTests { -} diff --git a/testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java b/testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java deleted file mode 100644 index acb007b216..0000000000 --- a/testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.cucumber.testng; - -import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.testng.AbstractTestNGCucumberTests; - -@CucumberOptions( - features = "classpath:io/cucumber/testng/three_scenarios.feature" -) -public class RunFeatureWithThreeScenariosTest extends AbstractTestNGCucumberTests { -} diff --git a/testng/src/test/java/io/cucumber/testng/RunScenarioWithUndefinedStepsStrict.java b/testng/src/test/java/io/cucumber/testng/RunScenarioWithUndefinedStepsStrict.java deleted file mode 100644 index fd41bd06e3..0000000000 --- a/testng/src/test/java/io/cucumber/testng/RunScenarioWithUndefinedStepsStrict.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.cucumber.testng; - -import io.cucumber.core.api.options.CucumberOptions; -import cucumber.api.testng.AbstractTestNGCucumberTests; - -@CucumberOptions( - features = "classpath:io/cucumber/testng/undefined_steps.feature", - strict = true -) -public class RunScenarioWithUndefinedStepsStrict extends AbstractTestNGCucumberTests { -} diff --git a/testng/src/test/java/cucumber/api/testng/AbstractTestNGCucumberTestsTest.java b/testng/src/test/java/io/cucumber/testng/api/AbstractTestNGCucumberTestsTest.java similarity index 88% rename from testng/src/test/java/cucumber/api/testng/AbstractTestNGCucumberTestsTest.java rename to testng/src/test/java/io/cucumber/testng/api/AbstractTestNGCucumberTestsTest.java index a5420fd1f3..49b3f2a749 100644 --- a/testng/src/test/java/cucumber/api/testng/AbstractTestNGCucumberTestsTest.java +++ b/testng/src/test/java/io/cucumber/testng/api/AbstractTestNGCucumberTestsTest.java @@ -1,15 +1,11 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import java.util.Collections; import java.util.List; import java.util.Set; -import io.cucumber.testng.RunFeatureWithThreeScenariosTest; import org.testng.Assert; -import org.testng.IInvokedMethod; -import org.testng.IInvokedMethodListener; import org.testng.ITestNGListener; -import org.testng.ITestResult; import org.testng.TestNG; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; diff --git a/testng/src/test/java/cucumber/api/testng/InvokedMethodListener.java b/testng/src/test/java/io/cucumber/testng/api/InvokedMethodListener.java similarity index 97% rename from testng/src/test/java/cucumber/api/testng/InvokedMethodListener.java rename to testng/src/test/java/io/cucumber/testng/api/InvokedMethodListener.java index 13ce80da52..0d7e684ea8 100644 --- a/testng/src/test/java/cucumber/api/testng/InvokedMethodListener.java +++ b/testng/src/test/java/io/cucumber/testng/api/InvokedMethodListener.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import java.util.*; diff --git a/testng/src/test/java/io/cucumber/testng/api/RunCukesTest.java b/testng/src/test/java/io/cucumber/testng/api/RunCukesTest.java new file mode 100644 index 0000000000..093d601b9f --- /dev/null +++ b/testng/src/test/java/io/cucumber/testng/api/RunCukesTest.java @@ -0,0 +1,4 @@ +package io.cucumber.testng.api; + +public class RunCukesTest extends AbstractTestNGCucumberTests { +} diff --git a/testng/src/test/java/io/cucumber/testng/api/RunFeatureWithThreeScenariosTest.java b/testng/src/test/java/io/cucumber/testng/api/RunFeatureWithThreeScenariosTest.java new file mode 100644 index 0000000000..f35eadc230 --- /dev/null +++ b/testng/src/test/java/io/cucumber/testng/api/RunFeatureWithThreeScenariosTest.java @@ -0,0 +1,10 @@ +package io.cucumber.testng.api; + +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.testng.api.AbstractTestNGCucumberTests; + +@CucumberOptions( + features = "classpath:io/cucumber/testng/api/three_scenarios.feature" +) +public class RunFeatureWithThreeScenariosTest extends AbstractTestNGCucumberTests { +} diff --git a/testng/src/test/java/io/cucumber/testng/stub/StubBackend.java b/testng/src/test/java/io/cucumber/testng/api/StubBackend.java similarity index 96% rename from testng/src/test/java/io/cucumber/testng/stub/StubBackend.java rename to testng/src/test/java/io/cucumber/testng/api/StubBackend.java index 59e4d5dc0e..a8b1a7b424 100644 --- a/testng/src/test/java/io/cucumber/testng/stub/StubBackend.java +++ b/testng/src/test/java/io/cucumber/testng/api/StubBackend.java @@ -1,4 +1,4 @@ -package io.cucumber.runtime.stub; +package io.cucumber.testng.api; import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.stepexpression.TypeRegistry; diff --git a/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java b/testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java similarity index 99% rename from testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java rename to testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java index 945a70778a..c67ebc5e3f 100644 --- a/testng/src/test/java/cucumber/api/testng/TestCaseResultListenerTest.java +++ b/testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import io.cucumber.core.api.event.Result; import io.cucumber.core.event.EventBus; diff --git a/testng/src/test/java/cucumber/api/testng/TestNGCucumberRunnerTest.java b/testng/src/test/java/io/cucumber/testng/api/TestNGCucumberRunnerTest.java similarity index 72% rename from testng/src/test/java/cucumber/api/testng/TestNGCucumberRunnerTest.java rename to testng/src/test/java/io/cucumber/testng/api/TestNGCucumberRunnerTest.java index dc4aa10927..b2f77e6656 100644 --- a/testng/src/test/java/cucumber/api/testng/TestNGCucumberRunnerTest.java +++ b/testng/src/test/java/io/cucumber/testng/api/TestNGCucumberRunnerTest.java @@ -1,10 +1,8 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; +import io.cucumber.core.api.options.CucumberOptions; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.model.CucumberFeature; -import io.cucumber.testng.RunCukesStrict; -import io.cucumber.testng.RunCukesTest; -import io.cucumber.testng.RunScenarioWithUndefinedStepsStrict; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -47,21 +45,33 @@ public void parse_error_propagated_to_testng_test_execution() throws Exception { testNGCucumberRunner = new ParseErrorCucumberRunner(RunCukesTest.class); Object[][] scenarios = testNGCucumberRunner.provideScenarios(); // a CucumberException is caught try { - ((PickleEventWrapper)scenarios[0][0]).getPickleEvent(); + ((PickleEventWrapper) scenarios[0][0]).getPickleEvent(); Assert.fail("CucumberException not thrown"); } catch (CucumberException e) { Assert.assertEquals(e.getMessage(), "parse error"); } } -} -class ParseErrorCucumberRunner extends TestNGCucumberRunner { - public ParseErrorCucumberRunner(Class clazz) { - super(clazz); + + static class ParseErrorCucumberRunner extends TestNGCucumberRunner { + public ParseErrorCucumberRunner(Class clazz) { + super(clazz); + } + + @Override + List getFeatures() { + throw new CucumberException("parse error"); + } + } + + @CucumberOptions( + features = "classpath:io/cucumber/testng/api/undefined_steps.feature", + strict = true + ) + static class RunScenarioWithUndefinedStepsStrict extends AbstractTestNGCucumberTests { } - @Override - List getFeatures() { - throw new CucumberException("parse error"); + @CucumberOptions(strict = true) + static class RunCukesStrict extends AbstractTestNGCucumberTests { } } diff --git a/testng/src/test/java/cucumber/api/testng/TestPendingException.java b/testng/src/test/java/io/cucumber/testng/api/TestPendingException.java similarity index 89% rename from testng/src/test/java/cucumber/api/testng/TestPendingException.java rename to testng/src/test/java/io/cucumber/testng/api/TestPendingException.java index 1cd7db3265..db488025b0 100644 --- a/testng/src/test/java/cucumber/api/testng/TestPendingException.java +++ b/testng/src/test/java/io/cucumber/testng/api/TestPendingException.java @@ -1,4 +1,4 @@ -package cucumber.api.testng; +package io.cucumber.testng.api; import io.cucumber.core.backend.Pending; diff --git a/testng/src/test/resources/io/cucumber/testng/fa.feature b/testng/src/test/resources/io/cucumber/testng/api/fa.feature similarity index 100% rename from testng/src/test/resources/io/cucumber/testng/fa.feature rename to testng/src/test/resources/io/cucumber/testng/api/fa.feature diff --git a/testng/src/test/resources/io/cucumber/testng/fb.feature b/testng/src/test/resources/io/cucumber/testng/api/fb.feature similarity index 100% rename from testng/src/test/resources/io/cucumber/testng/fb.feature rename to testng/src/test/resources/io/cucumber/testng/api/fb.feature diff --git a/testng/src/test/resources/io/cucumber/testng/feature_with_same_steps_in_different_scenarios.feature b/testng/src/test/resources/io/cucumber/testng/api/feature_with_same_steps_in_different_scenarios.feature similarity index 100% rename from testng/src/test/resources/io/cucumber/testng/feature_with_same_steps_in_different_scenarios.feature rename to testng/src/test/resources/io/cucumber/testng/api/feature_with_same_steps_in_different_scenarios.feature diff --git a/testng/src/test/resources/io/cucumber/testng/three_scenarios.feature b/testng/src/test/resources/io/cucumber/testng/api/three_scenarios.feature similarity index 100% rename from testng/src/test/resources/io/cucumber/testng/three_scenarios.feature rename to testng/src/test/resources/io/cucumber/testng/api/three_scenarios.feature diff --git a/testng/src/test/resources/io/cucumber/testng/undefined_steps.feature b/testng/src/test/resources/io/cucumber/testng/api/undefined_steps.feature similarity index 100% rename from testng/src/test/resources/io/cucumber/testng/undefined_steps.feature rename to testng/src/test/resources/io/cucumber/testng/api/undefined_steps.feature From d469f175eaf1158e6159d391d522550186ff980d Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Mon, 10 Sep 2018 21:33:24 +0200 Subject: [PATCH 036/155] [Guice] Move guice api packages to io.cucumber.guice.api --- guice/README.md | 2 +- .../cucumber/guice/api}/CucumberModules.java | 3 +- .../cucumber/guice/api}/CucumberScopes.java | 5 +- .../guice/{ => api}/InjectorSource.java | 2 +- .../cucumber/guice/api}/README.java | 2 +- .../guice/{impl => api}/ScenarioModule.java | 4 +- .../guice/{ => api}/ScenarioScope.java | 2 +- .../guice/{ => api}/ScenarioScoped.java | 2 +- .../SequentialScenarioScope.java | 6 +-- .../cucumber/guice/api}/package.html | 12 ++--- .../io/cucumber/guice/impl/GuiceFactory.java | 2 +- .../guice/impl/InjectorSourceFactory.java | 20 +++----- .../InjectorSourceInstantiationFailed.java | 4 +- .../cucumber/guice/impl/GuiceFactoryTest.java | 47 ++++++++++-------- .../guice/impl/InjectorSourceFactoryTest.java | 4 +- .../impl/LivesInChildClassLoader.java.txt | 2 +- .../guice/integration/HelloWorldSteps.java | 2 +- .../integration/ScenarioScopedSteps.java | 2 +- .../integration/SingletonScopedSteps.java | 2 +- .../guice/integration/YourInjectorSource.java | 4 +- .../guice/integration/YourModule.java | 2 +- .../impl/LivesInChildClassLoader.class.bin | Bin 485 -> 489 bytes 22 files changed, 63 insertions(+), 68 deletions(-) rename guice/src/main/java/{cucumber/api/guice => io/cucumber/guice/api}/CucumberModules.java (82%) rename guice/src/main/java/{cucumber/api/guice => io/cucumber/guice/api}/CucumberScopes.java (69%) rename guice/src/main/java/io/cucumber/guice/{ => api}/InjectorSource.java (92%) rename guice/src/main/java/{cucumber/api/guice => io/cucumber/guice/api}/README.java (73%) rename guice/src/main/java/io/cucumber/guice/{impl => api}/ScenarioModule.java (82%) rename guice/src/main/java/io/cucumber/guice/{ => api}/ScenarioScope.java (89%) rename guice/src/main/java/io/cucumber/guice/{ => api}/ScenarioScoped.java (94%) rename guice/src/main/java/io/cucumber/guice/{impl => api}/SequentialScenarioScope.java (94%) rename guice/src/main/java/{cucumber/api/guice => io/cucumber/guice/api}/package.html (93%) rename guice/src/test/resources/io/cucumber/{ => guice}/impl/LivesInChildClassLoader.class.bin (65%) diff --git a/guice/README.md b/guice/README.md index 88bee86bdc..c9a8089c2e 100644 --- a/guice/README.md +++ b/guice/README.md @@ -6,4 +6,4 @@ migration section if upgrading from earlier versions of Cucumber Guice. [Read package documentation online at api.cucumber.io](https://github.com/cucumber/api.cucumber.io) -[Read package documentation offline (raw html)](src/main/java/cucumber/api/guice/package.html) +[Read package documentation offline (raw html)](src/main/java/io/cucumber/guice/api/package.html) diff --git a/guice/src/main/java/cucumber/api/guice/CucumberModules.java b/guice/src/main/java/io/cucumber/guice/api/CucumberModules.java similarity index 82% rename from guice/src/main/java/cucumber/api/guice/CucumberModules.java rename to guice/src/main/java/io/cucumber/guice/api/CucumberModules.java index 2298dc298c..73c605effa 100644 --- a/guice/src/main/java/cucumber/api/guice/CucumberModules.java +++ b/guice/src/main/java/io/cucumber/guice/api/CucumberModules.java @@ -1,7 +1,6 @@ -package cucumber.api.guice; +package io.cucumber.guice.api; import com.google.inject.Module; -import io.cucumber.guice.impl.ScenarioModule; /** * Provides a convenient com.google.inject.Module instance that contains bindings for diff --git a/guice/src/main/java/cucumber/api/guice/CucumberScopes.java b/guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java similarity index 69% rename from guice/src/main/java/cucumber/api/guice/CucumberScopes.java rename to guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java index e0b1edecb6..28436f9212 100644 --- a/guice/src/main/java/cucumber/api/guice/CucumberScopes.java +++ b/guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java @@ -1,7 +1,4 @@ -package cucumber.api.guice; - -import io.cucumber.guice.ScenarioScope; -import io.cucumber.guice.impl.SequentialScenarioScope; +package io.cucumber.guice.api; /** * Provides a convenient ScenarioScope instance for use when declaring bindings diff --git a/guice/src/main/java/io/cucumber/guice/InjectorSource.java b/guice/src/main/java/io/cucumber/guice/api/InjectorSource.java similarity index 92% rename from guice/src/main/java/io/cucumber/guice/InjectorSource.java rename to guice/src/main/java/io/cucumber/guice/api/InjectorSource.java index e8fe8a6c30..4ba0042cba 100644 --- a/guice/src/main/java/io/cucumber/guice/InjectorSource.java +++ b/guice/src/main/java/io/cucumber/guice/api/InjectorSource.java @@ -1,4 +1,4 @@ -package io.cucumber.guice; +package io.cucumber.guice.api; import com.google.inject.Injector; diff --git a/guice/src/main/java/cucumber/api/guice/README.java b/guice/src/main/java/io/cucumber/guice/api/README.java similarity index 73% rename from guice/src/main/java/cucumber/api/guice/README.java rename to guice/src/main/java/io/cucumber/guice/api/README.java index 1854d00888..55e41f0e6b 100644 --- a/guice/src/main/java/cucumber/api/guice/README.java +++ b/guice/src/main/java/io/cucumber/guice/api/README.java @@ -1,4 +1,4 @@ -package cucumber.api.guice; +package io.cucumber.guice.api; /** diff --git a/guice/src/main/java/io/cucumber/guice/impl/ScenarioModule.java b/guice/src/main/java/io/cucumber/guice/api/ScenarioModule.java similarity index 82% rename from guice/src/main/java/io/cucumber/guice/impl/ScenarioModule.java rename to guice/src/main/java/io/cucumber/guice/api/ScenarioModule.java index 4acb4b8f5f..4f8347da13 100644 --- a/guice/src/main/java/io/cucumber/guice/impl/ScenarioModule.java +++ b/guice/src/main/java/io/cucumber/guice/api/ScenarioModule.java @@ -1,8 +1,6 @@ -package io.cucumber.guice.impl; +package io.cucumber.guice.api; import com.google.inject.AbstractModule; -import io.cucumber.guice.ScenarioScoped; -import io.cucumber.guice.ScenarioScope; public class ScenarioModule extends AbstractModule { diff --git a/guice/src/main/java/io/cucumber/guice/ScenarioScope.java b/guice/src/main/java/io/cucumber/guice/api/ScenarioScope.java similarity index 89% rename from guice/src/main/java/io/cucumber/guice/ScenarioScope.java rename to guice/src/main/java/io/cucumber/guice/api/ScenarioScope.java index 1f0ee4081b..c255256062 100644 --- a/guice/src/main/java/io/cucumber/guice/ScenarioScope.java +++ b/guice/src/main/java/io/cucumber/guice/api/ScenarioScope.java @@ -1,4 +1,4 @@ -package io.cucumber.guice; +package io.cucumber.guice.api; import com.google.inject.Scope; diff --git a/guice/src/main/java/io/cucumber/guice/ScenarioScoped.java b/guice/src/main/java/io/cucumber/guice/api/ScenarioScoped.java similarity index 94% rename from guice/src/main/java/io/cucumber/guice/ScenarioScoped.java rename to guice/src/main/java/io/cucumber/guice/api/ScenarioScoped.java index 40d1211cee..a4b049fc46 100644 --- a/guice/src/main/java/io/cucumber/guice/ScenarioScoped.java +++ b/guice/src/main/java/io/cucumber/guice/api/ScenarioScoped.java @@ -1,4 +1,4 @@ -package io.cucumber.guice; +package io.cucumber.guice.api; import com.google.inject.ScopeAnnotation; diff --git a/guice/src/main/java/io/cucumber/guice/impl/SequentialScenarioScope.java b/guice/src/main/java/io/cucumber/guice/api/SequentialScenarioScope.java similarity index 94% rename from guice/src/main/java/io/cucumber/guice/impl/SequentialScenarioScope.java rename to guice/src/main/java/io/cucumber/guice/api/SequentialScenarioScope.java index 727db60919..bc62c1e040 100644 --- a/guice/src/main/java/io/cucumber/guice/impl/SequentialScenarioScope.java +++ b/guice/src/main/java/io/cucumber/guice/api/SequentialScenarioScope.java @@ -1,14 +1,14 @@ -package io.cucumber.guice.impl; +package io.cucumber.guice.api; import com.google.inject.Key; import com.google.inject.OutOfScopeException; import com.google.inject.Provider; -import io.cucumber.guice.ScenarioScope; +import io.cucumber.guice.api.ScenarioScope; import java.util.HashMap; import java.util.Map; -public class SequentialScenarioScope implements ScenarioScope { +class SequentialScenarioScope implements ScenarioScope { /** * Scopes a provider. The returned provider returns objects from this scope. diff --git a/guice/src/main/java/cucumber/api/guice/package.html b/guice/src/main/java/io/cucumber/guice/api/package.html similarity index 93% rename from guice/src/main/java/cucumber/api/guice/package.html rename to guice/src/main/java/io/cucumber/guice/api/package.html index aba2a41be9..79ce44ca8a 100644 --- a/guice/src/main/java/cucumber/api/guice/package.html +++ b/guice/src/main/java/io/cucumber/guice/api/package.html @@ -61,7 +61,7 @@

    Singleton scope

    Using scope annotations

    This is the easy route if you're new to Guice. To bind a class in scenario scope add the - io.cucumber.guice.ScenarioScoped annotation to the class definition. The class should have + io.cucumber.guice.api.ScenarioScoped annotation to the class definition. The class should have a no-args constructor or one constructor that is annotated with javax.inject.Inject. For example:

    @@ -117,10 +117,10 @@ 

    Using module bindings

    As an alternative to using annotations you may prefer to declare Guice bindings in a class that implements com.google.inject.Module. To do this you should create a class that implements - io.cucumber.guice.InjectorSource. This gives you complete control over how you obtain a + io.cucumber.guice.api.InjectorSource. This gives you complete control over how you obtain a Guice injector and it's Guice modules. The injector must provide a binding for - io.cucumber.guice.ScenarioScope. It should also provide a binding for the - io.cucumber.guice.ScenarioScoped annotation if your classes are using the annotation. The + io.cucumber.guice.api.ScenarioScope. It should also provide a binding for the + io.cucumber.guice.api.ScenarioScoped annotation if your classes are using the annotation. The easiest way to do this it to use CucumberModules.SCENARIO. For example:

    @@ -139,10 +139,10 @@ 

    Using module bindings

    }

    - Cucumber needs to know where to find the io.cucumber.guice.InjectorSource that it will use. + Cucumber needs to know where to find the io.cucumber.guice.api.InjectorSource that it will use. You should create a properties file called cucumber.properties and place it in the root of the classpath. The file should contain a single property key called guice.injector-source with a value - equal to the fully qualified name of the io.cucumber.guice.InjectorSource. For example: + equal to the fully qualified name of the io.cucumber.guice.api.InjectorSource. For example:

             guice.injector-source=com.company.YourInjectorSource
    diff --git a/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java b/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java
    index f9ff29561f..ccf963db0b 100644
    --- a/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java
    +++ b/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java
    @@ -3,7 +3,7 @@
     import com.google.inject.Injector;
     import cucumber.api.java.ObjectFactory;
     import io.cucumber.core.options.Env;
    -import io.cucumber.guice.ScenarioScope;
    +import io.cucumber.guice.api.ScenarioScope;
     
     /**
      * Guice implementation of the cucumber.api.java.ObjectFactory.
    diff --git a/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java b/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java
    index 0db5a454fd..7cf2caca60 100644
    --- a/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java
    +++ b/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java
    @@ -1,23 +1,23 @@
     package io.cucumber.guice.impl;
     
     import com.google.inject.Guice;
    -import com.google.inject.Injector;
     import com.google.inject.Stage;
     import io.cucumber.core.options.Env;
    -import io.cucumber.guice.InjectorSource;
    +import io.cucumber.guice.api.CucumberModules;
    +import io.cucumber.guice.api.InjectorSource;
     
     import static java.text.MessageFormat.format;
     
    -public class InjectorSourceFactory {
    +class InjectorSourceFactory {
     
    -    public static final String GUICE_INJECTOR_SOURCE_KEY = "guice.injector-source";
    +    static final String GUICE_INJECTOR_SOURCE_KEY = "guice.injector-source";
         private final Env env;
     
    -    public InjectorSourceFactory(Env env) {
    +    InjectorSourceFactory(Env env) {
             this.env = env;
         }
     
    -    public InjectorSource create() {
    +    InjectorSource create() {
             String injectorSourceClassName = env.get(GUICE_INJECTOR_SOURCE_KEY);
             if (injectorSourceClassName == null) {
                 return createDefaultScenarioModuleInjectorSource();
    @@ -27,13 +27,7 @@ public InjectorSource create() {
         }
     
         private InjectorSource createDefaultScenarioModuleInjectorSource() {
    -        return new InjectorSource() {
    -            @Override
    -            public Injector getInjector() {
    -                ScenarioModule scenarioModule = new ScenarioModule(new SequentialScenarioScope());
    -                return Guice.createInjector(Stage.PRODUCTION, scenarioModule);
    -            }
    -        };
    +        return () -> Guice.createInjector(Stage.PRODUCTION, CucumberModules.SCENARIO);
         }
     
         private InjectorSource instantiateUserSpecifiedInjectorSource(String injectorSourceClassName) {
    diff --git a/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java b/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java
    index b21760cfd4..8254682e9a 100644
    --- a/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java
    +++ b/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java
    @@ -2,9 +2,9 @@
     
     import io.cucumber.core.exception.CucumberException;
     
    -public class InjectorSourceInstantiationFailed extends CucumberException {
    +class InjectorSourceInstantiationFailed extends CucumberException {
     
    -    public InjectorSourceInstantiationFailed(String message, Throwable cause) {
    +    InjectorSourceInstantiationFailed(String message, Throwable cause) {
             super(message, cause);
         }
     }
    \ No newline at end of file
    diff --git a/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java
    index c17e2c5b2c..d9f405375a 100644
    --- a/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java
    +++ b/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java
    @@ -1,20 +1,21 @@
     package io.cucumber.guice.impl;
     
     import com.google.inject.AbstractModule;
    -import com.google.inject.ConfigurationException;
     import com.google.inject.Guice;
     import com.google.inject.Injector;
     import com.google.inject.Module;
     import com.google.inject.Scopes;
     import com.google.inject.Stage;
    -import cucumber.api.guice.CucumberModules;
    -import cucumber.api.guice.CucumberScopes;
     import cucumber.api.java.ObjectFactory;
    -import io.cucumber.guice.ScenarioScoped;
    +import io.cucumber.guice.api.CucumberModules;
    +import io.cucumber.guice.api.CucumberScopes;
    +import io.cucumber.guice.api.ScenarioScoped;
     import io.cucumber.guice.matcher.ElementsAreAllEqualMatcher;
     import io.cucumber.guice.matcher.ElementsAreAllUniqueMatcher;
     import org.junit.After;
    +import org.junit.Rule;
     import org.junit.Test;
    +import org.junit.rules.ExpectedException;
     
     import javax.inject.Singleton;
     import java.util.Arrays;
    @@ -23,10 +24,13 @@
     import static org.hamcrest.CoreMatchers.containsString;
     import static org.hamcrest.CoreMatchers.notNullValue;
     import static org.junit.Assert.assertThat;
    -import static org.junit.Assert.fail;
    +import static org.junit.rules.ExpectedException.none;
     
     public class GuiceFactoryTest {
     
    +    @Rule
    +    public ExpectedException expectedException = none();
    +
         private ObjectFactory factory;
         private List instancesFromSameScenario;
         private List instancesFromDifferentScenarios;
    @@ -38,7 +42,7 @@ public void tearDown() {
         }
     
         @Test
    -    public void factoryCanBeIntantiatedWithDefaultConstructor() throws Exception {
    +    public void factoryCanBeIntantiatedWithDefaultConstructor() {
             factory = new GuiceFactory();
             assertThat(factory, notNullValue());
         }
    @@ -52,16 +56,12 @@ public void factoryCanBeIntantiatedWithArgConstructor() {
         @Test
         public void factoryStartFailsIfScenarioScopeIsNotBound() {
             factory = new GuiceFactory(Guice.createInjector());
    -        try {
    -            factory.start();
    -            fail();
    -        } catch (ConfigurationException e) {
    -            assertThat(e.getMessage(),
    -                    containsString("No implementation for io.cucumber.guice.ScenarioScope was bound"));
    -        }
    +        expectedException.expectMessage(containsString("No implementation for io.cucumber.guice.api.ScenarioScope was bound"));
    +        factory.start();
         }
     
    -    static class UnscopedClass {}
    +    static class UnscopedClass {
    +    }
     
         @Test
         public void shouldGiveNewInstancesOfUnscopedClassWithinAScenario() {
    @@ -78,7 +78,8 @@ public void shouldGiveNewInstanceOfUnscopedClassForEachScenario() {
         }
     
         @ScenarioScoped
    -    static class AnnotatedScenarioScopedClass {}
    +    static class AnnotatedScenarioScopedClass {
    +    }
     
         @Test
         public void shouldGiveTheSameInstanceOfAnnotatedScenarioScopedClassWithinAScenario() {
    @@ -94,7 +95,9 @@ public void shouldGiveNewInstanceOfAnnotatedScenarioScopedClassForEachScenario()
             assertThat(instancesFromDifferentScenarios, ElementsAreAllUniqueMatcher.elementsAreAllUnique());
         }
     
    -    @Singleton static class AnnotatedSingletonClass {}
    +    @Singleton
    +    static class AnnotatedSingletonClass {
    +    }
     
         @Test
         public void shouldGiveTheSameInstanceOfAnnotatedSingletonClassWithinAScenario() {
    @@ -110,10 +113,12 @@ public void shouldGiveTheSameInstanceOfAnnotatedSingletonClassForEachScenario()
             assertThat(instancesFromDifferentScenarios, ElementsAreAllEqualMatcher.elementsAreAllEqual());
         }
     
    -    static class BoundScenarioScopedClass {}
    +    static class BoundScenarioScopedClass {
    +    }
     
         final AbstractModule boundScenarioScopedClassModule = new AbstractModule() {
    -        @Override protected void configure() {
    +        @Override
    +        protected void configure() {
                 bind(BoundScenarioScopedClass.class).in(CucumberScopes.SCENARIO);
             }
         };
    @@ -132,10 +137,12 @@ public void shouldGiveNewInstanceOfBoundScenarioScopedClassForEachScenario() {
             assertThat(instancesFromDifferentScenarios, ElementsAreAllUniqueMatcher.elementsAreAllUnique());
         }
     
    -    static class BoundSingletonClass {}
    +    static class BoundSingletonClass {
    +    }
     
         final AbstractModule boundSingletonClassModule = new AbstractModule() {
    -        @Override protected void configure() {
    +        @Override
    +        protected void configure() {
                 bind(BoundSingletonClass.class).in(Scopes.SINGLETON);
             }
         };
    diff --git a/guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java
    index b235b91b3b..c267538069 100644
    --- a/guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java
    +++ b/guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java
    @@ -2,7 +2,7 @@
     
     import com.google.inject.Injector;
     import io.cucumber.core.options.Env;
    -import io.cucumber.guice.InjectorSource;
    +import io.cucumber.guice.api.InjectorSource;
     import org.junit.Test;
     
     import java.io.ByteArrayOutputStream;
    @@ -149,7 +149,7 @@ public MyChildClassLoader( ClassLoader parent ) {
             @Override
             protected Class loadClass( String name, boolean resolve ) throws ClassNotFoundException {
                 if( name.equals( "io.cucumber.guice.impl.LivesInChildClassLoader" ) ) {
    -                String filename = getClass().getClassLoader().getResource("io/cucumber/impl/LivesInChildClassLoader.class.bin").getFile();
    +                String filename = getClass().getClassLoader().getResource("io/cucumber/guice/impl/LivesInChildClassLoader.class.bin").getFile();
                     File file = new File( filename );
                     try {
                         FileInputStream in = new FileInputStream( file );
    diff --git a/guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt b/guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt
    index 29445c721c..f0c2bf767b 100644
    --- a/guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt
    +++ b/guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt
    @@ -1,7 +1,7 @@
     package io.cucumber.guice.impl;
     
     import com.google.inject.Injector;
    -import io.cucumber.guice.InjectorSource;
    +import io.cucumber.guice.api.InjectorSource;
     
     public class LivesInChildClassLoader implements InjectorSource {
       @Override
    diff --git a/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java
    index d7ca574a05..16e3e51873 100644
    --- a/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java
    +++ b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java
    @@ -1,7 +1,7 @@
     package io.cucumber.guice.integration;
     
     import cucumber.api.java.en.Given;
    -import io.cucumber.guice.ScenarioScoped;
    +import io.cucumber.guice.api.ScenarioScoped;
     
     @ScenarioScoped
     public class HelloWorldSteps {
    diff --git a/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java
    index 57ca48e914..6035039919 100644
    --- a/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java
    +++ b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java
    @@ -3,7 +3,7 @@
     import cucumber.api.java.en.Given;
     import cucumber.api.java.en.Then;
     import cucumber.api.java.en.When;
    -import io.cucumber.guice.ScenarioScoped;
    +import io.cucumber.guice.api.ScenarioScoped;
     
     import javax.inject.Inject;
     import javax.inject.Provider;
    diff --git a/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java
    index 3103b56fed..c03a281388 100644
    --- a/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java
    +++ b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java
    @@ -3,7 +3,7 @@
     import cucumber.api.java.en.Given;
     import cucumber.api.java.en.Then;
     import cucumber.api.java.en.When;
    -import io.cucumber.guice.ScenarioScoped;
    +import io.cucumber.guice.api.ScenarioScoped;
     
     import javax.inject.Inject;
     import javax.inject.Provider;
    diff --git a/guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java b/guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java
    index 3368a6c34a..f7eec49773 100644
    --- a/guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java
    +++ b/guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java
    @@ -3,8 +3,8 @@
     import com.google.inject.Guice;
     import com.google.inject.Injector;
     import com.google.inject.Stage;
    -import cucumber.api.guice.CucumberModules;
    -import io.cucumber.guice.InjectorSource;
    +import io.cucumber.guice.api.CucumberModules;
    +import io.cucumber.guice.api.InjectorSource;
     
     public class YourInjectorSource implements InjectorSource {
     
    diff --git a/guice/src/test/java/io/cucumber/guice/integration/YourModule.java b/guice/src/test/java/io/cucumber/guice/integration/YourModule.java
    index 1eec07ac62..9172300cfd 100644
    --- a/guice/src/test/java/io/cucumber/guice/integration/YourModule.java
    +++ b/guice/src/test/java/io/cucumber/guice/integration/YourModule.java
    @@ -2,7 +2,7 @@
     
     import com.google.inject.AbstractModule;
     import com.google.inject.Scopes;
    -import cucumber.api.guice.CucumberScopes;
    +import io.cucumber.guice.api.CucumberScopes;
     
     public class YourModule extends AbstractModule {
     
    diff --git a/guice/src/test/resources/io/cucumber/impl/LivesInChildClassLoader.class.bin b/guice/src/test/resources/io/cucumber/guice/impl/LivesInChildClassLoader.class.bin
    similarity index 65%
    rename from guice/src/test/resources/io/cucumber/impl/LivesInChildClassLoader.class.bin
    rename to guice/src/test/resources/io/cucumber/guice/impl/LivesInChildClassLoader.class.bin
    index c4c0782bb293df22c3b5980da58935314c0b2400..f306ff0ede06285d54c24343b4343b9cadb5a882 100644
    GIT binary patch
    delta 44
    zcmaFL{F0gD)W2Q(7#J8#Hgf1Pim7Dg>nE2cm*ys=7U`##W+tcVCl+K*c4wRi0B(g3
    A?EnA(
    
    delta 40
    wcmaFK{FIsF)W2Q(7#J9gH*)AQ3Mpjf>nE2cm*ys=7U`##W+taj_GX+105H)Ge*gdg
    
    
    From 60b55dc5f3cee1ce2fc76c591277439ad63ba3c1 Mon Sep 17 00:00:00 2001
    From: "M.P. Korstanje" 
    Date: Mon, 10 Sep 2018 21:45:55 +0200
    Subject: [PATCH 037/155] [Kotlin] Upgrade Kotlin to 1.2.51
    
    ---
     kotlin-java8/pom.xml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/kotlin-java8/pom.xml b/kotlin-java8/pom.xml
    index 05ac66dc4e..35e0785f89 100644
    --- a/kotlin-java8/pom.xml
    +++ b/kotlin-java8/pom.xml
    @@ -12,7 +12,7 @@
         Cucumber-JVM: Kotlin Java8
     
         
    -        1.2.41
    +        1.2.51
         
     
         
    
    From 5965d80b2815759d279aef749a860d7cc875d5aa Mon Sep 17 00:00:00 2001
    From: "M.P. Korstanje" 
    Date: Mon, 10 Sep 2018 21:49:31 +0200
    Subject: [PATCH 038/155] [Needle] Move needle api packages to
     io.cucumber.needle.api
    
    ---
     examples/java-gradle/.gitignore               |  2 -
     examples/java-gradle/README.md                | 53 -------------------
     examples/java-gradle/build.gradle             | 22 --------
     .../main/java/gradle/cucumber/Production.java |  9 ----
     .../java/gradle/cucumber/BasicStepdefs.java   | 11 ----
     .../java/gradle/cucumber/RunCukesTest.java    | 11 ----
     .../resources/gradle/cucumber/gradle.feature  |  4 --
     ...ctInjectionProvidersFromStepsInstance.java | 11 ++--
     .../CreateInstanceByDefaultConstructor.java   |  6 +--
     .../CucumberNeedleConfiguration.java          | 10 ++--
     .../{config => }/LoadResourceBundle.java      |  4 +-
     .../io/cucumber/needle/NeedleFactory.java     |  3 --
     .../ReadInjectionProviderClassNames.java      |  4 +-
     .../InjectionProviderInstancesSupplier.java   |  2 +-
     .../needle/api}/NeedleInjectionProvider.java  |  2 +-
     .../cucumber/needle/api}/package.html         |  0
     ...jectionProvidersFromStepsInstanceTest.java |  7 ++-
     ...reateInstanceByDefaultConstructorTest.java |  2 +-
     .../CucumberNeedleConfigurationTest.java      |  4 +-
     .../DefaultInstanceInjectionProvider.java     |  2 +-
     .../LoadCucumberNeedleResourceBundleTest.java |  3 +-
     .../NamedInjectionProvider.java               |  2 +-
     .../io/cucumber/needle/NeedleFactoryTest.java |  1 -
     .../ReadInjectionProviderClassNamesTest.java  |  5 +-
     .../needle/test/AtmWithdrawalSteps.java       |  6 +--
     .../io/cucumber/needle/test/MoreSteps.java    |  4 +-
     .../ValueInjectionProvider.java               |  2 +-
     27 files changed, 39 insertions(+), 153 deletions(-)
     delete mode 100644 examples/java-gradle/.gitignore
     delete mode 100644 examples/java-gradle/README.md
     delete mode 100644 examples/java-gradle/build.gradle
     delete mode 100644 examples/java-gradle/src/main/java/gradle/cucumber/Production.java
     delete mode 100644 examples/java-gradle/src/test/java/gradle/cucumber/BasicStepdefs.java
     delete mode 100644 examples/java-gradle/src/test/java/gradle/cucumber/RunCukesTest.java
     delete mode 100644 examples/java-gradle/src/test/resources/gradle/cucumber/gradle.feature
     rename needle/src/main/java/io/cucumber/needle/{config => }/CollectInjectionProvidersFromStepsInstance.java (86%)
     rename needle/src/main/java/io/cucumber/needle/{config => }/CreateInstanceByDefaultConstructor.java (81%)
     rename needle/src/main/java/io/cucumber/needle/{config => }/CucumberNeedleConfiguration.java (91%)
     rename needle/src/main/java/io/cucumber/needle/{config => }/LoadResourceBundle.java (95%)
     rename needle/src/main/java/io/cucumber/needle/{config => }/ReadInjectionProviderClassNames.java (92%)
     rename needle/src/main/java/{cucumber/api/needle => io/cucumber/needle/api}/InjectionProviderInstancesSupplier.java (96%)
     rename needle/src/main/java/{cucumber/api/needle => io/cucumber/needle/api}/NeedleInjectionProvider.java (94%)
     rename needle/src/main/java/{cucumber/api/needle => io/cucumber/needle/api}/package.html (100%)
     rename needle/src/test/java/io/cucumber/needle/{config => }/CollectInjectionProvidersFromStepsInstanceTest.java (89%)
     rename needle/src/test/java/io/cucumber/needle/{config => }/CreateInstanceByDefaultConstructorTest.java (96%)
     rename needle/src/test/java/io/cucumber/needle/{config => }/CucumberNeedleConfigurationTest.java (93%)
     rename needle/src/test/java/io/cucumber/needle/{injection => }/DefaultInstanceInjectionProvider.java (97%)
     rename needle/src/test/java/io/cucumber/needle/{config => }/LoadCucumberNeedleResourceBundleTest.java (96%)
     rename needle/src/test/java/io/cucumber/needle/{injection => }/NamedInjectionProvider.java (98%)
     rename needle/src/test/java/io/cucumber/needle/{config => }/ReadInjectionProviderClassNamesTest.java (92%)
    
    diff --git a/examples/java-gradle/.gitignore b/examples/java-gradle/.gitignore
    deleted file mode 100644
    index f8b92c3aa0..0000000000
    --- a/examples/java-gradle/.gitignore
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -.gradle
    -build
    diff --git a/examples/java-gradle/README.md b/examples/java-gradle/README.md
    deleted file mode 100644
    index 213bc73cb8..0000000000
    --- a/examples/java-gradle/README.md
    +++ /dev/null
    @@ -1,53 +0,0 @@
    -# Running Cucumber-JVM with step definitions in Java using Gradle's `javaexec` task
    -
    -## Credits
    -
    -This work is based on [dkowis/cucumber-jvm-groovy-example](https://github.com/dkowis/cucumber-jvm-groovy-example)
    -
    -## Motivation
    -
    -There exists [a number of issues](http://gradle.1045684.n5.nabble.com/Gradle-and-cucumber-jvm-tt5710562.html) which prevent seamless integration of Cucumber-JVM and Gradle.
    -
    -## Solution
    -
    -One possible solution is to use Cucumber's `Main` class to run your tests. You can do this by using the `javaexec` task in Gradle.
    -
    -## Running
    -
    -In order to run your Cucumber tests execute:
    -
    -```sh
    -gradle cucumber
    -```
    -
    -## Caveats
    -
    -The Groovy example by [David Kowis](https://github.com/dkowis) runs perfectly, but it uses Groovy step definitions.
    -
    -If you're writing your step definitions in Java then the Gradle script needs to be changed slightly.
    -
    -Here are some caveats:
    -
    - * The `cucumber` task has to depend on `testClasses` task in order to compile test sources
    -
    - ```groovy
    - task cucumber(dependsOn: testClasses) {
    -     ...
    - }
    - ```
    -
    - * The `javaexec` classpath should include `main` and `test` output directories.
    - Otherwise Cucumber-JVM will not find your production classes/resources and step definitions respectively.
    -
    - ```groovy
    - classpath = configurations.testRuntimeClasspath + sourceSets.main.output + sourceSets.test.output
    - ```
    -
    - * Cucumber's `--glue` should be set to your package name (e.g. `gradle.cucumber`) and **NOT** to `src/test/java`
    -
    - ```groovy
    - args = ['-f', 'pretty', '--glue', 'gradle.cucumber', 'src/test/resources']
    - ```
    -
    -
    -
    diff --git a/examples/java-gradle/build.gradle b/examples/java-gradle/build.gradle
    deleted file mode 100644
    index 4d63d067bb..0000000000
    --- a/examples/java-gradle/build.gradle
    +++ /dev/null
    @@ -1,22 +0,0 @@
    -apply plugin: 'java'
    -
    -task cucumber(dependsOn: testClasses) {
    -    doLast {
    -        javaexec {
    -            main = "cucumber.api.cli.Main"
    -            classpath = configurations.testRuntimeClasspath + sourceSets.main.output + sourceSets.test.output
    -            args = ['--plugin', 'pretty', '--glue', 'gradle.cucumber', 'src/test/resources']
    -        }
    -    }
    -}
    -
    -dependencies {
    -    testCompile 'io.cucumber:cucumber-java:3.0.2'
    -    testCompile 'io.cucumber:cucumber-junit:3.0.2'
    -
    -    testCompile 'junit:junit:4.12'
    -}
    -
    -repositories {
    -    mavenCentral()
    -}
    diff --git a/examples/java-gradle/src/main/java/gradle/cucumber/Production.java b/examples/java-gradle/src/main/java/gradle/cucumber/Production.java
    deleted file mode 100644
    index ea355abade..0000000000
    --- a/examples/java-gradle/src/main/java/gradle/cucumber/Production.java
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -package gradle.cucumber;
    -
    -public class Production {
    -
    -    public void doWork() {
    -        throw new RuntimeException("production failed here");
    -    }
    -
    -}
    diff --git a/examples/java-gradle/src/test/java/gradle/cucumber/BasicStepdefs.java b/examples/java-gradle/src/test/java/gradle/cucumber/BasicStepdefs.java
    deleted file mode 100644
    index be7bef22a8..0000000000
    --- a/examples/java-gradle/src/test/java/gradle/cucumber/BasicStepdefs.java
    +++ /dev/null
    @@ -1,11 +0,0 @@
    -package gradle.cucumber;
    -
    -import cucumber.api.java.en.When;
    -
    -public class BasicStepdefs {
    -
    -    @When("I run a failing step")
    -    public void I_run_a_failing_step() throws Throwable {
    -        new Production().doWork();
    -    }
    -}
    diff --git a/examples/java-gradle/src/test/java/gradle/cucumber/RunCukesTest.java b/examples/java-gradle/src/test/java/gradle/cucumber/RunCukesTest.java
    deleted file mode 100644
    index d9b7ad43ff..0000000000
    --- a/examples/java-gradle/src/test/java/gradle/cucumber/RunCukesTest.java
    +++ /dev/null
    @@ -1,11 +0,0 @@
    -package gradle.cucumber;
    -
    -import cucumber.api.junit.Cucumber;
    -import org.junit.runner.RunWith;
    -import cucumber.api.CucumberOptions;
    -
    -@RunWith(Cucumber.class)
    -@CucumberOptions(plugin = {"pretty"})
    -public class RunCukesTest {
    -
    -}
    diff --git a/examples/java-gradle/src/test/resources/gradle/cucumber/gradle.feature b/examples/java-gradle/src/test/resources/gradle/cucumber/gradle.feature
    deleted file mode 100644
    index eb54644367..0000000000
    --- a/examples/java-gradle/src/test/resources/gradle/cucumber/gradle.feature
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -Feature: Gradle-Cucumber integration
    -
    -  Scenario: Just a failing scenario
    -    When I run a failing step
    diff --git a/needle/src/main/java/io/cucumber/needle/config/CollectInjectionProvidersFromStepsInstance.java b/needle/src/main/java/io/cucumber/needle/CollectInjectionProvidersFromStepsInstance.java
    similarity index 86%
    rename from needle/src/main/java/io/cucumber/needle/config/CollectInjectionProvidersFromStepsInstance.java
    rename to needle/src/main/java/io/cucumber/needle/CollectInjectionProvidersFromStepsInstance.java
    index 533126b48d..256e968af7 100755
    --- a/needle/src/main/java/io/cucumber/needle/config/CollectInjectionProvidersFromStepsInstance.java
    +++ b/needle/src/main/java/io/cucumber/needle/CollectInjectionProvidersFromStepsInstance.java
    @@ -1,8 +1,7 @@
    -package io.cucumber.needle.config;
    +package io.cucumber.needle;
     
    -import cucumber.api.needle.InjectionProviderInstancesSupplier;
    -import cucumber.api.needle.NeedleInjectionProvider;
    -import io.cucumber.needle.NeedleFactory;
    +import io.cucumber.needle.api.InjectionProviderInstancesSupplier;
    +import io.cucumber.needle.api.NeedleInjectionProvider;
     import de.akquinet.jbosscc.needle.injection.InjectionProvider;
     import de.akquinet.jbosscc.needle.reflection.ReflectionUtil;
     import org.slf4j.Logger;
    @@ -16,7 +15,7 @@
     /**
      * Collects {@link InjectionProvider} instances.
      */
    -public enum CollectInjectionProvidersFromStepsInstance {
    +enum CollectInjectionProvidersFromStepsInstance {
         /**
          * stateless Singleton
          */
    @@ -33,7 +32,7 @@ public enum CollectInjectionProvidersFromStepsInstance {
          * @param instance step definition instance
          * @return collected injection providers.
          */
    -    public final  InjectionProvider[] apply(final T instance) {
    +    final  InjectionProvider[] apply(final T instance) {
             final Set> providers = new LinkedHashSet>();
             for (final Field field : ReflectionUtil.getAllFieldsWithAnnotation(instance, NeedleInjectionProvider.class)) {
                 field.setAccessible(true);
    diff --git a/needle/src/main/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructor.java b/needle/src/main/java/io/cucumber/needle/CreateInstanceByDefaultConstructor.java
    similarity index 81%
    rename from needle/src/main/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructor.java
    rename to needle/src/main/java/io/cucumber/needle/CreateInstanceByDefaultConstructor.java
    index 5a7373df82..380df19e4d 100644
    --- a/needle/src/main/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructor.java
    +++ b/needle/src/main/java/io/cucumber/needle/CreateInstanceByDefaultConstructor.java
    @@ -1,4 +1,4 @@
    -package io.cucumber.needle.config;
    +package io.cucumber.needle;
     
     import org.slf4j.Logger;
     import org.slf4j.LoggerFactory;
    @@ -6,7 +6,7 @@
     /**
      * Instantiates new java object by default constructor
      */
    -public enum CreateInstanceByDefaultConstructor {
    +enum CreateInstanceByDefaultConstructor {
         /**
          * Singleton
          */
    @@ -14,7 +14,7 @@ public enum CreateInstanceByDefaultConstructor {
     
         private final Logger logger = LoggerFactory.getLogger(this.getClass());
     
    -    public final  T apply(final Class type) {
    +    final  T apply(final Class type) {
             try {
                 final T newInstance = type.getConstructor().newInstance();
                 logger.debug("newInstance by DefaultConstructor: " + newInstance);
    diff --git a/needle/src/main/java/io/cucumber/needle/config/CucumberNeedleConfiguration.java b/needle/src/main/java/io/cucumber/needle/CucumberNeedleConfiguration.java
    similarity index 91%
    rename from needle/src/main/java/io/cucumber/needle/config/CucumberNeedleConfiguration.java
    rename to needle/src/main/java/io/cucumber/needle/CucumberNeedleConfiguration.java
    index 7f1f941504..2067d37e24 100644
    --- a/needle/src/main/java/io/cucumber/needle/config/CucumberNeedleConfiguration.java
    +++ b/needle/src/main/java/io/cucumber/needle/CucumberNeedleConfiguration.java
    @@ -1,6 +1,6 @@
    -package io.cucumber.needle.config;
    +package io.cucumber.needle;
     
    -import cucumber.api.needle.InjectionProviderInstancesSupplier;
    +import io.cucumber.needle.api.InjectionProviderInstancesSupplier;
     import de.akquinet.jbosscc.needle.injection.InjectionProvider;
     import org.slf4j.Logger;
     import org.slf4j.LoggerFactory;
    @@ -12,11 +12,11 @@
     /**
      * Reads cucumber-needle.properties to initialize additional {@link InjectionProvider}s.
      */
    -public class CucumberNeedleConfiguration {
    +class CucumberNeedleConfiguration {
         /**
          * Default properties fiel name.
          */
    -    public static final String RESOURCE_CUCUMBER_NEEDLE = "cucumber-needle";
    +    static final String RESOURCE_CUCUMBER_NEEDLE = "cucumber-needle";
     
         @SuppressWarnings("unused")
         private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @@ -34,7 +34,7 @@ public CucumberNeedleConfiguration() {
             this(RESOURCE_CUCUMBER_NEEDLE);
         }
     
    -    public CucumberNeedleConfiguration(final String resourceName) {
    +    CucumberNeedleConfiguration(final String resourceName) {
             final ResourceBundle resourceBundle = loadResourceBundle.apply(resourceName);
             final Set classNames = readInjectionProviderClassNames.apply(resourceBundle);
     
    diff --git a/needle/src/main/java/io/cucumber/needle/config/LoadResourceBundle.java b/needle/src/main/java/io/cucumber/needle/LoadResourceBundle.java
    similarity index 95%
    rename from needle/src/main/java/io/cucumber/needle/config/LoadResourceBundle.java
    rename to needle/src/main/java/io/cucumber/needle/LoadResourceBundle.java
    index 5dfbcefa82..63c1a62615 100644
    --- a/needle/src/main/java/io/cucumber/needle/config/LoadResourceBundle.java
    +++ b/needle/src/main/java/io/cucumber/needle/LoadResourceBundle.java
    @@ -1,4 +1,4 @@
    -package io.cucumber.needle.config;
    +package io.cucumber.needle;
     
     import org.slf4j.Logger;
     import org.slf4j.LoggerFactory;
    @@ -10,7 +10,7 @@
     /**
      * Null safe Resource Loader. If ResourceBundle does not exist, an empty Bundle is returned.
      */
    -public enum LoadResourceBundle {
    +enum LoadResourceBundle {
         INSTANCE;
     
         public static final ResourceBundle EMPTY_RESOURCE_BUNDLE = new ResourceBundle() {
    diff --git a/needle/src/main/java/io/cucumber/needle/NeedleFactory.java b/needle/src/main/java/io/cucumber/needle/NeedleFactory.java
    index 88e2190613..3d07ad86a4 100644
    --- a/needle/src/main/java/io/cucumber/needle/NeedleFactory.java
    +++ b/needle/src/main/java/io/cucumber/needle/NeedleFactory.java
    @@ -1,9 +1,6 @@
     package io.cucumber.needle;
     
     import cucumber.api.java.ObjectFactory;
    -import io.cucumber.needle.config.CollectInjectionProvidersFromStepsInstance;
    -import io.cucumber.needle.config.CreateInstanceByDefaultConstructor;
    -import io.cucumber.needle.config.CucumberNeedleConfiguration;
     import de.akquinet.jbosscc.needle.NeedleTestcase;
     import de.akquinet.jbosscc.needle.injection.InjectionProvider;
     import org.slf4j.Logger;
    diff --git a/needle/src/main/java/io/cucumber/needle/config/ReadInjectionProviderClassNames.java b/needle/src/main/java/io/cucumber/needle/ReadInjectionProviderClassNames.java
    similarity index 92%
    rename from needle/src/main/java/io/cucumber/needle/config/ReadInjectionProviderClassNames.java
    rename to needle/src/main/java/io/cucumber/needle/ReadInjectionProviderClassNames.java
    index ebfdd0d3a1..07b8137af3 100644
    --- a/needle/src/main/java/io/cucumber/needle/config/ReadInjectionProviderClassNames.java
    +++ b/needle/src/main/java/io/cucumber/needle/ReadInjectionProviderClassNames.java
    @@ -1,4 +1,4 @@
    -package io.cucumber.needle.config;
    +package io.cucumber.needle;
     
     import java.util.LinkedHashSet;
     import java.util.ResourceBundle;
    @@ -7,7 +7,7 @@
     /**
      * Read ClassNames from properties.
      */
    -public enum ReadInjectionProviderClassNames {
    +enum ReadInjectionProviderClassNames {
         /**
          * Singleton Instance
          */
    diff --git a/needle/src/main/java/cucumber/api/needle/InjectionProviderInstancesSupplier.java b/needle/src/main/java/io/cucumber/needle/api/InjectionProviderInstancesSupplier.java
    similarity index 96%
    rename from needle/src/main/java/cucumber/api/needle/InjectionProviderInstancesSupplier.java
    rename to needle/src/main/java/io/cucumber/needle/api/InjectionProviderInstancesSupplier.java
    index 58b2318593..7905d4937f 100644
    --- a/needle/src/main/java/cucumber/api/needle/InjectionProviderInstancesSupplier.java
    +++ b/needle/src/main/java/io/cucumber/needle/api/InjectionProviderInstancesSupplier.java
    @@ -1,4 +1,4 @@
    -package cucumber.api.needle;
    +package io.cucumber.needle.api;
     
     import io.cucumber.needle.NeedleFactory;
     import de.akquinet.jbosscc.needle.NeedleTestcase;
    diff --git a/needle/src/main/java/cucumber/api/needle/NeedleInjectionProvider.java b/needle/src/main/java/io/cucumber/needle/api/NeedleInjectionProvider.java
    similarity index 94%
    rename from needle/src/main/java/cucumber/api/needle/NeedleInjectionProvider.java
    rename to needle/src/main/java/io/cucumber/needle/api/NeedleInjectionProvider.java
    index 2a15534b97..a7de393931 100755
    --- a/needle/src/main/java/cucumber/api/needle/NeedleInjectionProvider.java
    +++ b/needle/src/main/java/io/cucumber/needle/api/NeedleInjectionProvider.java
    @@ -1,4 +1,4 @@
    -package cucumber.api.needle;
    +package io.cucumber.needle.api;
     
     import de.akquinet.jbosscc.needle.injection.InjectionProvider;
     
    diff --git a/needle/src/main/java/cucumber/api/needle/package.html b/needle/src/main/java/io/cucumber/needle/api/package.html
    similarity index 100%
    rename from needle/src/main/java/cucumber/api/needle/package.html
    rename to needle/src/main/java/io/cucumber/needle/api/package.html
    diff --git a/needle/src/test/java/io/cucumber/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java b/needle/src/test/java/io/cucumber/needle/CollectInjectionProvidersFromStepsInstanceTest.java
    similarity index 89%
    rename from needle/src/test/java/io/cucumber/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java
    rename to needle/src/test/java/io/cucumber/needle/CollectInjectionProvidersFromStepsInstanceTest.java
    index 6855ebf838..c64980d9e9 100644
    --- a/needle/src/test/java/io/cucumber/needle/config/CollectInjectionProvidersFromStepsInstanceTest.java
    +++ b/needle/src/test/java/io/cucumber/needle/CollectInjectionProvidersFromStepsInstanceTest.java
    @@ -1,4 +1,4 @@
    -package io.cucumber.needle.config;
    +package io.cucumber.needle;
     
     import static org.hamcrest.CoreMatchers.is;
     import static org.junit.Assert.assertThat;
    @@ -9,11 +9,10 @@
     import javax.inject.Inject;
     import javax.inject.Named;
     
    -import io.cucumber.needle.injection.NamedInjectionProvider;
     import org.junit.Test;
     
    -import cucumber.api.needle.InjectionProviderInstancesSupplier;
    -import cucumber.api.needle.NeedleInjectionProvider;
    +import io.cucumber.needle.api.InjectionProviderInstancesSupplier;
    +import io.cucumber.needle.api.NeedleInjectionProvider;
     import de.akquinet.jbosscc.needle.NeedleTestcase;
     import de.akquinet.jbosscc.needle.annotation.ObjectUnderTest;
     import de.akquinet.jbosscc.needle.injection.InjectionProvider;
    diff --git a/needle/src/test/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructorTest.java b/needle/src/test/java/io/cucumber/needle/CreateInstanceByDefaultConstructorTest.java
    similarity index 96%
    rename from needle/src/test/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructorTest.java
    rename to needle/src/test/java/io/cucumber/needle/CreateInstanceByDefaultConstructorTest.java
    index be3fa56677..e52402733e 100644
    --- a/needle/src/test/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructorTest.java
    +++ b/needle/src/test/java/io/cucumber/needle/CreateInstanceByDefaultConstructorTest.java
    @@ -1,4 +1,4 @@
    -package io.cucumber.needle.config;
    +package io.cucumber.needle;
     
     import static org.junit.Assert.assertNotNull;
     
    diff --git a/needle/src/test/java/io/cucumber/needle/config/CucumberNeedleConfigurationTest.java b/needle/src/test/java/io/cucumber/needle/CucumberNeedleConfigurationTest.java
    similarity index 93%
    rename from needle/src/test/java/io/cucumber/needle/config/CucumberNeedleConfigurationTest.java
    rename to needle/src/test/java/io/cucumber/needle/CucumberNeedleConfigurationTest.java
    index 1e2909baae..b8ab72a943 100644
    --- a/needle/src/test/java/io/cucumber/needle/config/CucumberNeedleConfigurationTest.java
    +++ b/needle/src/test/java/io/cucumber/needle/CucumberNeedleConfigurationTest.java
    @@ -1,4 +1,4 @@
    -package io.cucumber.needle.config;
    +package io.cucumber.needle;
     
     import static org.hamcrest.CoreMatchers.is;
     import static org.junit.Assert.assertFalse;
    @@ -8,7 +8,7 @@
     
     import org.junit.Test;
     
    -import cucumber.api.needle.InjectionProviderInstancesSupplier;
    +import io.cucumber.needle.api.InjectionProviderInstancesSupplier;
     import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider;
     import de.akquinet.jbosscc.needle.injection.InjectionProvider;
     
    diff --git a/needle/src/test/java/io/cucumber/needle/injection/DefaultInstanceInjectionProvider.java b/needle/src/test/java/io/cucumber/needle/DefaultInstanceInjectionProvider.java
    similarity index 97%
    rename from needle/src/test/java/io/cucumber/needle/injection/DefaultInstanceInjectionProvider.java
    rename to needle/src/test/java/io/cucumber/needle/DefaultInstanceInjectionProvider.java
    index 61a199f971..c13d44474e 100755
    --- a/needle/src/test/java/io/cucumber/needle/injection/DefaultInstanceInjectionProvider.java
    +++ b/needle/src/test/java/io/cucumber/needle/DefaultInstanceInjectionProvider.java
    @@ -1,4 +1,4 @@
    -package io.cucumber.needle.injection;
    +package io.cucumber.needle;
     
     import de.akquinet.jbosscc.needle.injection.InjectionProvider;
     import de.akquinet.jbosscc.needle.injection.InjectionTargetInformation;
    diff --git a/needle/src/test/java/io/cucumber/needle/config/LoadCucumberNeedleResourceBundleTest.java b/needle/src/test/java/io/cucumber/needle/LoadCucumberNeedleResourceBundleTest.java
    similarity index 96%
    rename from needle/src/test/java/io/cucumber/needle/config/LoadCucumberNeedleResourceBundleTest.java
    rename to needle/src/test/java/io/cucumber/needle/LoadCucumberNeedleResourceBundleTest.java
    index 4ec5d6868c..261ec158b8 100644
    --- a/needle/src/test/java/io/cucumber/needle/config/LoadCucumberNeedleResourceBundleTest.java
    +++ b/needle/src/test/java/io/cucumber/needle/LoadCucumberNeedleResourceBundleTest.java
    @@ -1,4 +1,4 @@
    -package io.cucumber.needle.config;
    +package io.cucumber.needle;
     
     import static org.hamcrest.CoreMatchers.is;
     import static org.junit.Assert.assertFalse;
    @@ -8,6 +8,7 @@
     
     import java.util.ResourceBundle;
     
    +import io.cucumber.needle.LoadResourceBundle;
     import org.hamcrest.CoreMatchers;
     import org.junit.Test;
     
    diff --git a/needle/src/test/java/io/cucumber/needle/injection/NamedInjectionProvider.java b/needle/src/test/java/io/cucumber/needle/NamedInjectionProvider.java
    similarity index 98%
    rename from needle/src/test/java/io/cucumber/needle/injection/NamedInjectionProvider.java
    rename to needle/src/test/java/io/cucumber/needle/NamedInjectionProvider.java
    index 1142f77862..6217569e59 100755
    --- a/needle/src/test/java/io/cucumber/needle/injection/NamedInjectionProvider.java
    +++ b/needle/src/test/java/io/cucumber/needle/NamedInjectionProvider.java
    @@ -1,4 +1,4 @@
    -package io.cucumber.needle.injection;
    +package io.cucumber.needle;
     
     import javax.inject.Named;
     
    diff --git a/needle/src/test/java/io/cucumber/needle/NeedleFactoryTest.java b/needle/src/test/java/io/cucumber/needle/NeedleFactoryTest.java
    index a6dcd5cbee..b709de9e20 100644
    --- a/needle/src/test/java/io/cucumber/needle/NeedleFactoryTest.java
    +++ b/needle/src/test/java/io/cucumber/needle/NeedleFactoryTest.java
    @@ -6,7 +6,6 @@
     
     import org.junit.Test;
     
    -import io.cucumber.needle.config.CucumberNeedleConfiguration;
     import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider;
     import de.akquinet.jbosscc.needle.injection.InjectionProvider;
     
    diff --git a/needle/src/test/java/io/cucumber/needle/config/ReadInjectionProviderClassNamesTest.java b/needle/src/test/java/io/cucumber/needle/ReadInjectionProviderClassNamesTest.java
    similarity index 92%
    rename from needle/src/test/java/io/cucumber/needle/config/ReadInjectionProviderClassNamesTest.java
    rename to needle/src/test/java/io/cucumber/needle/ReadInjectionProviderClassNamesTest.java
    index b3ce6bbeb6..09541c2844 100644
    --- a/needle/src/test/java/io/cucumber/needle/config/ReadInjectionProviderClassNamesTest.java
    +++ b/needle/src/test/java/io/cucumber/needle/ReadInjectionProviderClassNamesTest.java
    @@ -1,4 +1,4 @@
    -package io.cucumber.needle.config;
    +package io.cucumber.needle;
     
     import static org.hamcrest.CoreMatchers.is;
     import static org.hamcrest.core.IsCollectionContaining.hasItems;
    @@ -8,6 +8,9 @@
     import java.util.ResourceBundle;
     import java.util.Set;
     
    +import io.cucumber.needle.CucumberNeedleConfiguration;
    +import io.cucumber.needle.LoadResourceBundle;
    +import io.cucumber.needle.ReadInjectionProviderClassNames;
     import org.junit.Test;
     
     import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider;
    diff --git a/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java
    index 88146d22f4..b804a0e2ee 100755
    --- a/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java
    +++ b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java
    @@ -10,9 +10,9 @@
     import cucumber.api.java.en.Given;
     import cucumber.api.java.en.Then;
     import cucumber.api.java.en.When;
    -import cucumber.api.needle.InjectionProviderInstancesSupplier;
    -import cucumber.api.needle.NeedleInjectionProvider;
    -import io.cucumber.needle.injection.DefaultInstanceInjectionProvider;
    +import io.cucumber.needle.api.InjectionProviderInstancesSupplier;
    +import io.cucumber.needle.api.NeedleInjectionProvider;
    +import io.cucumber.needle.DefaultInstanceInjectionProvider;
     import io.cucumber.needle.test.atm.AtmService;
     import io.cucumber.needle.test.atm.AtmServiceBean;
     import io.cucumber.needle.test.atm.BicGetter;
    diff --git a/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java b/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java
    index 2d51c1a1c4..f9cf7f5176 100644
    --- a/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java
    +++ b/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java
    @@ -4,8 +4,8 @@
     
     import cucumber.api.java.Before;
     import cucumber.api.java.en.Given;
    -import cucumber.api.needle.NeedleInjectionProvider;
    -import io.cucumber.needle.injection.DefaultInstanceInjectionProvider;
    +import io.cucumber.needle.api.NeedleInjectionProvider;
    +import io.cucumber.needle.DefaultInstanceInjectionProvider;
     import de.akquinet.jbosscc.needle.injection.InjectionProvider;
     
     import javax.inject.Inject;
    diff --git a/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueInjectionProvider.java b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueInjectionProvider.java
    index 09272b1323..ec5d13d6af 100755
    --- a/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueInjectionProvider.java
    +++ b/needle/src/test/java/io/cucumber/needle/test/injectionprovider/ValueInjectionProvider.java
    @@ -1,6 +1,6 @@
     package io.cucumber.needle.test.injectionprovider;
     
    -import io.cucumber.needle.injection.DefaultInstanceInjectionProvider;
    +import io.cucumber.needle.DefaultInstanceInjectionProvider;
     
     /**
      * Returns a value provider returning the value given in constructor.
    
    From 7b13d824e70ad203bf97c1e62d6566c455f48c7f Mon Sep 17 00:00:00 2001
    From: "M.P. Korstanje" 
    Date: Mon, 10 Sep 2018 22:30:45 +0200
    Subject: [PATCH 039/155] [Needle] Move spring api packages to
     io.cucumber.spring.api
    
    ---
     pom.xml                                       |   2 +-
     .../io/cucumber/spring/FixBootstrapUtils.java | 131 ++++++++++++++++++
     .../io/cucumber/spring/SpringFactory.java     |  55 ++++----
     .../spring/api}/SpringTransactionHooks.java   |   2 +-
     .../cucumber/spring/api}/package.html         |   0
     .../test/context/FixBootstrapUtils.java       |  25 ----
     .../hooks/SpringTransactionHooksTest.java     |   2 +-
     7 files changed, 162 insertions(+), 55 deletions(-)
     create mode 100644 spring/src/main/java/io/cucumber/spring/FixBootstrapUtils.java
     rename spring/src/main/java/{cucumber/api/spring => io/cucumber/spring/api}/SpringTransactionHooks.java (99%)
     rename spring/src/main/java/{cucumber/api/spring => io/cucumber/spring/api}/package.html (100%)
     delete mode 100644 spring/src/main/java/org/springframework/test/context/FixBootstrapUtils.java
    
    diff --git a/pom.xml b/pom.xml
    index bf4ebc94b0..c42377adda 100644
    --- a/pom.xml
    +++ b/pom.xml
    @@ -42,7 +42,7 @@
             5.1.0
             2.4.15
             2.15
    -        4.3.10.RELEASE
    +        4.3.18.RELEASE
             1.11.6.RELEASE
             
             5.1.1.Final
    diff --git a/spring/src/main/java/io/cucumber/spring/FixBootstrapUtils.java b/spring/src/main/java/io/cucumber/spring/FixBootstrapUtils.java
    new file mode 100644
    index 0000000000..2573d246fe
    --- /dev/null
    +++ b/spring/src/main/java/io/cucumber/spring/FixBootstrapUtils.java
    @@ -0,0 +1,131 @@
    +/*
    + * Copyright 2002-2016 the original author or authors.
    + *
    + * Licensed under the Apache License, Version 2.0 (the "License");
    + * you may not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + *      http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + */
    +
    +package io.cucumber.spring;
    +
    +import java.util.Set;
    +
    +import org.springframework.beans.BeanUtils;
    +import org.springframework.core.annotation.AnnotatedElementUtils;
    +import org.springframework.core.annotation.AnnotationAttributes;
    +import org.springframework.test.context.BootstrapContext;
    +import org.springframework.test.context.BootstrapWith;
    +import org.springframework.test.context.CacheAwareContextLoaderDelegate;
    +import org.springframework.test.context.TestContextBootstrapper;
    +import org.springframework.test.context.cache.ContextCache;
    +import org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate;
    +import org.springframework.test.context.cache.DefaultContextCache;
    +import org.springframework.test.context.support.DefaultBootstrapContext;
    +import org.springframework.util.ClassUtils;
    +
    +/**
    + * {@code BootstrapUtils} is a collection of utility methods to assist with
    + * bootstrapping the Spring TestContext Framework.
    + *
    + * @author Sam Brannen
    + * @author Phillip Webb
    + * @since 4.1
    + * @see BootstrapWith
    + * @see BootstrapContext
    + * @see TestContextBootstrapper
    + */
    +abstract class FixBootstrapUtils {
    +
    +    private static ThreadLocal contextCache = new ThreadLocal(){
    +        @Override
    +        protected ContextCache initialValue() {
    +            return new DefaultContextCache();
    +        }
    +    };
    +
    +    private static final String DEFAULT_TEST_CONTEXT_BOOTSTRAPPER_CLASS_NAME =
    +			"org.springframework.test.context.support.DefaultTestContextBootstrapper";
    +
    +	private static final String DEFAULT_WEB_TEST_CONTEXT_BOOTSTRAPPER_CLASS_NAME =
    +			"org.springframework.test.context.web.WebTestContextBootstrapper";
    +
    +	private static final String WEB_APP_CONFIGURATION_ANNOTATION_CLASS_NAME =
    +			"org.springframework.test.context.web.WebAppConfiguration";
    +
    +    static BootstrapContext createBootstrapContext(Class testClass) {
    +        CacheAwareContextLoaderDelegate contextLoader = new DefaultCacheAwareContextLoaderDelegate(contextCache.get());
    +        return new DefaultBootstrapContext(testClass, contextLoader);
    +    }
    +
    +    /**
    +	 * Resolve the {@link TestContextBootstrapper} type for the test class in the
    +	 * supplied {@link BootstrapContext}, instantiate it, and provide it a reference
    +	 * to the {@link BootstrapContext}.
    +	 * 

    If the {@link BootstrapWith @BootstrapWith} annotation is present on + * the test class, either directly or as a meta-annotation, then its + * {@link BootstrapWith#value value} will be used as the bootstrapper type. + * Otherwise, either the + * {@link org.springframework.test.context.support.DefaultTestContextBootstrapper + * DefaultTestContextBootstrapper} or the + * {@link org.springframework.test.context.web.WebTestContextBootstrapper + * WebTestContextBootstrapper} will be used, depending on the presence of + * {@link org.springframework.test.context.web.WebAppConfiguration @WebAppConfiguration}. + * @param bootstrapContext the bootstrap context to use + * @return a fully configured {@code TestContextBootstrapper} + */ + static TestContextBootstrapper resolveTestContextBootstrapper(BootstrapContext bootstrapContext) { + Class testClass = bootstrapContext.getTestClass(); + + Class clazz = null; + try { + clazz = resolveExplicitTestContextBootstrapper(testClass); + if (clazz == null) { + clazz = resolveDefaultTestContextBootstrapper(testClass); + } + TestContextBootstrapper testContextBootstrapper = + BeanUtils.instantiateClass(clazz, TestContextBootstrapper.class); + testContextBootstrapper.setBootstrapContext(bootstrapContext); + return testContextBootstrapper; + } + catch (IllegalStateException ex) { + throw ex; + } + catch (Throwable ex) { + throw new IllegalStateException("Could not load TestContextBootstrapper [" + clazz + + "]. Specify @BootstrapWith's 'value' attribute or make the default bootstrapper class available.", + ex); + } + } + + private static Class resolveExplicitTestContextBootstrapper(Class testClass) { + Set annotations = AnnotatedElementUtils.findAllMergedAnnotations(testClass, BootstrapWith.class); + if (annotations.size() < 1) { + return null; + } + if (annotations.size() > 1) { + throw new IllegalStateException(String.format( + "Configuration error: found multiple declarations of @BootstrapWith for test class [%s]: %s", + testClass.getName(), annotations)); + } + return annotations.iterator().next().value(); + } + + private static Class resolveDefaultTestContextBootstrapper(Class testClass) throws Exception { + ClassLoader classLoader = FixBootstrapUtils.class.getClassLoader(); + AnnotationAttributes attributes = AnnotatedElementUtils.findMergedAnnotationAttributes(testClass, + WEB_APP_CONFIGURATION_ANNOTATION_CLASS_NAME, false, false); + if (attributes != null) { + return ClassUtils.forName(DEFAULT_WEB_TEST_CONTEXT_BOOTSTRAPPER_CLASS_NAME, classLoader); + } + return ClassUtils.forName(DEFAULT_TEST_CONTEXT_BOOTSTRAPPER_CLASS_NAME, classLoader); + } + +} diff --git a/spring/src/main/java/io/cucumber/spring/SpringFactory.java b/spring/src/main/java/io/cucumber/spring/SpringFactory.java index 8466867f3f..ef4d50bd6d 100644 --- a/spring/src/main/java/io/cucumber/spring/SpringFactory.java +++ b/spring/src/main/java/io/cucumber/spring/SpringFactory.java @@ -1,9 +1,5 @@ package io.cucumber.spring; -import static java.util.Arrays.asList; -import static org.springframework.test.context.FixBootstrapUtils.createBootstrapContext; -import static org.springframework.test.context.FixBootstrapUtils.resolveTestContextBootstrapper; - import cucumber.api.java.ObjectFactory; import io.cucumber.core.exception.CucumberException; import org.springframework.beans.BeansException; @@ -27,6 +23,10 @@ import java.util.Set; import java.util.Stack; +import static io.cucumber.spring.FixBootstrapUtils.createBootstrapContext; +import static io.cucumber.spring.FixBootstrapUtils.resolveTestContextBootstrapper; +import static java.util.Arrays.asList; + /** * Spring based implementation of ObjectFactory. *

    @@ -182,9 +182,9 @@ private boolean isNewContextCreated() { private void registerStepClassBeanDefinition(ConfigurableListableBeanFactory beanFactory, Class stepClass) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; BeanDefinition beanDefinition = BeanDefinitionBuilder - .genericBeanDefinition(stepClass) - .setScope(GlueCodeScope.NAME) - .getBeanDefinition(); + .genericBeanDefinition(stepClass) + .setScope(GlueCodeScope.NAME) + .getBeanDefinition(); registry.registerBeanDefinition(stepClass.getName(), beanDefinition); } @@ -215,7 +215,7 @@ public T getInstance(final Class type) { private static boolean dependsOnSpringContext(Class type) { for (Annotation annotation : type.getAnnotations()) { - if(annotatedWithSupportedSpringRootTestAnnotations(annotation)){ + if (annotatedWithSupportedSpringRootTestAnnotations(annotation)) { return true; } } @@ -228,29 +228,30 @@ private static boolean annotatedWithSupportedSpringRootTestAnnotations(Annotatio ContextHierarchy.class, BootstrapWith.class)); } -} -class CucumberTestContextManager extends TestContextManager { - CucumberTestContextManager(Class testClass) { - // Does the same as TestContextManager(Class) but creates a - // DefaultCacheAwareContextLoaderDelegate that uses a thread local contextCache. - super(resolveTestContextBootstrapper(createBootstrapContext(testClass))); - registerGlueCodeScope(getContext()); - } + static class CucumberTestContextManager extends TestContextManager { - ConfigurableListableBeanFactory getBeanFactory() { - return getContext().getBeanFactory(); - } + CucumberTestContextManager(Class testClass) { + // Does the same as TestContextManager(Class) but creates a + // DefaultCacheAwareContextLoaderDelegate that uses a thread local contextCache. + super(resolveTestContextBootstrapper(createBootstrapContext(testClass))); + registerGlueCodeScope(getContext()); + } - private ConfigurableApplicationContext getContext() { - return (ConfigurableApplicationContext)getTestContext().getApplicationContext(); - } + ConfigurableListableBeanFactory getBeanFactory() { + return getContext().getBeanFactory(); + } - private void registerGlueCodeScope(ConfigurableApplicationContext context) { - do { - context.getBeanFactory().registerScope(GlueCodeScope.NAME, new GlueCodeScope()); - context = (ConfigurableApplicationContext)context.getParent(); - } while (context != null); + private ConfigurableApplicationContext getContext() { + return (ConfigurableApplicationContext) getTestContext().getApplicationContext(); + } + + private void registerGlueCodeScope(ConfigurableApplicationContext context) { + do { + context.getBeanFactory().registerScope(GlueCodeScope.NAME, new GlueCodeScope()); + context = (ConfigurableApplicationContext) context.getParent(); + } while (context != null); + } } } diff --git a/spring/src/main/java/cucumber/api/spring/SpringTransactionHooks.java b/spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java similarity index 99% rename from spring/src/main/java/cucumber/api/spring/SpringTransactionHooks.java rename to spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java index 8c258867b7..aab9c0acdc 100644 --- a/spring/src/main/java/cucumber/api/spring/SpringTransactionHooks.java +++ b/spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java @@ -1,4 +1,4 @@ -package cucumber.api.spring; +package io.cucumber.spring.api; import cucumber.api.java.After; import cucumber.api.java.Before; diff --git a/spring/src/main/java/cucumber/api/spring/package.html b/spring/src/main/java/io/cucumber/spring/api/package.html similarity index 100% rename from spring/src/main/java/cucumber/api/spring/package.html rename to spring/src/main/java/io/cucumber/spring/api/package.html diff --git a/spring/src/main/java/org/springframework/test/context/FixBootstrapUtils.java b/spring/src/main/java/org/springframework/test/context/FixBootstrapUtils.java deleted file mode 100644 index c8e6f29807..0000000000 --- a/spring/src/main/java/org/springframework/test/context/FixBootstrapUtils.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.springframework.test.context; - -import org.springframework.test.context.cache.ContextCache; -import org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate; -import org.springframework.test.context.cache.DefaultContextCache; -import org.springframework.test.context.support.DefaultBootstrapContext; - -public class FixBootstrapUtils extends BootstrapUtils { - - private static ThreadLocal contextCache = new ThreadLocal(){ - @Override - protected ContextCache initialValue() { - return new DefaultContextCache(); - } - }; - - public static BootstrapContext createBootstrapContext(Class testClass) { - CacheAwareContextLoaderDelegate contextLoader = new DefaultCacheAwareContextLoaderDelegate(contextCache.get()); - return new DefaultBootstrapContext(testClass, contextLoader); - } - - public static TestContextBootstrapper resolveTestContextBootstrapper(BootstrapContext bootstrapContext) { - return BootstrapUtils.resolveTestContextBootstrapper(bootstrapContext); - } -} diff --git a/spring/src/test/java/io/cucumber/spring/hooks/SpringTransactionHooksTest.java b/spring/src/test/java/io/cucumber/spring/hooks/SpringTransactionHooksTest.java index 4d5f50b078..108ccbe4ea 100644 --- a/spring/src/test/java/io/cucumber/spring/hooks/SpringTransactionHooksTest.java +++ b/spring/src/test/java/io/cucumber/spring/hooks/SpringTransactionHooksTest.java @@ -1,6 +1,6 @@ package io.cucumber.spring.hooks; -import cucumber.api.spring.SpringTransactionHooks; +import io.cucumber.spring.api.SpringTransactionHooks; import org.junit.Before; import org.junit.Rule; import org.junit.Test; From f9f7c484deb7b478d93a82bb1f67551b6ff837ea Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Thu, 13 Sep 2018 22:23:17 +0200 Subject: [PATCH 040/155] [Java] Move java and java8 api packages to io.cucumber.java.api - Merges lambda and annotation based step definitions --- .../java/calculator/DateStepdefs.java | 6 +- .../calculator/RpnCalculatorStepdefs.java | 10 +- .../java/calculator/ShoppingStepdefs.java | 6 +- .../java/calculator/DateStepdefs.java | 6 +- .../calculator/RpnCalculatorStepdefs.java | 10 +- .../java/calculator/ShoppingStepdefs.java | 6 +- .../java/wicket/steps/RentStepdefs.java | 6 +- examples/java8-calculator/pom.xml | 2 +- .../calculator/RpnCalculatorStepdefs.java | 2 +- .../java/calculator/ShoppingStepdefs.java | 2 +- .../txn/CucumberContextConfiguration.java | 2 +- .../examples/spring/txn/RunCukesTest.java | 2 +- .../spring/txn/SeeMessagesStepdefs.java | 6 +- .../examples/spring/txn/UserStepdefs.java | 2 +- .../io/cucumber/guice/impl/GuiceFactory.java | 4 +- .../cucumber/guice/impl/GuiceFactoryTest.java | 2 +- .../guice/integration/HelloWorldSteps.java | 2 +- .../integration/ScenarioScopedSteps.java | 6 +- .../integration/SingletonScopedSteps.java | 6 +- .../guice/integration/UnScopedSteps.java | 6 +- .../guice/integration/UnusedGlue.java | 4 +- java/pom.xml | 71 +--------- .../annotation.java.gsp} | 2 +- .../main/groovy/generate-annotations.groovy | 62 +++++++++ .../main/groovy/generate-interfaces.groovy | 21 +++ .../src/main/groovy/lambda.java.gsp | 26 ++-- .../java/DefaultJavaObjectFactory.java | 2 +- .../java8 => io/cucumber/java}/GlueBase.java | 2 +- .../cucumber/java}/Java8HookDefinition.java | 6 +- .../java/io/cucumber/java/Java8Snippet.java | 2 +- .../cucumber/java}/Java8StepDefinition.java | 38 +++++- .../java/io/cucumber/java/JavaBackend.java | 55 ++++---- .../io/cucumber/java/JavaHookDefinition.java | 4 +- .../java/io/cucumber/java/JavaSnippet.java | 2 +- .../io/cucumber/java/JavaStepDefinition.java | 49 ++++++- .../io/cucumber/java}/LambdaGlueBase.java | 8 +- .../java/io/cucumber/java/MethodScanner.java | 14 +- .../io/cucumber/java/ObjectFactoryLoader.java | 6 +- .../java/io/cucumber/java/ParameterInfo.java | 52 -------- .../java/io/cucumber/java/StaticGlue.java | 57 -------- .../java => io/cucumber/java/api}/After.java | 2 +- .../cucumber/java/api}/AfterStep.java | 2 +- .../java => io/cucumber/java/api}/Before.java | 2 +- .../cucumber/java/api}/BeforeStep.java | 2 +- .../java/io/cucumber/java/api}/HookBody.java | 2 +- .../io/cucumber/java/api}/HookNoArgsBody.java | 2 +- .../cucumber/java/api}/ObjectFactory.java | 2 +- .../cucumber/java/api}/PendingException.java | 2 +- .../io/cucumber/java/api}/StepdefBody.java | 2 +- .../cucumber/java/api}/Transpose.java | 2 +- ...Java8AnonInnerClassStepDefinitionTest.java | 5 +- ...efinitionMarksCorrectStackElementTest.java | 15 ++- .../java}/Java8LambdaStepDefinitionTest.java | 4 +- .../io/cucumber/java/Java8SnippetTest.java | 19 +-- .../io/cucumber/java/JavaBackendTest.java | 2 +- .../java/io/cucumber/java/JavaHookTest.java | 8 +- .../cucumber/java/JavaObjectFactoryTest.java | 2 +- .../io/cucumber/java/JavaSnippetTest.java | 48 +++---- .../cucumber/java/JavaStepDefinitionTest.java | 4 +- .../java/JavaStepDefinitionTransposeTest.java | 4 +- .../io/cucumber/java/MethodScannerTest.java | 4 +- .../io/cucumber/java/SingletonFactory.java | 2 +- .../java/io/cucumber/java/StringJoiner.java | 18 --- .../java/{test => annotation}/Authors.java | 6 +- .../java/annotation}/RunCukesTest.java | 2 +- .../ScenarioStepDefs.java | 10 +- .../java/{test => annotation}/Stepdefs.java | 4 +- .../SubstitutionStepdefs.java | 8 +- .../TypeRegistryConfiguration.java | 4 +- .../java/{test => annotation}/UnusedGlue.java | 6 +- .../java/lambda}/AnonInnerClassStepdefs.java | 10 +- .../cucumber/java/lambda}/LambdaStepdefs.java | 6 +- .../java/{test => lambda}/RunCukesTest.java | 2 +- .../lambda}/TypeRegistryConfiguration.java | 9 +- .../io/cucumber/java/stepdefs/Stepdefs.java | 2 +- .../java/{test => annotation}/authors.feature | 0 .../java/{test => annotation}/cukes.feature | 0 .../french-iso-8859-1-cukes.feature | 0 .../{test => annotation}/scenario.feature | 0 .../scenario_outline_substitution.feature | 0 .../table_conversion.feature | 0 .../anon-inner-class-step-definitions.feature | 0 .../lambda}/lambda-step-definitions.feature | 0 java8/pom.xml | 123 ------------------ .../java/io/cucumber/java8/ParameterInfo.java | 37 ------ .../io/cucumber/java8/SomeLambdaStepDefs.java | 13 -- kotlin-java8/pom.xml | 2 +- .../io/cucumber/kotlin/LambdaStepdefs.kt | 4 +- .../kotlin/TypeRegistryConfiguration.kt | 1 + .../io/cucumber/needle/NeedleFactory.java | 2 +- .../needle/test/AtmWithdrawalGlue.java | 2 +- .../needle/test/AtmWithdrawalSteps.java | 8 +- .../io/cucumber/needle/test/MoreSteps.java | 4 +- .../openejb/OpenEJBObjectFactory.java | 2 +- .../io/cucumber/openejb/BellyStepdefs.java | 4 +- .../openejb/OpenEJBObjectFactoryTest.java | 2 +- .../java/io/cucumber/openejb/UnusedGlue.java | 4 +- .../cucumber/picocontainer/PicoFactory.java | 2 +- .../picocontainer/PicoFactoryTest.java | 2 +- .../io/cucumber/picocontainer/StepDefs.java | 10 +- .../io/cucumber/picocontainer/UnusedGlue.java | 4 +- pom.xml | 12 +- .../io/cucumber/spring/SpringFactory.java | 2 +- .../spring/api/SpringTransactionHooks.java | 4 +- .../io/cucumber/spring/SpringFactoryTest.java | 2 +- .../spring/commonglue/AnotherStepDef.java | 2 +- .../spring/commonglue/OneStepDef.java | 4 +- .../spring/commonglue/ThirdStepDef.java | 2 +- .../commonglue/TransactionStepDefs.java | 8 +- .../spring/commonglue/UnusedGlue.java | 4 +- .../spring/contextconfig/BellyStepdefs.java | 2 +- .../DirtiesContextBellyStepDefs.java | 4 +- .../DirtiesContextBellyMetaStepDefs.java | 4 +- .../metaconfig/general/BellyMetaStepdefs.java | 2 +- .../spring/threading/ThreadingStepDefs.java | 6 +- .../webappconfig/SpringInjectionStepDefs.java | 6 +- .../java/io/cucumber/weld/WeldFactory.java | 2 +- .../java/io/cucumber/weld/BellyStepdefs.java | 4 +- .../java/io/cucumber/weld/UnusedGlue.java | 4 +- .../io/cucumber/weld/WeldFactoryTest.java | 2 +- 120 files changed, 452 insertions(+), 651 deletions(-) rename java/src/main/{code_generator/I18n.java.txt => groovy/annotation.java.gsp} (96%) create mode 100644 java/src/main/groovy/generate-annotations.groovy create mode 100644 java/src/main/groovy/generate-interfaces.groovy rename java8/src/main/code_generator/I18n.java8.txt => java/src/main/groovy/lambda.java.gsp (85%) rename java/src/main/java/{cucumber/api/java8 => io/cucumber/java}/GlueBase.java (52%) rename {java8/src/main/java/io/cucumber/java8 => java/src/main/java/io/cucumber/java}/Java8HookDefinition.java (95%) rename {java8/src/main/java/io/cucumber/java8 => java/src/main/java/io/cucumber/java}/Java8StepDefinition.java (85%) rename {java8/src/main/java/io/cucumber/java8 => java/src/main/java/io/cucumber/java}/LambdaGlueBase.java (98%) delete mode 100644 java/src/main/java/io/cucumber/java/ParameterInfo.java delete mode 100644 java/src/main/java/io/cucumber/java/StaticGlue.java rename java/src/main/java/{cucumber/api/java => io/cucumber/java/api}/After.java (95%) rename java/src/main/java/{cucumber/api/java => io/cucumber/java/api}/AfterStep.java (95%) rename java/src/main/java/{cucumber/api/java => io/cucumber/java/api}/Before.java (95%) rename java/src/main/java/{cucumber/api/java => io/cucumber/java/api}/BeforeStep.java (95%) rename {java8/src/main/java/cucumber/api/java8 => java/src/main/java/io/cucumber/java/api}/HookBody.java (80%) rename {java8/src/main/java/cucumber/api/java8 => java/src/main/java/io/cucumber/java/api}/HookNoArgsBody.java (70%) rename java/src/main/java/{cucumber/api/java => io/cucumber/java/api}/ObjectFactory.java (97%) rename java/src/main/java/{cucumber/api/java => io/cucumber/java/api}/PendingException.java (92%) rename {java8/src/main/java/cucumber/api/java8 => java/src/main/java/io/cucumber/java/api}/StepdefBody.java (98%) rename java/src/main/java/{cucumber/api/java => io/cucumber/java/api}/Transpose.java (97%) rename {java8/src/test/java/io/cucumber/java8 => java/src/test/java/io/cucumber/java}/Java8AnonInnerClassStepDefinitionTest.java (94%) rename {java8/src/test/java/io/cucumber/java8 => java/src/test/java/io/cucumber/java}/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java (89%) rename {java8/src/test/java/io/cucumber/java8 => java/src/test/java/io/cucumber/java}/Java8LambdaStepDefinitionTest.java (96%) delete mode 100644 java/src/test/java/io/cucumber/java/StringJoiner.java rename java/src/test/java/io/cucumber/java/{test => annotation}/Authors.java (94%) rename {java8/src/test/java/io/cucumber/java8/test => java/src/test/java/io/cucumber/java/annotation}/RunCukesTest.java (77%) rename java/src/test/java/io/cucumber/java/{test => annotation}/ScenarioStepDefs.java (74%) rename java/src/test/java/io/cucumber/java/{test => annotation}/Stepdefs.java (80%) rename java/src/test/java/io/cucumber/java/{test => annotation}/SubstitutionStepdefs.java (86%) rename java/src/test/java/io/cucumber/java/{test => annotation}/TypeRegistryConfiguration.java (96%) rename java/src/test/java/io/cucumber/java/{test => annotation}/UnusedGlue.java (71%) rename {java8/src/test/java/io/cucumber/java8/test => java/src/test/java/io/cucumber/java/lambda}/AnonInnerClassStepdefs.java (87%) rename {java8/src/test/java/io/cucumber/java8/test => java/src/test/java/io/cucumber/java/lambda}/LambdaStepdefs.java (95%) rename java/src/test/java/io/cucumber/java/{test => lambda}/RunCukesTest.java (79%) rename {java8/src/test/java/io/cucumber/java8/test => java/src/test/java/io/cucumber/java/lambda}/TypeRegistryConfiguration.java (81%) rename java/src/test/resources/io/cucumber/java/{test => annotation}/authors.feature (100%) rename java/src/test/resources/io/cucumber/java/{test => annotation}/cukes.feature (100%) rename java/src/test/resources/io/cucumber/java/{test => annotation}/french-iso-8859-1-cukes.feature (100%) rename java/src/test/resources/io/cucumber/java/{test => annotation}/scenario.feature (100%) rename java/src/test/resources/io/cucumber/java/{test => annotation}/scenario_outline_substitution.feature (100%) rename java/src/test/resources/io/cucumber/java/{test => annotation}/table_conversion.feature (100%) rename {java8/src/test/resources/io/cucumber/java8/test => java/src/test/resources/io/cucumber/java/lambda}/anon-inner-class-step-definitions.feature (100%) rename {java8/src/test/resources/io/cucumber/java8/test => java/src/test/resources/io/cucumber/java/lambda}/lambda-step-definitions.feature (100%) delete mode 100644 java8/pom.xml delete mode 100644 java8/src/main/java/io/cucumber/java8/ParameterInfo.java delete mode 100644 java8/src/test/java/io/cucumber/java8/SomeLambdaStepDefs.java diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java index 41a8efe958..5bbdff7b0a 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import java.util.Date; diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index be986911d1..d5102a2a4f 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,11 +1,11 @@ package io.cucumber.examples.java.calculator; import io.cucumber.core.api.Scenario; -import cucumber.api.java.After; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.After; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import java.util.List; diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index e0045ffb58..9ec273a3f0 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import java.util.List; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java index 50b230be0a..957038df05 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import java.util.Date; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index c64686efb6..3c8fb888aa 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,11 +1,11 @@ package io.cucumber.examples.java.calculator; import io.cucumber.core.api.Scenario; -import cucumber.api.java.After; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.After; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import java.util.List; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index 917e3101f9..6cf518fcc6 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.calculator; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import java.util.List; diff --git a/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java index 2c7205e81f..fe214ba475 100644 --- a/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java +++ b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.wicket.steps; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; diff --git a/examples/java8-calculator/pom.xml b/examples/java8-calculator/pom.xml index 50083f5bc4..6ccf834c4b 100644 --- a/examples/java8-calculator/pom.xml +++ b/examples/java8-calculator/pom.xml @@ -14,7 +14,7 @@ io.cucumber - cucumber-java8 + cucumber-java test diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index ec395c3175..c8a33130fd 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.Scenario; import io.cucumber.datatable.DataTable; -import cucumber.api.java8.En; +import io.cucumber.java.api.lambda.En; import java.util.List; diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index 3ee4fde537..9cf308b04c 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,7 +1,7 @@ package io.cucumber.examples.java.calculator; import io.cucumber.datatable.DataTable; -import cucumber.api.java8.En; +import io.cucumber.java.api.lambda.En; import java.util.List; diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java index 7bb030872d..d8df01a925 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java @@ -1,6 +1,6 @@ package io.cucumber.examples.spring.txn; -import cucumber.api.java.Before; +import io.cucumber.java.api.Before; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java index e9e44d8f74..426c411e32 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCukesTest.java @@ -5,6 +5,6 @@ import org.junit.runner.RunWith; @RunWith(Cucumber.class) -@CucumberOptions(extraGlue = {"cucumber.api.spring"}) +@CucumberOptions(extraGlue = {"io.cucumber.spring.api"}) public class RunCukesTest { } diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java index 7a255cf23a..ca4a587efe 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.spring.txn; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java index e0f55c29b2..910efac2f5 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.examples.spring.txn; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.annotation.en.Given; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.support.TransactionSynchronizationManager; diff --git a/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java b/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java index ccf963db0b..e39b9c740b 100644 --- a/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java +++ b/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java @@ -1,12 +1,12 @@ package io.cucumber.guice.impl; import com.google.inject.Injector; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import io.cucumber.core.options.Env; import io.cucumber.guice.api.ScenarioScope; /** - * Guice implementation of the cucumber.api.java.ObjectFactory. + * Guice implementation of the io.cucumber.java.api.ObjectFactory. */ public class GuiceFactory implements ObjectFactory { diff --git a/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java index d9f405375a..fc5893aee5 100644 --- a/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java +++ b/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java @@ -6,7 +6,7 @@ import com.google.inject.Module; import com.google.inject.Scopes; import com.google.inject.Stage; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import io.cucumber.guice.api.CucumberModules; import io.cucumber.guice.api.CucumberScopes; import io.cucumber.guice.api.ScenarioScoped; diff --git a/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java index 16e3e51873..f701306bb5 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java @@ -1,6 +1,6 @@ package io.cucumber.guice.integration; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.annotation.en.Given; import io.cucumber.guice.api.ScenarioScoped; @ScenarioScoped diff --git a/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java index 6035039919..062e3e8e05 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java @@ -1,8 +1,8 @@ package io.cucumber.guice.integration; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import io.cucumber.guice.api.ScenarioScoped; import javax.inject.Inject; diff --git a/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java index c03a281388..4329fb1303 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java @@ -1,8 +1,8 @@ package io.cucumber.guice.integration; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import io.cucumber.guice.api.ScenarioScoped; import javax.inject.Inject; diff --git a/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java index 8c5f087d33..bf7fc358e3 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java @@ -1,8 +1,8 @@ package io.cucumber.guice.integration; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import javax.inject.Inject; import javax.inject.Provider; diff --git a/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java b/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java index a75dcb5e07..d58052a783 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java +++ b/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.guice.integration; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; public class UnusedGlue { public UnusedGlue() { diff --git a/java/pom.xml b/java/pom.xml index 446292b7c1..7162e030eb 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -16,6 +16,10 @@ io.cucumber cucumber-core + + net.jodah + typetools + io.cucumber @@ -49,71 +53,8 @@ - - -

    - \${locale.getDisplayLanguage()} -

    - -""" - -def unsupported = ["em"] // The generated files for Emoij do not compile. -def dialectProvider = new GherkinDialectProvider() - -GherkinDialectProvider.DIALECTS.keySet().each { language -> - def dialect = dialectProvider.getDialect(language, null) - def normalized_language = dialect.language.replaceAll("[\\s-]", "_").toLowerCase() - if (!unsupported.contains(normalized_language)) { - dialect.stepKeywords.findAll { !it.contains('*') && !it.matches("^\\d.*") }.unique().each { kw -> - def normalized_kw = normalize(kw.replaceAll("[\\s',!\u00AD]", "")) - def binding = ["lang":normalized_language, "kw":normalized_kw] - def template = engine.createTemplate(templateSource).make(binding) - def file = new File(project.baseDir, "target${File.separator}generated-sources${File.separator}i18n${File.separator}java${File.separator}cucumber${File.separator}api${File.separator}java${File.separator}${normalized_language}${File.separator}${normalized_kw}.java") - if(!file.exists()) { - // Haitian has two translations that only differ by case - Sipozeke and SipozeKe - // Some file systems are unable to distiguish between them and overwrite the other one :-( - file.parentFile.mkdirs() - file.write(template.toString(), "UTF-8") - } - } - - // html - def locale = localeFor(dialect.language) - def binding = ["locale":locale] - def html = engine.createTemplate(package_html).make(binding).toString() - def file = new File(project.baseDir, "target${File.separator}generated-sources${File.separator}i18n${File.separator}java${File.separator}cucumber${File.separator}api${File.separator}java${File.separator}${normalized_language}${File.separator}package.html") - file.write(html, "UTF-8") - } -} - ]]> - + + diff --git a/java/src/main/code_generator/I18n.java.txt b/java/src/main/groovy/annotation.java.gsp similarity index 96% rename from java/src/main/code_generator/I18n.java.txt rename to java/src/main/groovy/annotation.java.gsp index 6788b4a3fa..4221b4b778 100644 --- a/java/src/main/code_generator/I18n.java.txt +++ b/java/src/main/groovy/annotation.java.gsp @@ -1,4 +1,4 @@ -package cucumber.api.java.${lang}; +package io.cucumber.java.api.annotation.${lang}; import io.cucumber.java.StepDefAnnotation; diff --git a/java/src/main/groovy/generate-annotations.groovy b/java/src/main/groovy/generate-annotations.groovy new file mode 100644 index 0000000000..bc3b681656 --- /dev/null +++ b/java/src/main/groovy/generate-annotations.groovy @@ -0,0 +1,62 @@ +import gherkin.GherkinDialectProvider +import groovy.text.SimpleTemplateEngine + +import java.text.Normalizer + +SimpleTemplateEngine engine = new SimpleTemplateEngine() +def templateSource = new File(project.baseDir, "src/main/groovy/annotation.java.gsp").getText() + +static def normalize(s) { + if (System.getProperty("java.version").startsWith("1.6")) { + return s + } else { + return Normalizer.normalize(s, Normalizer.Form.NFC) + } +} + +def localeFor(lang) { + languageAndCountry = lang.split("-") + if (languageAndCountry.length == 1) { + return new Locale(lang) + } else { + return new Locale(languageAndCountry[0], languageAndCountry[1]) + } +} + +// TODO: Need to add i18n.getName() and i18n.getNative() for better names. +def package_html = """\ + +

    + \${locale.getDisplayLanguage()} +

    + +""" + +def unsupported = ["em"] // The generated files for Emoij do not compile. +def dialectProvider = new GherkinDialectProvider() + +GherkinDialectProvider.DIALECTS.keySet().each { language -> + def dialect = dialectProvider.getDialect(language, null) + def normalized_language = dialect.language.replaceAll("[\\s-]", "_").toLowerCase() + if (!unsupported.contains(normalized_language)) { + dialect.stepKeywords.findAll { !it.contains('*') && !it.matches("^\\d.*") }.unique().each { kw -> + def normalized_kw = normalize(kw.replaceAll("[\\s',!\u00AD]", "")) + def binding = ["lang": normalized_language, "kw": normalized_kw] + def template = engine.createTemplate(templateSource).make(binding) + def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/annotation/${normalized_language}/${normalized_kw}.java") + if (!file.exists()) { + // Haitian has two translations that only differ by case - Sipozeke and SipozeKe + // Some file systems are unable to distiguish between them and overwrite the other one :-( + file.parentFile.mkdirs() + file.write(template.toString(), "UTF-8") + } + } + + // html + def locale = localeFor(dialect.language) + def binding = ["locale": locale] + def html = engine.createTemplate(package_html).make(binding).toString() + def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/annotation/${normalized_language}/package.html") + file.write(html, "UTF-8") + } +} \ No newline at end of file diff --git a/java/src/main/groovy/generate-interfaces.groovy b/java/src/main/groovy/generate-interfaces.groovy new file mode 100644 index 0000000000..aab28c284e --- /dev/null +++ b/java/src/main/groovy/generate-interfaces.groovy @@ -0,0 +1,21 @@ +import gherkin.GherkinDialectProvider +import groovy.text.SimpleTemplateEngine + +SimpleTemplateEngine engine = new SimpleTemplateEngine() + +def unsupported = ["em"] // The generated files for Emoij do not compile. +def dialectProvider = new GherkinDialectProvider() + +GherkinDialectProvider.DIALECTS.keySet().each { language -> + def dialect = dialectProvider.getDialect(language, null) + def normalized_language = dialect.language.replaceAll("[\\s-]", "_").toLowerCase() + if (!unsupported.contains(normalized_language)) { + def templateSource = new File(project.baseDir, "src/main/groovy/lambda.java.gsp").getText() + def className = "${normalized_language}".capitalize() + def binding = [ "i18n":dialect, "className":className ] + def template = engine.createTemplate(templateSource).make(binding) + def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/lambda/${className}.java") + file.parentFile.mkdirs() + file.write(template.toString(), "UTF-8") + } +} diff --git a/java8/src/main/code_generator/I18n.java8.txt b/java/src/main/groovy/lambda.java.gsp similarity index 85% rename from java8/src/main/code_generator/I18n.java8.txt rename to java/src/main/groovy/lambda.java.gsp index fccf9eec79..52eebc6a1e 100644 --- a/java8/src/main/code_generator/I18n.java8.txt +++ b/java/src/main/groovy/lambda.java.gsp @@ -1,19 +1,19 @@ -package cucumber.api.java8; +package io.cucumber.java.api.lambda; -import cucumber.api.java8.StepdefBody.A0; -import cucumber.api.java8.StepdefBody.A1; -import cucumber.api.java8.StepdefBody.A2; -import cucumber.api.java8.StepdefBody.A3; -import cucumber.api.java8.StepdefBody.A4; -import cucumber.api.java8.StepdefBody.A5; -import cucumber.api.java8.StepdefBody.A6; -import cucumber.api.java8.StepdefBody.A7; -import cucumber.api.java8.StepdefBody.A8; -import cucumber.api.java8.StepdefBody.A9; +import io.cucumber.java.api.StepdefBody.A0; +import io.cucumber.java.api.StepdefBody.A1; +import io.cucumber.java.api.StepdefBody.A2; +import io.cucumber.java.api.StepdefBody.A3; +import io.cucumber.java.api.StepdefBody.A4; +import io.cucumber.java.api.StepdefBody.A5; +import io.cucumber.java.api.StepdefBody.A6; +import io.cucumber.java.api.StepdefBody.A7; +import io.cucumber.java.api.StepdefBody.A8; +import io.cucumber.java.api.StepdefBody.A9; import io.cucumber.java.LambdaGlueRegistry; -import io.cucumber.java8.Java8StepDefinition; -import io.cucumber.java8.LambdaGlueBase; +import io.cucumber.java.Java8StepDefinition; +import io.cucumber.java.LambdaGlueBase; /** * To execute steps in a feature file the steps must be diff --git a/java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java b/java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java index ea1bf2104f..927d723bf6 100644 --- a/java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java +++ b/java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java @@ -1,6 +1,6 @@ package io.cucumber.java; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import io.cucumber.core.exception.CucumberException; import java.lang.reflect.Constructor; diff --git a/java/src/main/java/cucumber/api/java8/GlueBase.java b/java/src/main/java/io/cucumber/java/GlueBase.java similarity index 52% rename from java/src/main/java/cucumber/api/java8/GlueBase.java rename to java/src/main/java/io/cucumber/java/GlueBase.java index 7e6e421402..82b8dee8ce 100644 --- a/java/src/main/java/cucumber/api/java8/GlueBase.java +++ b/java/src/main/java/io/cucumber/java/GlueBase.java @@ -1,4 +1,4 @@ -package cucumber.api.java8; +package io.cucumber.java; public interface GlueBase { } diff --git a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java b/java/src/main/java/io/cucumber/java/Java8HookDefinition.java similarity index 95% rename from java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java rename to java/src/main/java/io/cucumber/java/Java8HookDefinition.java index 616b6316af..bd72e794a5 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java +++ b/java/src/main/java/io/cucumber/java/Java8HookDefinition.java @@ -1,10 +1,10 @@ -package io.cucumber.java8; +package io.cucumber.java; import static java.util.Arrays.asList; import io.cucumber.core.api.Scenario; -import cucumber.api.java8.HookBody; -import cucumber.api.java8.HookNoArgsBody; +import io.cucumber.java.api.HookBody; +import io.cucumber.java.api.HookNoArgsBody; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.filter.TagPredicate; import gherkin.pickles.PickleTag; diff --git a/java/src/main/java/io/cucumber/java/Java8Snippet.java b/java/src/main/java/io/cucumber/java/Java8Snippet.java index 0a25a55c9d..b654dc3b86 100644 --- a/java/src/main/java/io/cucumber/java/Java8Snippet.java +++ b/java/src/main/java/io/cucumber/java/Java8Snippet.java @@ -7,7 +7,7 @@ public String template() { return "" + "{0}(\"{1}\", ({3}) -> '{'\n" + " // {4}\n" + - "{5} throw new cucumber.api.java.PendingException();\n" + + "{5} throw new io.cucumber.java.api.PendingException();\n" + "'}');\n"; } } diff --git a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java b/java/src/main/java/io/cucumber/java/Java8StepDefinition.java similarity index 85% rename from java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java rename to java/src/main/java/io/cucumber/java/Java8StepDefinition.java index de0e9ba60a..6a637a5c85 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java +++ b/java/src/main/java/io/cucumber/java/Java8StepDefinition.java @@ -1,13 +1,13 @@ -package io.cucumber.java8; +package io.cucumber.java; -import static io.cucumber.java8.ParameterInfo.fromTypes; +import static io.cucumber.java.Java8StepDefinition.ParameterInfo.fromTypes; import static java.lang.String.format; import static net.jodah.typetools.TypeResolver.resolveRawArguments; import io.cucumber.core.runtime.Invoker; import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.TypeRegistry; -import cucumber.api.java8.StepdefBody; +import io.cucumber.java.api.StepdefBody; import io.cucumber.core.stepexpression.ArgumentMatcher; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; @@ -17,6 +17,7 @@ import gherkin.pickles.PickleStep; import io.cucumber.core.stepexpression.TypeResolver; +import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.ArrayList; @@ -151,4 +152,35 @@ private Type requireNonMapOrListType(Type argumentType) { return argumentType; } } + + static class ParameterInfo { + private final Type type; + + static List fromTypes(Type[] genericParameterTypes) { + List result = new ArrayList<>(); + for (Type genericParameterType : genericParameterTypes) { + for (Annotation annotation : genericParameterType.getClass().getAnnotations()) { + System.out.println(annotation.toString()); + } + + + result.add(new ParameterInfo(genericParameterType)); + } + return result; + } + + private ParameterInfo(Type type) { + this.type = type; + } + + Type getType() { + return type; + } + + @Override + public String toString() { + return type.toString(); + } + + } } diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 80ca08b6ac..d3949dac73 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -1,30 +1,24 @@ package io.cucumber.java; -import static io.cucumber.core.io.MultiLoader.packageName; -import static io.cucumber.java.ObjectFactoryLoader.loadObjectFactory; -import static java.lang.Thread.currentThread; - +import gherkin.pickles.PickleStep; import io.cucumber.core.api.options.SnippetType; -import io.cucumber.core.runtime.Invoker; -import io.cucumber.core.stepexpression.TypeRegistry; -import cucumber.api.java.After; -import cucumber.api.java.AfterStep; -import cucumber.api.java.Before; -import cucumber.api.java.BeforeStep; -import cucumber.api.java.ObjectFactory; -import cucumber.api.java8.GlueBase; import io.cucumber.core.backend.Backend; -import io.cucumber.core.io.ClassFinder; -import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.options.Env; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.snippets.Snippet; +import io.cucumber.core.options.Env; +import io.cucumber.core.runtime.Invoker; import io.cucumber.core.snippets.SnippetGenerator; -import gherkin.pickles.PickleStep; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.java.api.After; +import io.cucumber.java.api.AfterStep; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.BeforeStep; +import io.cucumber.java.api.ObjectFactory; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -32,20 +26,15 @@ import java.util.Collection; import java.util.List; +import static io.cucumber.core.io.MultiLoader.packageName; +import static io.cucumber.java.ObjectFactoryLoader.loadObjectFactory; +import static java.lang.Thread.currentThread; + public class JavaBackend implements Backend, LambdaGlueRegistry { - private final SnippetGenerator snippetGenerator; private final TypeRegistry typeRegistry; - - private Snippet createSnippet() { - ClassLoader classLoader = currentThread().getContextClassLoader(); - try { - classLoader.loadClass("cucumber.runtime.java8.LambdaGlueBase"); - return new Java8Snippet(); - } catch (ClassNotFoundException thatsOk) { - return new JavaSnippet(); - } - } + private final SnippetGenerator annotationSnippetGenerator; + private final SnippetGenerator lambdaSnippetGenerator; private final ObjectFactory objectFactory; private final ClassFinder classFinder; @@ -67,11 +56,12 @@ private JavaBackend(ClassFinder classFinder, TypeRegistry typeRegistry) { this(loadObjectFactory(classFinder, Env.INSTANCE.get(ObjectFactory.class.getName())), classFinder, typeRegistry); } - public JavaBackend(ObjectFactory objectFactory, ClassFinder classFinder, TypeRegistry typeRegistry) { + public JavaBackend(ObjectFactory objectFactory, ClassFinder classFinder, TypeRegistry typeRegistry) { this.classFinder = classFinder; this.objectFactory = objectFactory; this.methodScanner = new MethodScanner(classFinder); - this.snippetGenerator = new SnippetGenerator(createSnippet(), typeRegistry.parameterTypeRegistry()); + this.annotationSnippetGenerator = new SnippetGenerator(new JavaSnippet(), typeRegistry.parameterTypeRegistry()); + this.lambdaSnippetGenerator = new SnippetGenerator(new Java8Snippet(), typeRegistry.parameterTypeRegistry()); this.typeRegistry = typeRegistry; } @@ -132,7 +122,10 @@ public void disposeWorld() { @Override public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { - return snippetGenerator.getSnippet(step, keyword, functionNameGenerator); + List snippets = new ArrayList<>(); + snippets.addAll(annotationSnippetGenerator.getSnippet(step, keyword, functionNameGenerator)); + snippets.addAll(lambdaSnippetGenerator.getSnippet(step, keyword, functionNameGenerator)); + return snippets; } void addStepDefinition(Annotation annotation, Method method) { diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index 7dfe3bba38..2e49e91681 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -1,7 +1,7 @@ package io.cucumber.java; import io.cucumber.core.api.Scenario; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.reflection.MethodFormat; @@ -14,7 +14,7 @@ import static java.util.Arrays.asList; -public class JavaHookDefinition implements HookDefinition { +class JavaHookDefinition implements HookDefinition { private final Method method; private final long timeoutMillis; diff --git a/java/src/main/java/io/cucumber/java/JavaSnippet.java b/java/src/main/java/io/cucumber/java/JavaSnippet.java index 3f4955bbc2..0add3e594d 100644 --- a/java/src/main/java/io/cucumber/java/JavaSnippet.java +++ b/java/src/main/java/io/cucumber/java/JavaSnippet.java @@ -8,7 +8,7 @@ public String template() { "@{0}(\"{1}\")\n" + "public void {2}({3}) '{'\n" + " // {4}\n" + - "{5} throw new cucumber.api.java.PendingException();\n" + + "{5} throw new io.cucumber.java.api.PendingException();\n" + "'}'\n"; } } diff --git a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java index 68ca065efb..e32b24b824 100644 --- a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java @@ -2,7 +2,7 @@ import io.cucumber.core.runtime.Invoker; import io.cucumber.core.stepexpression.TypeRegistry; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.ArgumentMatcher; import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; @@ -11,8 +11,12 @@ import io.cucumber.core.stepexpression.StepExpression; import io.cucumber.core.stepexpression.StepExpressionFactory; import gherkin.pickles.PickleStep; +import io.cucumber.java.api.Transpose; +import java.lang.annotation.Annotation; import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.List; class JavaStepDefinition implements StepDefinition { @@ -76,4 +80,47 @@ public String getPattern() { public boolean isScenarioScoped() { return false; } + + /** + * This class composes all interesting parameter information into one object. + */ + static class ParameterInfo { + private final Type type; + private final boolean transposed; + + static List fromMethod(Method method) { + List result = new ArrayList(); + Type[] genericParameterTypes = method.getGenericParameterTypes(); + Annotation[][] annotations = method.getParameterAnnotations(); + for (int i = 0; i < genericParameterTypes.length; i++) { + boolean transposed = false; + for (Annotation annotation : annotations[i]) { + if (annotation instanceof Transpose) { + transposed = ((Transpose) annotation).value(); + } + } + result.add(new ParameterInfo(genericParameterTypes[i], transposed)); + } + return result; + } + + private ParameterInfo(Type type, boolean transposed) { + this.type = type; + this.transposed = transposed; + } + + Type getType() { + return type; + } + + boolean isTransposed() { + return transposed; + } + + @Override + public String toString() { + return type.toString(); + } + + } } diff --git a/java8/src/main/java/io/cucumber/java8/LambdaGlueBase.java b/java/src/main/java/io/cucumber/java/LambdaGlueBase.java similarity index 98% rename from java8/src/main/java/io/cucumber/java8/LambdaGlueBase.java rename to java/src/main/java/io/cucumber/java/LambdaGlueBase.java index c1110a0a6f..a72da60a43 100644 --- a/java8/src/main/java/io/cucumber/java8/LambdaGlueBase.java +++ b/java/src/main/java/io/cucumber/java/LambdaGlueBase.java @@ -1,9 +1,7 @@ -package io.cucumber.java8; +package io.cucumber.java; -import cucumber.api.java8.GlueBase; -import cucumber.api.java8.HookBody; -import cucumber.api.java8.HookNoArgsBody; -import io.cucumber.java.JavaBackend; +import io.cucumber.java.api.HookBody; +import io.cucumber.java.api.HookNoArgsBody; public interface LambdaGlueBase extends GlueBase { diff --git a/java/src/main/java/io/cucumber/java/MethodScanner.java b/java/src/main/java/io/cucumber/java/MethodScanner.java index e5bbeadec2..daa39d2f64 100644 --- a/java/src/main/java/io/cucumber/java/MethodScanner.java +++ b/java/src/main/java/io/cucumber/java/MethodScanner.java @@ -1,9 +1,9 @@ package io.cucumber.java; -import cucumber.api.java.After; -import cucumber.api.java.AfterStep; -import cucumber.api.java.Before; -import cucumber.api.java.BeforeStep; +import io.cucumber.java.api.After; +import io.cucumber.java.api.AfterStep; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.BeforeStep; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.reflection.Reflections; @@ -18,7 +18,7 @@ class MethodScanner { private final ClassFinder classFinder; - public MethodScanner(ClassFinder classFinder) { + MethodScanner(ClassFinder classFinder) { this.classFinder = classFinder; } @@ -28,7 +28,7 @@ public MethodScanner(ClassFinder classFinder) { * @param javaBackend the backend where stepdefs and hooks will be registered * @param gluePaths where to look */ - public void scan(JavaBackend javaBackend, List gluePaths) { + void scan(JavaBackend javaBackend, List gluePaths) { for (String gluePath : gluePaths) { for (Class glueCodeClass : classFinder.getDescendants(Object.class, packageName(gluePath))) { while (glueCodeClass != null && glueCodeClass != Object.class && !Reflections.isInstantiable(glueCodeClass)) { @@ -54,7 +54,7 @@ public void scan(JavaBackend javaBackend, List gluePaths) { * @param method a candidate for being a stepdef or hook. * @param glueCodeClass the class where the method is declared. */ - public void scan(JavaBackend javaBackend, Method method, Class glueCodeClass) { + void scan(JavaBackend javaBackend, Method method, Class glueCodeClass) { Annotation[] methodAnnotations = method.getAnnotations(); for (Annotation annotation : methodAnnotations) { if (isHookAnnotation(annotation)) { diff --git a/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java b/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java index a83ab0cd53..7939b3939a 100644 --- a/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java +++ b/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java @@ -1,6 +1,6 @@ package io.cucumber.java; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.reflection.NoInstancesException; @@ -9,7 +9,7 @@ import static java.util.Arrays.asList; -public class ObjectFactoryLoader { +class ObjectFactoryLoader { private ObjectFactoryLoader() { } @@ -21,7 +21,7 @@ private ObjectFactoryLoader() { * @param objectFactoryClassName specific class name of {@link ObjectFactory} implementation. May be null. * @return an instance of {@link ObjectFactory} */ - public static ObjectFactory loadObjectFactory(ClassFinder classFinder, String objectFactoryClassName) { + static ObjectFactory loadObjectFactory(ClassFinder classFinder, String objectFactoryClassName) { ObjectFactory objectFactory; try { Reflections reflections = new Reflections(classFinder); diff --git a/java/src/main/java/io/cucumber/java/ParameterInfo.java b/java/src/main/java/io/cucumber/java/ParameterInfo.java deleted file mode 100644 index 17969ff52f..0000000000 --- a/java/src/main/java/io/cucumber/java/ParameterInfo.java +++ /dev/null @@ -1,52 +0,0 @@ -package io.cucumber.java; - -import cucumber.api.java.Transpose; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; - -/** - * This class composes all interesting parameter information into one object. - */ -class ParameterInfo { - private final Type type; - private final boolean transposed; - - static List fromMethod(Method method) { - List result = new ArrayList(); - Type[] genericParameterTypes = method.getGenericParameterTypes(); - Annotation[][] annotations = method.getParameterAnnotations(); - for (int i = 0; i < genericParameterTypes.length; i++) { - boolean transposed = false; - for (Annotation annotation : annotations[i]) { - if (annotation instanceof Transpose) { - transposed = ((Transpose) annotation).value(); - } - } - result.add(new ParameterInfo(genericParameterTypes[i], transposed)); - } - return result; - } - - private ParameterInfo(Type type, boolean transposed) { - this.type = type; - this.transposed = transposed; - } - - Type getType() { - return type; - } - - boolean isTransposed() { - return transposed; - } - - @Override - public String toString() { - return type.toString(); - } - -} diff --git a/java/src/main/java/io/cucumber/java/StaticGlue.java b/java/src/main/java/io/cucumber/java/StaticGlue.java deleted file mode 100644 index e6304007bf..0000000000 --- a/java/src/main/java/io/cucumber/java/StaticGlue.java +++ /dev/null @@ -1,57 +0,0 @@ -package io.cucumber.java; - -import cucumber.api.java.ObjectFactory; -import io.cucumber.core.stepexpression.TypeRegistry; - -public class StaticGlue { - - - - private static interface GlueProvider { - - StaticGlue loadGlue(String glue_paths); - } - - private static class JavaGlueProvider implements GlueProvider{ - - // same constructor as JavaBackend - - @Override - public StaticGlue loadGlue(String glue_paths) { - // create glue instance - - // add glue methods - - return null; - } - } - - - private static class Main { - - public void main(){ - - StaticGlue staticGlue = new JavaGlueProvider().loadGlue("glue paths"); - - staticGlue.buildWorld(); - - - - } - - - } - - private void buildWorld() { - } - - - private TypeRegistry typeRegistry; - private ObjectFactory objectFactory; - - - - -} - - diff --git a/java/src/main/java/cucumber/api/java/After.java b/java/src/main/java/io/cucumber/java/api/After.java similarity index 95% rename from java/src/main/java/cucumber/api/java/After.java rename to java/src/main/java/io/cucumber/java/api/After.java index f40eaaf66a..eaa644da60 100644 --- a/java/src/main/java/cucumber/api/java/After.java +++ b/java/src/main/java/io/cucumber/java/api/After.java @@ -1,4 +1,4 @@ -package cucumber.api.java; +package io.cucumber.java.api; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/main/java/cucumber/api/java/AfterStep.java b/java/src/main/java/io/cucumber/java/api/AfterStep.java similarity index 95% rename from java/src/main/java/cucumber/api/java/AfterStep.java rename to java/src/main/java/io/cucumber/java/api/AfterStep.java index 3c8f671312..9c5dfaadc0 100644 --- a/java/src/main/java/cucumber/api/java/AfterStep.java +++ b/java/src/main/java/io/cucumber/java/api/AfterStep.java @@ -1,4 +1,4 @@ -package cucumber.api.java; +package io.cucumber.java.api; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/main/java/cucumber/api/java/Before.java b/java/src/main/java/io/cucumber/java/api/Before.java similarity index 95% rename from java/src/main/java/cucumber/api/java/Before.java rename to java/src/main/java/io/cucumber/java/api/Before.java index 4b972a23f0..feedc57c91 100644 --- a/java/src/main/java/cucumber/api/java/Before.java +++ b/java/src/main/java/io/cucumber/java/api/Before.java @@ -1,4 +1,4 @@ -package cucumber.api.java; +package io.cucumber.java.api; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/main/java/cucumber/api/java/BeforeStep.java b/java/src/main/java/io/cucumber/java/api/BeforeStep.java similarity index 95% rename from java/src/main/java/cucumber/api/java/BeforeStep.java rename to java/src/main/java/io/cucumber/java/api/BeforeStep.java index 5a16a68638..7e7e1f68ad 100644 --- a/java/src/main/java/cucumber/api/java/BeforeStep.java +++ b/java/src/main/java/io/cucumber/java/api/BeforeStep.java @@ -1,4 +1,4 @@ -package cucumber.api.java; +package io.cucumber.java.api; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java8/src/main/java/cucumber/api/java8/HookBody.java b/java/src/main/java/io/cucumber/java/api/HookBody.java similarity index 80% rename from java8/src/main/java/cucumber/api/java8/HookBody.java rename to java/src/main/java/io/cucumber/java/api/HookBody.java index 235286c29d..afba2bbe66 100644 --- a/java8/src/main/java/cucumber/api/java8/HookBody.java +++ b/java/src/main/java/io/cucumber/java/api/HookBody.java @@ -1,4 +1,4 @@ -package cucumber.api.java8; +package io.cucumber.java.api; import io.cucumber.core.api.Scenario; diff --git a/java8/src/main/java/cucumber/api/java8/HookNoArgsBody.java b/java/src/main/java/io/cucumber/java/api/HookNoArgsBody.java similarity index 70% rename from java8/src/main/java/cucumber/api/java8/HookNoArgsBody.java rename to java/src/main/java/io/cucumber/java/api/HookNoArgsBody.java index 52b7badade..e261abae41 100644 --- a/java8/src/main/java/cucumber/api/java8/HookNoArgsBody.java +++ b/java/src/main/java/io/cucumber/java/api/HookNoArgsBody.java @@ -1,4 +1,4 @@ -package cucumber.api.java8; +package io.cucumber.java.api; public interface HookNoArgsBody { void accept() throws Throwable; diff --git a/java/src/main/java/cucumber/api/java/ObjectFactory.java b/java/src/main/java/io/cucumber/java/api/ObjectFactory.java similarity index 97% rename from java/src/main/java/cucumber/api/java/ObjectFactory.java rename to java/src/main/java/io/cucumber/java/api/ObjectFactory.java index 4b8a941dcd..5ebaf5eb12 100644 --- a/java/src/main/java/cucumber/api/java/ObjectFactory.java +++ b/java/src/main/java/io/cucumber/java/api/ObjectFactory.java @@ -1,4 +1,4 @@ -package cucumber.api.java; +package io.cucumber.java.api; /** * Minimal facade for Dependency Injection containers diff --git a/java/src/main/java/cucumber/api/java/PendingException.java b/java/src/main/java/io/cucumber/java/api/PendingException.java similarity index 92% rename from java/src/main/java/cucumber/api/java/PendingException.java rename to java/src/main/java/io/cucumber/java/api/PendingException.java index 24606e14cc..f3a98f56e6 100644 --- a/java/src/main/java/cucumber/api/java/PendingException.java +++ b/java/src/main/java/io/cucumber/java/api/PendingException.java @@ -1,4 +1,4 @@ -package cucumber.api.java; +package io.cucumber.java.api; import io.cucumber.core.backend.Pending; diff --git a/java8/src/main/java/cucumber/api/java8/StepdefBody.java b/java/src/main/java/io/cucumber/java/api/StepdefBody.java similarity index 98% rename from java8/src/main/java/cucumber/api/java8/StepdefBody.java rename to java/src/main/java/io/cucumber/java/api/StepdefBody.java index 850d8db48c..ec37cb0c85 100644 --- a/java8/src/main/java/cucumber/api/java8/StepdefBody.java +++ b/java/src/main/java/io/cucumber/java/api/StepdefBody.java @@ -1,4 +1,4 @@ -package cucumber.api.java8; +package io.cucumber.java.api; public interface StepdefBody { public static interface A0 extends StepdefBody { diff --git a/java/src/main/java/cucumber/api/java/Transpose.java b/java/src/main/java/io/cucumber/java/api/Transpose.java similarity index 97% rename from java/src/main/java/cucumber/api/java/Transpose.java rename to java/src/main/java/io/cucumber/java/api/Transpose.java index 713874285b..9dee0cbd29 100644 --- a/java/src/main/java/cucumber/api/java/Transpose.java +++ b/java/src/main/java/io/cucumber/java/api/Transpose.java @@ -1,4 +1,4 @@ -package cucumber.api.java; +package io.cucumber.java.api; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/Java8AnonInnerClassStepDefinitionTest.java similarity index 94% rename from java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java rename to java/src/test/java/io/cucumber/java/Java8AnonInnerClassStepDefinitionTest.java index 8a8e0c55f4..ccfc82e89d 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/Java8AnonInnerClassStepDefinitionTest.java @@ -1,9 +1,10 @@ -package io.cucumber.java8; +package io.cucumber.java; import static org.junit.Assert.assertEquals; import io.cucumber.core.stepexpression.TypeRegistry; -import cucumber.api.java8.StepdefBody; +import io.cucumber.java.Java8StepDefinition; +import io.cucumber.java.api.StepdefBody; import org.junit.Test; import java.util.List; diff --git a/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java b/java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java similarity index 89% rename from java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java rename to java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java index 0189e77298..4203ffa30c 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java +++ b/java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java @@ -1,10 +1,9 @@ -package io.cucumber.java8; +package io.cucumber.java; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.java.Function; -import io.cucumber.java.LambdaGlueRegistry; +import io.cucumber.java.api.lambda.En; import org.hamcrest.CustomTypeSafeMatcher; import org.junit.Rule; import org.junit.Test; @@ -75,4 +74,14 @@ StepDefinition getStepDefinition() { return stepDefinition; } } + + static final class SomeLambdaStepDefs implements En { + + SomeLambdaStepDefs() { + Given("I have a some step definition", () -> { + throw new Exception(); + }); + } + + } } diff --git a/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionTest.java similarity index 96% rename from java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java rename to java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionTest.java index 6243478ca3..12e0407ff1 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionTest.java @@ -1,9 +1,9 @@ -package io.cucumber.java8; +package io.cucumber.java; import static org.junit.Assert.assertEquals; import io.cucumber.core.stepexpression.TypeRegistry; -import cucumber.api.java8.StepdefBody; +import io.cucumber.java.api.StepdefBody; import io.cucumber.core.exception.CucumberException; import org.junit.Test; diff --git a/java/src/test/java/io/cucumber/java/Java8SnippetTest.java b/java/src/test/java/io/cucumber/java/Java8SnippetTest.java index dbebc6d4ec..88cd2b65bf 100644 --- a/java/src/test/java/io/cucumber/java/Java8SnippetTest.java +++ b/java/src/test/java/io/cucumber/java/Java8SnippetTest.java @@ -1,14 +1,13 @@ package io.cucumber.java; -import io.cucumber.core.snippets.SnippetGenerator; import gherkin.pickles.Argument; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; +import io.cucumber.core.snippets.SnippetGenerator; import io.cucumber.cucumberexpressions.ParameterTypeRegistry; import org.junit.Test; import java.util.Collections; -import java.util.List; import java.util.Locale; import static org.junit.Assert.assertEquals; @@ -19,17 +18,21 @@ public class Java8SnippetTest { @Test public void generatesPlainSnippet() { String expected = "" + - "Given(\"I have {int} cukes in my {string} belly\", (Integer int1, String string) -> {\n" + - " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + - "});\n"; + "Given(\"I have {int} cukes in my {string} belly\", (Integer int1, String string) -> {\n" + + " // Write code here that turns the phrase above into concrete actions\n" + + " throw new io.cucumber.java.api.PendingException();\n" + + "});\n"; System.out.println(expected); assertEquals(expected, snippetFor("I have 4 cukes in my \"big\" belly")); } private String snippetFor(String name) { PickleStep step = new PickleStep(name, Collections.emptyList(), Collections.emptyList()); - List snippet = new SnippetGenerator(new Java8Snippet(), new ParameterTypeRegistry(Locale.ENGLISH)).getSnippet(step, GIVEN_KEYWORD, null); - return StringJoiner.join("\n", snippet); + return String.join( + "\n", + new SnippetGenerator( + new Java8Snippet(), + new ParameterTypeRegistry(Locale.ENGLISH)).getSnippet(step, GIVEN_KEYWORD, null) + ); } } \ No newline at end of file diff --git a/java/src/test/java/io/cucumber/java/JavaBackendTest.java b/java/src/test/java/io/cucumber/java/JavaBackendTest.java index be7ce641e5..85a1d79b27 100644 --- a/java/src/test/java/io/cucumber/java/JavaBackendTest.java +++ b/java/src/test/java/io/cucumber/java/JavaBackendTest.java @@ -1,6 +1,6 @@ package io.cucumber.java; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; diff --git a/java/src/test/java/io/cucumber/java/JavaHookTest.java b/java/src/test/java/io/cucumber/java/JavaHookTest.java index 9b1648308a..15d172b437 100644 --- a/java/src/test/java/io/cucumber/java/JavaHookTest.java +++ b/java/src/test/java/io/cucumber/java/JavaHookTest.java @@ -1,10 +1,10 @@ package io.cucumber.java; import io.cucumber.core.api.Scenario; -import cucumber.api.java.After; -import cucumber.api.java.AfterStep; -import cucumber.api.java.Before; -import cucumber.api.java.BeforeStep; +import io.cucumber.java.api.After; +import io.cucumber.java.api.AfterStep; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.BeforeStep; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; diff --git a/java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java b/java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java index e36f4b3e43..11aa0b62e6 100644 --- a/java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java +++ b/java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java @@ -1,6 +1,6 @@ package io.cucumber.java; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import org.junit.Test; import static org.junit.Assert.assertNotNull; diff --git a/java/src/test/java/io/cucumber/java/JavaSnippetTest.java b/java/src/test/java/io/cucumber/java/JavaSnippetTest.java index 8def71f965..75b549c185 100644 --- a/java/src/test/java/io/cucumber/java/JavaSnippetTest.java +++ b/java/src/test/java/io/cucumber/java/JavaSnippetTest.java @@ -35,7 +35,7 @@ public void generatesPlainSnippet() { "@Given(\"I have {int} cukes in my {string} belly\")\n" + "public void i_have_cukes_in_my_belly(Integer int1, String string) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 4 cukes in my \"big\" belly")); } @@ -58,7 +58,7 @@ public Size transform(String... strings) { "@Given(\"I have {double} cukes in my {size} belly\")\n" + "public void i_have_cukes_in_my_belly(Double double1, Size size) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 4.2 cukes in my large belly", customParameterType)); } @@ -83,7 +83,7 @@ public List transform(String... strings) { "@Given(\"I have {sizes} bellies\")\n" + "public void i_have_bellies(java.util.List sizes) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have large and small bellies", customParameterType)); } @@ -94,7 +94,7 @@ public void generatesCopyPasteReadyStepSnippetForNumberParameters() { "@Given(\"before {int} after\")\n" + "public void before_after(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("before 5 after")); } @@ -105,7 +105,7 @@ public void generatesCopyPasteReadySnippetWhenStepHasIllegalJavaIdentifierChars( "@Given(\"I have {int} cukes in: my {string} red-belly!\")\n" + "public void i_have_cukes_in_my_red_belly(Integer int1, String string) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 4 cukes in: my \"big\" red-belly!")); } @@ -116,7 +116,7 @@ public void generatesCopyPasteReadySnippetWhenStepHasIntegersInsideStringParamet "@Given(\"the DI system receives a message saying {string}\")\n" + "public void the_DI_system_receives_a_message_saying(String string) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("the DI system receives a message saying \"{ dataIngestion: { feeds: [ feed: { merchantId: 666, feedId: 1, feedFileLocation: feed.csv } ] }\"")); } @@ -127,7 +127,7 @@ public void generatesSnippetWithDollarSigns() { "@Given(\"I have ${int}\")\n" + "public void i_have_$(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have $5")); } @@ -138,7 +138,7 @@ public void generatesSnippetWithQuestionMarks() { "@Given(\"is there an error?:\")\n" + "public void is_there_an_error() {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("is there an error?:")); } @@ -149,7 +149,7 @@ public void generatesSnippetWithLotsOfNonIdentifierCharacters() { "@Given(\"\\\\([a-z]*)?.+\")\n" + "public void a_z() {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("([a-z]*)?.+")); } @@ -160,7 +160,7 @@ public void generatesSnippetWithParentheses() { "@Given(\"I have {int} cukes \\\\(maybe more)\")\n" + "public void i_have_cukes_maybe_more(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 5 cukes (maybe more)")); } @@ -171,7 +171,7 @@ public void generatesSnippetWithBrackets() { "@Given(\"I have {int} cukes [maybe more]\")\n" + "public void i_have_cukes_maybe_more(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 5 cukes [maybe more]")); } @@ -182,7 +182,7 @@ public void generatesSnippetWithDocString() { "@Given(\"I have:\")\n" + "public void i_have(String docString) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetForDocString("I have:", new PickleString(null, "hello"))); } @@ -206,13 +206,13 @@ public String transform(String... strings) { "@Given(\"I have a {docString}:\")\n" + "public void i_have_a(String docString, String docString1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n" + "\n" + "@Given(\"I have a {string}:\")\n" + "public void i_have_a(String string, String docString) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetForDocString("I have a \"Documentation String\":", new PickleString(null, "hello"), customParameterType)); } @@ -240,7 +240,7 @@ public void generatesSnippetWithDataTable() { " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + " //\n" + " // For other transformations you can register a DataTableType.\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; PickleTable dataTable = new PickleTable(asList(new PickleRow(asList(new PickleCell(null, "col1"))))); assertEquals(expected, snippetForDataTable("I have:", dataTable)); @@ -272,7 +272,7 @@ public String transform(String... strings) { " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + " //\n" + " // For other transformations you can register a DataTableType.\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n" + "\n" + "@Given(\"I have in table {string}:\")\n" + @@ -284,7 +284,7 @@ public String transform(String... strings) { " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + " //\n" + " // For other transformations you can register a DataTableType.\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; PickleTable dataTable = new PickleTable(asList(new PickleRow(asList(new PickleCell(null, "col1"))))); assertEquals(expected, snippetForDataTable("I have in table \"M6\":", dataTable, customParameterType)); @@ -296,7 +296,7 @@ public void generateSnippetWithOutlineParam() { "@Given(\"Then it responds \")\n" + "public void then_it_responds_param() {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new cucumber.api.java.PendingException();\n" + + " throw new io.cucumber.java.api.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("Then it responds ")); @@ -305,7 +305,7 @@ public void generateSnippetWithOutlineParam() { private String snippetFor(String name) { PickleStep step = new PickleStep(name, Collections.emptyList(), Collections.emptyList()); List snippet = new SnippetGenerator(new JavaSnippet(), new ParameterTypeRegistry(Locale.ENGLISH)).getSnippet(step, GIVEN_KEYWORD, functionNameGenerator); - return StringJoiner.join("\n", snippet); + return String.join("\n", snippet); } @@ -314,13 +314,13 @@ private String snippetFor(String name, ParameterType parameterType) { ParameterTypeRegistry parameterTypeRegistry = new ParameterTypeRegistry(Locale.ENGLISH); parameterTypeRegistry.defineParameterType(parameterType); List snippet = new SnippetGenerator(new JavaSnippet(), parameterTypeRegistry).getSnippet(step, GIVEN_KEYWORD, functionNameGenerator); - return StringJoiner.join("\n", snippet); + return String.join("\n", snippet); } private String snippetForDocString(String name, PickleString docString) { PickleStep step = new PickleStep(name, asList((Argument) docString), Collections.emptyList()); List snippet = new SnippetGenerator(new JavaSnippet(), new ParameterTypeRegistry(Locale.ENGLISH)).getSnippet(step, GIVEN_KEYWORD, functionNameGenerator); - return StringJoiner.join("\n", snippet); + return String.join("\n", snippet); } @@ -329,14 +329,14 @@ private String snippetForDocString(String name, PickleString docString, Paramete ParameterTypeRegistry parameterTypeRegistry = new ParameterTypeRegistry(Locale.ENGLISH); parameterTypeRegistry.defineParameterType(parameterType); List snippet = new SnippetGenerator(new JavaSnippet(), parameterTypeRegistry).getSnippet(step, GIVEN_KEYWORD, functionNameGenerator); - return StringJoiner.join("\n", snippet); + return String.join("\n", snippet); } private String snippetForDataTable(String name, PickleTable dataTable) { PickleStep step = new PickleStep(name, asList((Argument) dataTable), Collections.emptyList()); List snippet = new SnippetGenerator(new JavaSnippet(), new ParameterTypeRegistry(Locale.ENGLISH)).getSnippet(step, GIVEN_KEYWORD, functionNameGenerator); - return StringJoiner.join("\n", snippet); + return String.join("\n", snippet); } @@ -345,7 +345,7 @@ private String snippetForDataTable(String name, PickleTable dataTable, Parameter ParameterTypeRegistry parameterTypeRegistry = new ParameterTypeRegistry(Locale.ENGLISH); parameterTypeRegistry.defineParameterType(parameterType); List snippet = new SnippetGenerator(new JavaSnippet(), parameterTypeRegistry).getSnippet(step, GIVEN_KEYWORD, functionNameGenerator); - return StringJoiner.join("\n", snippet); + return String.join("\n", snippet); } private static class Size { diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 267140a41f..63db422e29 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -3,8 +3,8 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.TestStepFinished; -import cucumber.api.java.ObjectFactory; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.ObjectFactory; +import io.cucumber.java.api.annotation.en.Given; import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java index 7670397781..deb9fbaf11 100755 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java @@ -1,7 +1,7 @@ package io.cucumber.java; -import cucumber.api.java.Transpose; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.Transpose; +import io.cucumber.java.api.ObjectFactory; import io.cucumber.core.backend.StepDefinition; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleLocation; diff --git a/java/src/test/java/io/cucumber/java/MethodScannerTest.java b/java/src/test/java/io/cucumber/java/MethodScannerTest.java index f6d3f2a4c6..942b39089f 100644 --- a/java/src/test/java/io/cucumber/java/MethodScannerTest.java +++ b/java/src/test/java/io/cucumber/java/MethodScannerTest.java @@ -1,7 +1,7 @@ package io.cucumber.java; import io.cucumber.core.stepexpression.TypeRegistry; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.backend.Glue; import io.cucumber.core.io.MultiLoader; @@ -74,7 +74,7 @@ public interface Interface1 { } public static class BaseStepDefs { - @cucumber.api.java.Before + @io.cucumber.java.api.Before public void m() { } } diff --git a/java/src/test/java/io/cucumber/java/SingletonFactory.java b/java/src/test/java/io/cucumber/java/SingletonFactory.java index b66cf0265b..a16fc45019 100644 --- a/java/src/test/java/io/cucumber/java/SingletonFactory.java +++ b/java/src/test/java/io/cucumber/java/SingletonFactory.java @@ -1,6 +1,6 @@ package io.cucumber.java; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; class SingletonFactory implements ObjectFactory { private Object singleton; diff --git a/java/src/test/java/io/cucumber/java/StringJoiner.java b/java/src/test/java/io/cucumber/java/StringJoiner.java deleted file mode 100644 index 6e7ad782b7..0000000000 --- a/java/src/test/java/io/cucumber/java/StringJoiner.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.cucumber.java; - -public class StringJoiner { - public static String join(String delimiter, Iterable strings){ - //TODO: Java8 replace with StringJoiner. - StringBuilder builder = new StringBuilder(); - boolean first = true; - for (String string : strings) { - if (first) { - first = false; - } else { - builder.append(delimiter); - } - builder.append(string); - } - return builder.toString(); - } -} diff --git a/java/src/test/java/io/cucumber/java/test/Authors.java b/java/src/test/java/io/cucumber/java/annotation/Authors.java similarity index 94% rename from java/src/test/java/io/cucumber/java/test/Authors.java rename to java/src/test/java/io/cucumber/java/annotation/Authors.java index 980e64cdde..1b3deea87f 100644 --- a/java/src/test/java/io/cucumber/java/test/Authors.java +++ b/java/src/test/java/io/cucumber/java/annotation/Authors.java @@ -1,7 +1,7 @@ -package io.cucumber.java.test; +package io.cucumber.java.annotation; -import cucumber.api.java.Transpose; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.Transpose; +import io.cucumber.java.api.annotation.en.Given; import java.util.List; diff --git a/java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java b/java/src/test/java/io/cucumber/java/annotation/RunCukesTest.java similarity index 77% rename from java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java rename to java/src/test/java/io/cucumber/java/annotation/RunCukesTest.java index 96c3db3894..d0e7104291 100644 --- a/java8/src/test/java/io/cucumber/java8/test/RunCukesTest.java +++ b/java/src/test/java/io/cucumber/java/annotation/RunCukesTest.java @@ -1,4 +1,4 @@ -package io.cucumber.java8.test; +package io.cucumber.java.annotation; import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; diff --git a/java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java b/java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java similarity index 74% rename from java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java rename to java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java index 540e057b8a..d220be0d65 100644 --- a/java/src/test/java/io/cucumber/java/test/ScenarioStepDefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java @@ -1,10 +1,10 @@ -package io.cucumber.java.test; +package io.cucumber.java.annotation; import io.cucumber.core.api.Scenario; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import static org.junit.Assert.assertEquals; diff --git a/java/src/test/java/io/cucumber/java/test/Stepdefs.java b/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java similarity index 80% rename from java/src/test/java/io/cucumber/java/test/Stepdefs.java rename to java/src/test/java/io/cucumber/java/annotation/Stepdefs.java index f6300dca6f..aa0755404c 100644 --- a/java/src/test/java/io/cucumber/java/test/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java @@ -1,6 +1,6 @@ -package io.cucumber.java.test; +package io.cucumber.java.annotation; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.annotation.en.Given; import java.util.List; diff --git a/java/src/test/java/io/cucumber/java/test/SubstitutionStepdefs.java b/java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java similarity index 86% rename from java/src/test/java/io/cucumber/java/test/SubstitutionStepdefs.java rename to java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java index dfa289a9e2..3cd1ba5545 100644 --- a/java/src/test/java/io/cucumber/java/test/SubstitutionStepdefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java @@ -1,8 +1,8 @@ -package io.cucumber.java.test; +package io.cucumber.java.annotation; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import java.util.HashMap; import java.util.Map; diff --git a/java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java b/java/src/test/java/io/cucumber/java/annotation/TypeRegistryConfiguration.java similarity index 96% rename from java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java rename to java/src/test/java/io/cucumber/java/annotation/TypeRegistryConfiguration.java index 35dc165fe3..fd7dce76cc 100644 --- a/java/src/test/java/io/cucumber/java/test/TypeRegistryConfiguration.java +++ b/java/src/test/java/io/cucumber/java/annotation/TypeRegistryConfiguration.java @@ -1,11 +1,11 @@ -package io.cucumber.java.test; +package io.cucumber.java.annotation; import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.core.api.TypeRegistry; import io.cucumber.datatable.DataTable; import io.cucumber.datatable.DataTableType; import io.cucumber.datatable.TableEntryTransformer; -import io.cucumber.java.test.Authors.Author; +import io.cucumber.java.annotation.Authors.Author; import io.cucumber.datatable.TableTransformer; import java.util.Locale; diff --git a/java/src/test/java/io/cucumber/java/test/UnusedGlue.java b/java/src/test/java/io/cucumber/java/annotation/UnusedGlue.java similarity index 71% rename from java/src/test/java/io/cucumber/java/test/UnusedGlue.java rename to java/src/test/java/io/cucumber/java/annotation/UnusedGlue.java index f1d55e3ec1..d198163468 100644 --- a/java/src/test/java/io/cucumber/java/test/UnusedGlue.java +++ b/java/src/test/java/io/cucumber/java/annotation/UnusedGlue.java @@ -1,7 +1,7 @@ -package io.cucumber.java.test; +package io.cucumber.java.annotation; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; public class UnusedGlue { public UnusedGlue() { diff --git a/java8/src/test/java/io/cucumber/java8/test/AnonInnerClassStepdefs.java b/java/src/test/java/io/cucumber/java/lambda/AnonInnerClassStepdefs.java similarity index 87% rename from java8/src/test/java/io/cucumber/java8/test/AnonInnerClassStepdefs.java rename to java/src/test/java/io/cucumber/java/lambda/AnonInnerClassStepdefs.java index ed0af031de..cb532d1408 100644 --- a/java8/src/test/java/io/cucumber/java8/test/AnonInnerClassStepdefs.java +++ b/java/src/test/java/io/cucumber/java/lambda/AnonInnerClassStepdefs.java @@ -1,14 +1,14 @@ -package io.cucumber.java8.test; +package io.cucumber.java.lambda; import static org.junit.Assert.assertEquals; import io.cucumber.core.stepexpression.TypeRegistry; -import cucumber.api.java8.GlueBase; -import cucumber.api.java8.StepdefBody; -import io.cucumber.core.backend.StepDefinition; import io.cucumber.java.Function; +import io.cucumber.java.GlueBase; +import io.cucumber.java.Java8StepDefinition; import io.cucumber.java.JavaBackend; -import io.cucumber.java8.Java8StepDefinition; +import io.cucumber.java.api.StepdefBody; +import io.cucumber.core.backend.StepDefinition; public class AnonInnerClassStepdefs implements GlueBase { diff --git a/java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java b/java/src/test/java/io/cucumber/java/lambda/LambdaStepdefs.java similarity index 95% rename from java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java rename to java/src/test/java/io/cucumber/java/lambda/LambdaStepdefs.java index 33f8864dae..879b5e7109 100644 --- a/java8/src/test/java/io/cucumber/java8/test/LambdaStepdefs.java +++ b/java/src/test/java/io/cucumber/java/lambda/LambdaStepdefs.java @@ -1,4 +1,4 @@ -package io.cucumber.java8.test; +package io.cucumber.java.lambda; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; @@ -7,7 +7,7 @@ import io.cucumber.core.api.Scenario; import io.cucumber.datatable.DataTable; -import cucumber.api.java8.En; +import io.cucumber.java.api.lambda.En; import java.util.List; @@ -73,7 +73,7 @@ public LambdaStepdefs() { assertEquals(42, outside + 1); }); - Given("I will give you {int} and {float} and {string} and {int}", (Integer a, Float b, String c, + Given("I will give you {int} and {float} and {word} and {int}", (Integer a, Float b, String c, Integer d) -> { assertEquals((Integer) 1, a); diff --git a/java/src/test/java/io/cucumber/java/test/RunCukesTest.java b/java/src/test/java/io/cucumber/java/lambda/RunCukesTest.java similarity index 79% rename from java/src/test/java/io/cucumber/java/test/RunCukesTest.java rename to java/src/test/java/io/cucumber/java/lambda/RunCukesTest.java index 3888a44e6c..95e2984813 100644 --- a/java/src/test/java/io/cucumber/java/test/RunCukesTest.java +++ b/java/src/test/java/io/cucumber/java/lambda/RunCukesTest.java @@ -1,4 +1,4 @@ -package io.cucumber.java.test; +package io.cucumber.java.lambda; import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; diff --git a/java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java b/java/src/test/java/io/cucumber/java/lambda/TypeRegistryConfiguration.java similarity index 81% rename from java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java rename to java/src/test/java/io/cucumber/java/lambda/TypeRegistryConfiguration.java index 16c6468b9f..b7a9e34b27 100644 --- a/java8/src/test/java/io/cucumber/java8/test/TypeRegistryConfiguration.java +++ b/java/src/test/java/io/cucumber/java/lambda/TypeRegistryConfiguration.java @@ -1,9 +1,8 @@ -package io.cucumber.java8.test; +package io.cucumber.java.lambda; -import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.core.api.TypeRegistry; +import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.datatable.DataTableType; -import io.cucumber.java8.test.LambdaStepdefs.Person; import java.util.Locale; import java.util.Map; @@ -20,9 +19,9 @@ public Locale locale() { @Override public void configureTypeRegistry(TypeRegistry typeRegistry) { typeRegistry.defineDataTableType(new DataTableType( - Person.class, + LambdaStepdefs.Person.class, (Map map) -> { - Person person = new Person(); + LambdaStepdefs.Person person = new LambdaStepdefs.Person(); person.first = map.get("first"); person.last = map.get("last"); return person; diff --git a/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java b/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java index 668c964300..92808a31d9 100644 --- a/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.java.stepdefs; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.annotation.en.Given; public class Stepdefs { diff --git a/java/src/test/resources/io/cucumber/java/test/authors.feature b/java/src/test/resources/io/cucumber/java/annotation/authors.feature similarity index 100% rename from java/src/test/resources/io/cucumber/java/test/authors.feature rename to java/src/test/resources/io/cucumber/java/annotation/authors.feature diff --git a/java/src/test/resources/io/cucumber/java/test/cukes.feature b/java/src/test/resources/io/cucumber/java/annotation/cukes.feature similarity index 100% rename from java/src/test/resources/io/cucumber/java/test/cukes.feature rename to java/src/test/resources/io/cucumber/java/annotation/cukes.feature diff --git a/java/src/test/resources/io/cucumber/java/test/french-iso-8859-1-cukes.feature b/java/src/test/resources/io/cucumber/java/annotation/french-iso-8859-1-cukes.feature similarity index 100% rename from java/src/test/resources/io/cucumber/java/test/french-iso-8859-1-cukes.feature rename to java/src/test/resources/io/cucumber/java/annotation/french-iso-8859-1-cukes.feature diff --git a/java/src/test/resources/io/cucumber/java/test/scenario.feature b/java/src/test/resources/io/cucumber/java/annotation/scenario.feature similarity index 100% rename from java/src/test/resources/io/cucumber/java/test/scenario.feature rename to java/src/test/resources/io/cucumber/java/annotation/scenario.feature diff --git a/java/src/test/resources/io/cucumber/java/test/scenario_outline_substitution.feature b/java/src/test/resources/io/cucumber/java/annotation/scenario_outline_substitution.feature similarity index 100% rename from java/src/test/resources/io/cucumber/java/test/scenario_outline_substitution.feature rename to java/src/test/resources/io/cucumber/java/annotation/scenario_outline_substitution.feature diff --git a/java/src/test/resources/io/cucumber/java/test/table_conversion.feature b/java/src/test/resources/io/cucumber/java/annotation/table_conversion.feature similarity index 100% rename from java/src/test/resources/io/cucumber/java/test/table_conversion.feature rename to java/src/test/resources/io/cucumber/java/annotation/table_conversion.feature diff --git a/java8/src/test/resources/io/cucumber/java8/test/anon-inner-class-step-definitions.feature b/java/src/test/resources/io/cucumber/java/lambda/anon-inner-class-step-definitions.feature similarity index 100% rename from java8/src/test/resources/io/cucumber/java8/test/anon-inner-class-step-definitions.feature rename to java/src/test/resources/io/cucumber/java/lambda/anon-inner-class-step-definitions.feature diff --git a/java8/src/test/resources/io/cucumber/java8/test/lambda-step-definitions.feature b/java/src/test/resources/io/cucumber/java/lambda/lambda-step-definitions.feature similarity index 100% rename from java8/src/test/resources/io/cucumber/java8/test/lambda-step-definitions.feature rename to java/src/test/resources/io/cucumber/java/lambda/lambda-step-definitions.feature diff --git a/java8/pom.xml b/java8/pom.xml deleted file mode 100644 index 78062ecb46..0000000000 --- a/java8/pom.xml +++ /dev/null @@ -1,123 +0,0 @@ - - 4.0.0 - - - io.cucumber - cucumber-jvm - 5.0.0-SNAPSHOT - - - cucumber-java8 - jar - Cucumber-JVM: Java8 - - - - io.cucumber - cucumber-java - - - net.jodah - typetools - - - - io.cucumber - cucumber-junit - test - - - junit - junit - test - - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - generate-i18n-sources - - run - - generate-sources - - - - - - def dialect = dialectProvider.getDialect(language, null) - def normalized_language = dialect.language.replaceAll("[\\s-]", "_").toLowerCase() - if (!unsupported.contains(normalized_language)) { - def templateSource = new File(project.baseDir, "src${File.separator}main${File.separator}code_generator${File.separator}I18n.java8.txt").getText() - def className = "${normalized_language}".capitalize() - def binding = [ "i18n":dialect, "className":className ] - def template = engine.createTemplate(templateSource).make(binding) - def file = new File(project.baseDir, "target${File.separator}generated-sources${File.separator}i18n${File.separator}java8${File.separator}cucumber${File.separator}api${File.separator}java8${File.separator}${className}.java") - file.parentFile.mkdirs() - file.write(template.toString(), "UTF-8") - } -} - - ]]> - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - true - UTF-8 - 1.8 - 1.8 - -XDignore.symbol.file=true - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - add-source - generate-sources - - add-source - - - - ${basedir}/target/generated-sources/i18n/java8 - - - - - - - - diff --git a/java8/src/main/java/io/cucumber/java8/ParameterInfo.java b/java8/src/main/java/io/cucumber/java8/ParameterInfo.java deleted file mode 100644 index 36ed36b789..0000000000 --- a/java8/src/main/java/io/cucumber/java8/ParameterInfo.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.cucumber.java8; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; - -class ParameterInfo { - private final Type type; - - static List fromTypes(Type[] genericParameterTypes) { - List result = new ArrayList<>(); - for (Type genericParameterType : genericParameterTypes) { - for (Annotation annotation : genericParameterType.getClass().getAnnotations()) { - System.out.println(annotation.toString()); - } - - - result.add(new ParameterInfo(genericParameterType)); - } - return result; - } - - private ParameterInfo(Type type) { - this.type = type; - } - - Type getType() { - return type; - } - - @Override - public String toString() { - return type.toString(); - } - -} diff --git a/java8/src/test/java/io/cucumber/java8/SomeLambdaStepDefs.java b/java8/src/test/java/io/cucumber/java8/SomeLambdaStepDefs.java deleted file mode 100644 index 7a182f5531..0000000000 --- a/java8/src/test/java/io/cucumber/java8/SomeLambdaStepDefs.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.cucumber.java8; - -import cucumber.api.java8.En; - -final class SomeLambdaStepDefs implements En { - - SomeLambdaStepDefs() { - Given("I have a some step definition", () -> { - throw new Exception(); - }); - } - -} diff --git a/kotlin-java8/pom.xml b/kotlin-java8/pom.xml index 35e0785f89..650fd8b7d9 100644 --- a/kotlin-java8/pom.xml +++ b/kotlin-java8/pom.xml @@ -18,7 +18,7 @@ io.cucumber - cucumber-java8 + cucumber-java io.cucumber diff --git a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt index bd9d2bff5a..364f947c83 100644 --- a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt @@ -1,8 +1,8 @@ -package io.cucumber.runtime.kotlin.test; +package io.cucumber.kotlin; import io.cucumber.core.api.Scenario import io.cucumber.datatable.DataTable -import cucumber.api.java8.En +import io.cucumber.java.api.lambda.En import org.junit.Assert.* var lastInstance : LambdaStepdefs? = null diff --git a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt index e9d395e27d..0d9b78082e 100644 --- a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/TypeRegistryConfiguration.kt @@ -4,6 +4,7 @@ import io.cucumber.core.api.TypeRegistryConfigurer import io.cucumber.core.api.TypeRegistry import io.cucumber.datatable.DataTableType import io.cucumber.datatable.TableEntryTransformer +import io.cucumber.kotlin.LambdaStepdefs import java.util.Locale import java.util.Locale.ENGLISH diff --git a/needle/src/main/java/io/cucumber/needle/NeedleFactory.java b/needle/src/main/java/io/cucumber/needle/NeedleFactory.java index 3d07ad86a4..bc980580e1 100644 --- a/needle/src/main/java/io/cucumber/needle/NeedleFactory.java +++ b/needle/src/main/java/io/cucumber/needle/NeedleFactory.java @@ -1,6 +1,6 @@ package io.cucumber.needle; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import de.akquinet.jbosscc.needle.NeedleTestcase; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import org.slf4j.Logger; diff --git a/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java index 4662d9456b..d081bc8350 100755 --- a/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java +++ b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java @@ -5,7 +5,7 @@ import javax.inject.Inject; -import cucumber.api.java.Before; +import io.cucumber.java.api.Before; import io.cucumber.needle.test.injectionprovider.NameGetter; import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider; diff --git a/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java index b804a0e2ee..b49c1d7850 100755 --- a/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java +++ b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java @@ -6,10 +6,10 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import io.cucumber.needle.api.InjectionProviderInstancesSupplier; import io.cucumber.needle.api.NeedleInjectionProvider; import io.cucumber.needle.DefaultInstanceInjectionProvider; diff --git a/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java b/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java index f9cf7f5176..627d8b8d62 100644 --- a/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java +++ b/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java @@ -2,8 +2,8 @@ import static org.junit.Assert.assertTrue; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; import io.cucumber.needle.api.NeedleInjectionProvider; import io.cucumber.needle.DefaultInstanceInjectionProvider; import de.akquinet.jbosscc.needle.injection.InjectionProvider; diff --git a/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java b/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java index 54192bcd53..91356a78b4 100644 --- a/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java +++ b/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java @@ -1,7 +1,7 @@ package io.cucumber.openejb; import io.cucumber.core.exception.CucumberException; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import org.apache.openejb.OpenEjbContainer; import javax.ejb.embeddable.EJBContainer; diff --git a/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java b/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java index 4e42281038..3cfbc103f8 100644 --- a/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java +++ b/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java @@ -1,7 +1,7 @@ package io.cucumber.openejb; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; import javax.inject.Inject; diff --git a/openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java b/openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java index 0840c05093..89c3aae346 100644 --- a/openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java +++ b/openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java @@ -1,6 +1,6 @@ package io.cucumber.openejb; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import org.junit.Test; import static org.junit.Assert.assertNotNull; diff --git a/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java b/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java index 87f9e18d55..a1585d105c 100644 --- a/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java +++ b/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.openejb; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; public class UnusedGlue { public UnusedGlue() { diff --git a/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java b/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java index a11d9612b0..c5077c9aee 100644 --- a/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java +++ b/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java @@ -1,6 +1,6 @@ package io.cucumber.picocontainer; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import io.cucumber.core.reflection.Reflections; import org.picocontainer.MutablePicoContainer; import org.picocontainer.PicoBuilder; diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java index 8ce2ecb797..9402d4a365 100644 --- a/picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java @@ -1,6 +1,6 @@ package io.cucumber.picocontainer; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import org.junit.Test; import static org.junit.Assert.assertNotNull; diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java b/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java index 5873c3eea4..a3118a0c99 100644 --- a/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java @@ -1,11 +1,11 @@ package io.cucumber.picocontainer; -import cucumber.api.java.PendingException; +import io.cucumber.java.api.PendingException; import io.cucumber.core.api.Scenario; -import cucumber.api.java.After; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; +import io.cucumber.java.api.After; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; import java.util.Collections; import java.util.List; diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java b/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java index ebdd900f52..6841a2cdb5 100644 --- a/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.picocontainer; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; public class UnusedGlue { diff --git a/pom.xml b/pom.xml index c42377adda..fa4f86a96c 100644 --- a/pom.xml +++ b/pom.xml @@ -167,11 +167,6 @@ picocontainer ${picocontainer.version} - - io.cucumber - cucumber-java8 - ${project.version} - io.cucumber cucumber-kotlin-java8 @@ -509,7 +504,6 @@ core java - java8 kotlin-java8 testng picocontainer @@ -690,12 +684,12 @@ - Main API Packages - cucumber.api:cucumber.api.* + Core API Packages + io.cucumber.core.api.*:io.cucumber.junit.api.*:io.cucumber.testng.api.* I18n - Java - cucumber.api.java.* + io.cucumber.java.api.* diff --git a/spring/src/main/java/io/cucumber/spring/SpringFactory.java b/spring/src/main/java/io/cucumber/spring/SpringFactory.java index ef4d50bd6d..c700fb60a5 100644 --- a/spring/src/main/java/io/cucumber/spring/SpringFactory.java +++ b/spring/src/main/java/io/cucumber/spring/SpringFactory.java @@ -1,6 +1,6 @@ package io.cucumber.spring; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import io.cucumber.core.exception.CucumberException; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; diff --git a/spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java b/spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java index aab9c0acdc..7e4cfc4229 100644 --- a/spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java +++ b/spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java @@ -1,7 +1,7 @@ package io.cucumber.spring.api; -import cucumber.api.java.After; -import cucumber.api.java.Before; +import io.cucumber.java.api.After; +import io.cucumber.java.api.Before; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; diff --git a/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java b/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java index 2e5ccc5174..6fcada4ada 100644 --- a/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java +++ b/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java @@ -1,7 +1,7 @@ package io.cucumber.spring; import io.cucumber.core.exception.CucumberException; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import io.cucumber.spring.beans.BellyBean; import io.cucumber.spring.commonglue.AutowiresPlatformTransactionManager; import io.cucumber.spring.commonglue.AutowiresThirdStepDef; diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java index c4c8e11464..1932f06d37 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java @@ -1,6 +1,6 @@ package io.cucumber.spring.commonglue; -import cucumber.api.java.en.Then; +import io.cucumber.java.api.annotation.en.Then; import org.springframework.beans.factory.annotation.Autowired; import static org.junit.Assert.assertEquals; diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java index 9615dbc58a..00b577ecd8 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java @@ -2,8 +2,8 @@ import org.springframework.beans.factory.annotation.Autowired; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.When; public class OneStepDef { int cucumbers; diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java index da60dd40a5..602a9a245a 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java @@ -1,6 +1,6 @@ package io.cucumber.spring.commonglue; -import cucumber.api.java.en.Then; +import io.cucumber.java.api.annotation.en.Then; import static org.junit.Assert.assertEquals; diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java b/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java index 4e1d25c44e..01e00a5318 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java @@ -1,9 +1,9 @@ package io.cucumber.spring.commonglue; -import cucumber.api.java.After; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; +import io.cucumber.java.api.After; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; import org.springframework.transaction.support.TransactionSynchronizationManager; import static org.junit.Assert.assertFalse; diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java b/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java index 464fab2877..c0a070b209 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.spring.commonglue; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; public class UnusedGlue { public UnusedGlue() { diff --git a/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java b/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java index 232bce423d..09c513d185 100644 --- a/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java +++ b/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.spring.contextconfig; -import cucumber.api.java.en.Then; +import io.cucumber.java.api.annotation.en.Then; import io.cucumber.spring.beans.Belly; import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java index bd492d0fed..43e1dea70b 100644 --- a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java @@ -1,7 +1,7 @@ package io.cucumber.spring.dirtiescontextconfig; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; import io.cucumber.spring.beans.Belly; import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java index 22ad364a39..9b28ce8298 100644 --- a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java @@ -1,7 +1,7 @@ package io.cucumber.spring.metaconfig.dirties; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; import io.cucumber.spring.beans.Belly; import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java b/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java index a613865994..bec45758df 100644 --- a/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.spring.metaconfig.general; -import cucumber.api.java.en.Then; +import io.cucumber.java.api.annotation.en.Then; import io.cucumber.spring.beans.Belly; import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java b/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java index 0680343519..30ea5b2a2c 100644 --- a/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java @@ -5,9 +5,9 @@ import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; diff --git a/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java b/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java index 85d99ee084..e6866aac47 100644 --- a/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java @@ -1,8 +1,8 @@ package io.cucumber.spring.webappconfig; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; -import cucumber.api.java.en.When; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.annotation.en.When; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; diff --git a/weld/src/main/java/io/cucumber/weld/WeldFactory.java b/weld/src/main/java/io/cucumber/weld/WeldFactory.java index 095a9623e0..fa8f037f64 100644 --- a/weld/src/main/java/io/cucumber/weld/WeldFactory.java +++ b/weld/src/main/java/io/cucumber/weld/WeldFactory.java @@ -1,7 +1,7 @@ package io.cucumber.weld; import io.cucumber.core.exception.CucumberException; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import org.jboss.weld.environment.se.Weld; import org.jboss.weld.environment.se.WeldContainer; diff --git a/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java b/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java index 879ce2af89..0c92a83881 100644 --- a/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java +++ b/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java @@ -1,7 +1,7 @@ package io.cucumber.weld; -import cucumber.api.java.en.Given; -import cucumber.api.java.en.Then; +import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.annotation.en.Then; import javax.inject.Inject; import javax.inject.Singleton; diff --git a/weld/src/test/java/io/cucumber/weld/UnusedGlue.java b/weld/src/test/java/io/cucumber/weld/UnusedGlue.java index 3a5a437ad3..6bc5733b3e 100644 --- a/weld/src/test/java/io/cucumber/weld/UnusedGlue.java +++ b/weld/src/test/java/io/cucumber/weld/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.weld; -import cucumber.api.java.Before; -import cucumber.api.java.en.Given; +import io.cucumber.java.api.Before; +import io.cucumber.java.api.annotation.en.Given; public class UnusedGlue { public UnusedGlue() { diff --git a/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java b/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java index 59411cb013..5d28c5ea50 100644 --- a/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java +++ b/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java @@ -1,6 +1,6 @@ package io.cucumber.weld; -import cucumber.api.java.ObjectFactory; +import io.cucumber.java.api.ObjectFactory; import org.junit.Test; import static org.junit.Assert.assertNotNull; From 0bcb435174fe2032be701c8664f28a2701e754b7 Mon Sep 17 00:00:00 2001 From: John Patrick Date: Thu, 13 Sep 2018 21:28:24 +0100 Subject: [PATCH 041/155] Upgrade to Junit 5 and use assertThrows (#1461) --- core/pom.xml | 17 +++-- .../options/RuntimeOptionsFactoryTest.java | 15 ++-- .../FailedStepInstantiationMatchTest.java | 23 ++++-- .../UndefinedStepDefinitionMatchTest.java | 25 ++++--- .../io/cucumber/core/runtime/InvokerTest.java | 70 +++++++++---------- .../snippets/FunctionNameGeneratorTest.java | 11 ++- guice/pom.xml | 17 ++++- .../guice/collection/CollectionUtilTest.java | 18 +++-- java/pom.xml | 18 ++++- .../io/cucumber/java/JavaBackendTest.java | 12 +++- .../cucumber/java/JavaStepDefinitionTest.java | 16 ++++- junit/pom.xml | 13 +++- .../io/cucumber/junit/AssertionsTest.java | 16 +++-- .../java/io/cucumber/junit/CucumberTest.java | 9 ++- needle/pom.xml | 14 +++- ...reateInstanceByDefaultConstructorTest.java | 11 ++- .../LoadCucumberNeedleResourceBundleTest.java | 21 ++++-- pom.xml | 32 +++++++++ 18 files changed, 264 insertions(+), 94 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index c754d3cd4e..9fab0c04b2 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -32,11 +32,6 @@ io.cucumber datatable - - junit - junit - test - xmlunit xmlunit @@ -53,6 +48,18 @@ test + + org.junit.jupiter + junit-jupiter-api + test + + + + org.junit.vintage + junit-vintage-engine + test + + org.webbitserver webbit diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java index 757468e4c4..26d8490cd1 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java @@ -3,12 +3,13 @@ import cucumber.api.CucumberOptions; import cucumber.api.Plugin; import cucumber.api.SnippetType; -import io.cucumber.core.runner.TimeService; -import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.plugin.Plugins; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; import org.junit.Test; +import org.junit.jupiter.api.function.Executable; import java.util.Iterator; import java.util.List; @@ -18,12 +19,16 @@ import static io.cucumber.core.options.RuntimeOptionsFactory.packagePath; import static java.util.Arrays.asList; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; public class RuntimeOptionsFactoryTest { + @Test public void create_strict() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(Strict.class); @@ -183,10 +188,12 @@ public void create_with_extra_glue_in_subclass_of_glue() { assertEquals(asList("app.features.user.hooks", "app.features.user.registration", "app.features.hooks"), runtimeOptions.getGlue()); } - @Test(expected = CucumberException.class) + @Test public void cannot_create_with_glue_and_extra_glue() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(ClassWithGlueAndExtraGlue.class); - runtimeOptionsFactory.create(); + final Executable testMethod = () -> runtimeOptionsFactory.create(); + final CucumberException expectedThrown = assertThrows(CucumberException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("glue and extraGlue cannot be specified at the same time"))); } diff --git a/core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java b/core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java index 3df5f3f76a..1d5dd49a45 100644 --- a/core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/FailedStepInstantiationMatchTest.java @@ -5,12 +5,18 @@ import gherkin.pickles.PickleStep; import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.function.Executable; import static java.util.Arrays.asList; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsNull.nullValue; +import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class FailedStepInstantiationMatchTest { + private FailedPickleStepInstantiationMatch match; @Before @@ -26,13 +32,18 @@ public void create_match() { match = new FailedPickleStepInstantiationMatch("uri", step, exception); } - @Test(expected=Exception.class) - public void throws_the_exception_passed_to_the_match_when_run() throws Throwable { - match.runStep(mock(Scenario.class)); + @Test + public void throws_the_exception_passed_to_the_match_when_run() { + final Executable testMethod = () -> match.runStep(mock(Scenario.class)); + final Exception expectedThrown = assertThrows(Exception.class, testMethod); + assertThat(expectedThrown.getMessage(), is(nullValue())); } - @Test(expected=Exception.class) - public void throws_the_exception_passed_to_the_match_when_dry_run() throws Throwable { - match.dryRunStep(mock(Scenario.class)); + @Test + public void throws_the_exception_passed_to_the_match_when_dry_run() { + final Executable testMethod = () -> match.dryRunStep(mock(Scenario.class)); + final Exception expectedThrown = assertThrows(Exception.class, testMethod); + assertThat(expectedThrown.getMessage(), is(nullValue())); } + } diff --git a/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java b/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java index 2a2a09acfc..c4597d6d84 100644 --- a/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java @@ -3,22 +3,31 @@ import cucumber.api.Scenario; import gherkin.pickles.PickleStep; import org.junit.Test; +import org.junit.jupiter.api.function.Executable; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; public class UndefinedStepDefinitionMatchTest { + public final UndefinedPickleStepDefinitionMatch match = new UndefinedPickleStepDefinitionMatch(mock(PickleStep.class)); - @Test(expected=UndefinedStepDefinitionException.class) - public void throws_ambiguous_step_definitions_exception_when_run() throws Throwable { - match.runStep(mock(Scenario.class)); - fail("UndefinedStepDefinitionsException expected"); + @Test + public void throws_ambiguous_step_definitions_exception_when_run() { + final Executable testMethod = () -> match.runStep(mock(Scenario.class)); + final UndefinedStepDefinitionException expectedThrown = assertThrows(UndefinedStepDefinitionException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("No step definitions found"))); } - @Test(expected=UndefinedStepDefinitionException.class) - public void throws_ambiguous_step_definitions_exception_when_dry_run() throws Throwable { - match.dryRunStep(mock(Scenario.class)); - fail("UndefinedStepDefinitionsException expected"); + @Test + public void throws_ambiguous_step_definitions_exception_when_dry_run() { + final Executable testMethod = () -> match.dryRunStep(mock(Scenario.class)); + final UndefinedStepDefinitionException expectedThrown = assertThrows(UndefinedStepDefinitionException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("No step definitions found"))); } + } diff --git a/core/src/test/java/io/cucumber/core/runtime/InvokerTest.java b/core/src/test/java/io/cucumber/core/runtime/InvokerTest.java index 0a64c020c4..a79804f5af 100644 --- a/core/src/test/java/io/cucumber/core/runtime/InvokerTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/InvokerTest.java @@ -1,17 +1,21 @@ package io.cucumber.core.runtime; import org.junit.Test; +import org.junit.jupiter.api.function.Executable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeoutException; import static java.lang.Thread.sleep; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; public class InvokerTest { + @Test public void doesnt_time_out_if_it_doesnt_take_too_long() throws Throwable { final Slow slow = new Slow(); @@ -24,55 +28,46 @@ public String call() throws Throwable { assertEquals("slept 10ms", what); } - @Test(expected = TimeoutException.class) - public void times_out_if_it_takes_too_long() throws Throwable { + @Test + public void times_out_if_it_takes_too_long() { final Slow slow = new Slow(); - Invoker.timeout(new Invoker.Callback() { - @Override - public String call() throws Throwable { - return slow.slow(100); - } - }, 50); - fail(); + final Executable testMethod = () -> Invoker.timeout(() -> slow.slow(100), 50); + final TimeoutException expectedThrown = assertThrows(TimeoutException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("Timed out after 50ms."))); } - @Test(expected = TimeoutException.class) - public void times_out_infinite_loop_if_it_takes_too_long() throws Throwable { + @Test + public void times_out_infinite_loop_if_it_takes_too_long() { final Slow slow = new Slow(); - Invoker.timeout(new Invoker.Callback() { - @Override - public Void call() throws Throwable { - slow.infinite(); - return null; - } + final Executable testMethod = () -> Invoker.timeout((Invoker.Callback) () -> { + slow.infinite(); + return null; }, 10); - fail(); + final TimeoutException expectedThrown = assertThrows(TimeoutException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("Timed out after 10ms."))); } - @Test(expected = TimeoutException.class) - public void times_out_infinite_latch_wait_if_it_takes_too_long() throws Throwable { + @Test + public void times_out_infinite_latch_wait_if_it_takes_too_long() { final Slow slow = new Slow(); - Invoker.timeout(new Invoker.Callback() { - @Override - public Void call() throws Throwable { - slow.infiniteLatchWait(); - return null; - } + final Executable testMethod = () -> Invoker.timeout((Invoker.Callback) () -> { + slow.infiniteLatchWait(); + return null; }, 10); - fail(); + final TimeoutException expectedThrown = assertThrows(TimeoutException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("Timed out after 10ms."))); } - @Test(expected = TimeoutException.class) - public void times_out_busy_wait_if_it_takes_too_long() throws Throwable { + @Test + public void times_out_busy_wait_if_it_takes_too_long() { final Slow slow = new Slow(); - Invoker.timeout(new Invoker.Callback() { - @Override - public Void call() throws Throwable { - slow.busyWait(); - return null; - } + final Executable testMethod = () -> Invoker.timeout((Invoker.Callback) () -> { + slow.busyWait(); + return null; }, 1); + final TimeoutException expectedThrown = assertThrows(TimeoutException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("Timed out after 1ms."))); } @Test @@ -127,4 +122,5 @@ public int busyWait() throws InterruptedException { return busyCounter; } } + } diff --git a/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java b/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java index be6808d35a..62b92aef80 100644 --- a/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java +++ b/core/src/test/java/io/cucumber/core/snippets/FunctionNameGeneratorTest.java @@ -2,8 +2,13 @@ import cucumber.api.SnippetType; import org.junit.Test; +import org.junit.jupiter.api.function.Executable; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class FunctionNameGeneratorTest { @@ -15,9 +20,11 @@ private void assertFunctionNames(String expectedUnderscore, String expectedCamel assertEquals(expectedCamelCase, camelCase.generateFunctionName(sentence)); } - @Test(expected = IllegalArgumentException.class) + @Test public void testSanitizeEmptyFunctionName() { - underscore.generateFunctionName(""); + final Executable testMethod = () -> underscore.generateFunctionName(""); + final IllegalArgumentException expectedThrown = assertThrows(IllegalArgumentException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("Cannot create function name from empty sentence"))); } @Test diff --git a/guice/pom.xml b/guice/pom.xml index 599e10e3db..c5ae3edd7e 100644 --- a/guice/pom.xml +++ b/guice/pom.xml @@ -27,9 +27,22 @@ cucumber-junit test + + + org.hamcrest + hamcrest-library + test + + + + org.junit.jupiter + junit-jupiter-api + test + + - junit - junit + org.junit.vintage + junit-vintage-engine test diff --git a/guice/src/test/java/io/cucumber/guice/collection/CollectionUtilTest.java b/guice/src/test/java/io/cucumber/guice/collection/CollectionUtilTest.java index c7a61e54d3..647e9356b7 100644 --- a/guice/src/test/java/io/cucumber/guice/collection/CollectionUtilTest.java +++ b/guice/src/test/java/io/cucumber/guice/collection/CollectionUtilTest.java @@ -2,12 +2,15 @@ import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.function.Executable; import java.util.ArrayList; import java.util.List; -import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; public class CollectionUtilTest { @@ -18,14 +21,18 @@ public void setUp() { list = new ArrayList(); } - @Test(expected = NullPointerException.class) + @Test public void testNullPointerExceptionIsThrownWhenListIsNull() { - CollectionUtil.removeAllExceptFirstElement(null); + final Executable testMethod = () -> CollectionUtil.removeAllExceptFirstElement(null); + final NullPointerException expectedThrown = assertThrows(NullPointerException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("List must not be null."))); } - @Test(expected = IllegalArgumentException.class) + @Test public void testIllegalArgumentExceptionIsThrownWhenListIsEmpty() { - CollectionUtil.removeAllExceptFirstElement(list); + final Executable testMethod = () -> CollectionUtil.removeAllExceptFirstElement(list); + final IllegalArgumentException expectedThrown = assertThrows(IllegalArgumentException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("List must contain at least one element."))); } @Test @@ -56,4 +63,5 @@ private void assertThatListContainsOneElement(String element) { assertThat(list.size(), equalTo(1)); assertThat(list.get(0), equalTo(element)); } + } diff --git a/java/pom.xml b/java/pom.xml index 446292b7c1..3024fb15cd 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -22,11 +22,25 @@ cucumber-junit test + + + org.hamcrest + hamcrest-library + test + + - junit - junit + org.junit.jupiter + junit-jupiter-api test + + + org.junit.vintage + junit-vintage-engine + test + + org.mockito mockito-core diff --git a/java/src/test/java/io/cucumber/java/JavaBackendTest.java b/java/src/test/java/io/cucumber/java/JavaBackendTest.java index be7ce641e5..d23878e815 100644 --- a/java/src/test/java/io/cucumber/java/JavaBackendTest.java +++ b/java/src/test/java/io/cucumber/java/JavaBackendTest.java @@ -12,12 +12,17 @@ import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.function.Executable; import java.util.Locale; import static java.lang.Thread.currentThread; import static java.util.Arrays.asList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class JavaBackendTest { @@ -50,10 +55,12 @@ public void finds_step_definitions_by_package_name() { assertEquals(Stepdefs.class, factory.getInstance(Stepdefs.class).getClass()); } - @Test(expected = CucumberException.class) + @Test public void detects_subclassed_glue_and_throws_exception() { GlueStub glue = new GlueStub(); - backend.loadGlue(glue, asList("io.cucumber.java.stepdefs", "io.cucumber.java.incorrectlysubclassedstepdefs")); + final Executable testMethod = () -> backend.loadGlue(glue, asList("io.cucumber.java.stepdefs", "io.cucumber.java.incorrectlysubclassedstepdefs")); + final CucumberException expectedThrown = assertThrows(CucumberException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("You're not allowed to extend classes that define Step Definitions or hooks. class io.cucumber.java.incorrectlysubclassedstepdefs.SubclassesStepdefs extends class io.cucumber.java.stepdefs.Stepdefs"))); } private class GlueStub implements Glue { @@ -84,4 +91,5 @@ public void addAfterHook(HookDefinition hookDefinition) { } } + } diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index d7180199df..b054f6cfaa 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -33,16 +33,23 @@ import java.util.Locale; import io.cucumber.core.stepexpression.TypeRegistry; +import org.junit.jupiter.api.function.Executable; import static java.lang.Thread.currentThread; import static java.util.Arrays.asList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.hamcrest.core.StringStartsWith.startsWith; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; public class JavaStepDefinitionTest { + private static final Method THREE_DISABLED_MICE; private static final Method THREE_BLIND_ANIMALS; private static final String ENGLISH = "en"; @@ -87,10 +94,12 @@ public void receive(TestStepFinished event) { }); } - @Test(expected = DuplicateStepDefinitionException.class) - public void throws_duplicate_when_two_stepdefs_with_same_regexp_found() throws Throwable { + @Test + public void throws_duplicate_when_two_stepdefs_with_same_regexp_found() { backend.addStepDefinition(THREE_BLIND_ANIMALS.getAnnotation(Given.class), THREE_DISABLED_MICE); - backend.addStepDefinition(THREE_BLIND_ANIMALS.getAnnotation(Given.class), THREE_BLIND_ANIMALS); + final Executable testMethod = () -> backend.addStepDefinition(THREE_BLIND_ANIMALS.getAnnotation(Given.class), THREE_BLIND_ANIMALS); + final DuplicateStepDefinitionException expectedThrown = assertThrows(DuplicateStepDefinitionException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(startsWith("Duplicate step definitions in io.cucumber.java.JavaStepDefinitionTest$Defs.threeDisabledMice(String) in file:"))); } @Test @@ -136,4 +145,5 @@ public void threeBlindAnimals(String animals) { bar = true; } } + } diff --git a/junit/pom.xml b/junit/pom.xml index a7e09ee78b..b753305203 100644 --- a/junit/pom.xml +++ b/junit/pom.xml @@ -20,7 +20,18 @@ junit junit - + + org.hamcrest + hamcrest-library + + + org.junit.jupiter + junit-jupiter-api + + + org.junit.vintage + junit-vintage-engine + org.mockito mockito-core diff --git a/junit/src/test/java/io/cucumber/junit/AssertionsTest.java b/junit/src/test/java/io/cucumber/junit/AssertionsTest.java index 63d4bceeba..58eb6cde4e 100644 --- a/junit/src/test/java/io/cucumber/junit/AssertionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/AssertionsTest.java @@ -3,20 +3,26 @@ import cucumber.api.junit.Cucumber; import io.cucumber.core.exception.CucumberException; import org.junit.Test; +import org.junit.jupiter.api.function.Executable; import org.junit.runner.RunWith; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -public class AssertionsTest { +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.jupiter.api.Assertions.assertThrows; +public class AssertionsTest { - @Test(expected = CucumberException.class) + @Test public void should_throw_cucumber_exception_when_annotated() { - Assertions.assertNoCucumberAnnotatedMethods(WithCucumberMethod.class); + final Executable testMethod = () -> Assertions.assertNoCucumberAnnotatedMethods(WithCucumberMethod.class); + final CucumberException expectedThrown = assertThrows(CucumberException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("\n\nClasses annotated with @RunWith(Cucumber.class) must not define any\nStep Definition or Hook methods. Their sole purpose is to serve as\nan entry point for JUnit. Step Definitions and Hooks should be defined\nin their own classes. This allows them to be reused across features.\nOffending class: class io.cucumber.junit.AssertionsTest$WithCucumberMethod\n"))); } - @RunWith(Cucumber.class) public final static class WithCucumberMethod { @@ -30,4 +36,4 @@ public void before() { @interface StubCucumberAnnotation { } -} \ No newline at end of file +} diff --git a/junit/src/test/java/io/cucumber/junit/CucumberTest.java b/junit/src/test/java/io/cucumber/junit/CucumberTest.java index 6aa38ee511..8f6798ed36 100644 --- a/junit/src/test/java/io/cucumber/junit/CucumberTest.java +++ b/junit/src/test/java/io/cucumber/junit/CucumberTest.java @@ -8,6 +8,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.experimental.ParallelComputer; +import org.junit.jupiter.api.function.Executable; import org.junit.runner.Description; import org.junit.runner.Request; import org.junit.runner.RunWith; @@ -22,11 +23,13 @@ import static java.util.Collections.emptyList; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.argThat; public class CucumberTest { @@ -177,9 +180,11 @@ public void no_stepdefs_in_cucumber_runner_valid() { Assertions.assertNoCucumberAnnotatedMethods(RunCukesTestValidIgnored.class); } - @Test(expected = CucumberException.class) + @Test public void no_stepdefs_in_cucumber_runner_invalid() { - Assertions.assertNoCucumberAnnotatedMethods(RunCukesTestInvalid.class); + final Executable testMethod = () -> Assertions.assertNoCucumberAnnotatedMethods(RunCukesTestInvalid.class); + final CucumberException expectedThrown = assertThrows(CucumberException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("\n\nClasses annotated with @RunWith(Cucumber.class) must not define any\nStep Definition or Hook methods. Their sole purpose is to serve as\nan entry point for JUnit. Step Definitions and Hooks should be defined\nin their own classes. This allows them to be reused across features.\nOffending class: class io.cucumber.junit.CucumberTest$RunCukesTestInvalid\n"))); } public class ImplicitFeatureAndGluePath { diff --git a/needle/pom.xml b/needle/pom.xml index 2bfd609c77..b118111b4a 100644 --- a/needle/pom.xml +++ b/needle/pom.xml @@ -26,8 +26,18 @@ test - junit - junit + org.hamcrest + hamcrest-library + test + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.vintage + junit-vintage-engine test diff --git a/needle/src/test/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructorTest.java b/needle/src/test/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructorTest.java index be3fa56677..b0388e618c 100644 --- a/needle/src/test/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructorTest.java +++ b/needle/src/test/java/io/cucumber/needle/config/CreateInstanceByDefaultConstructorTest.java @@ -1,8 +1,13 @@ package io.cucumber.needle.config; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.Test; +import org.junit.jupiter.api.function.Executable; public class CreateInstanceByDefaultConstructorTest { @@ -23,9 +28,11 @@ public void shouldCreateNewInstance() { assertNotNull(createInstanceByDefaultConstructor.apply(HasDefaultConstructor.class)); } - @Test(expected = IllegalStateException.class) + @Test public void shouldNotCreateNewInstanceWhenConstructorIsMissing() { - createInstanceByDefaultConstructor.apply(DoesNotHaveDefaultConstructor.class); + final Executable testMethod = () -> createInstanceByDefaultConstructor.apply(DoesNotHaveDefaultConstructor.class); + final IllegalStateException expectedThrown = assertThrows(IllegalStateException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("Can not instantiate Instance by Default Constructor."))); } } diff --git a/needle/src/test/java/io/cucumber/needle/config/LoadCucumberNeedleResourceBundleTest.java b/needle/src/test/java/io/cucumber/needle/config/LoadCucumberNeedleResourceBundleTest.java index 4ec5d6868c..898d65a999 100644 --- a/needle/src/test/java/io/cucumber/needle/config/LoadCucumberNeedleResourceBundleTest.java +++ b/needle/src/test/java/io/cucumber/needle/config/LoadCucumberNeedleResourceBundleTest.java @@ -1,15 +1,18 @@ package io.cucumber.needle.config; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.ResourceBundle; import org.hamcrest.CoreMatchers; import org.junit.Test; +import org.junit.jupiter.api.function.Executable; public class LoadCucumberNeedleResourceBundleTest { @@ -38,19 +41,25 @@ public void shouldAlwaysReturnEmptyForEmptyResourceBundle() throws Exception { assertFalse(resourceBundle.getKeys().hasMoreElements()); } - @Test(expected = IllegalArgumentException.class) + @Test public void shouldFailWhenResourceNameIsNull() { - function.apply(null); + final Executable testMethod = () -> function.apply(null); + final IllegalArgumentException expectedThrown = assertThrows(IllegalArgumentException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("resourceName must not be null or empty!"))); } - @Test(expected = IllegalArgumentException.class) + @Test public void shouldFailWhenResourceNameIsEmpty() { - function.apply(""); + final Executable testMethod = () -> function.apply(""); + final IllegalArgumentException expectedThrown = assertThrows(IllegalArgumentException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("resourceName must not be null or empty!"))); } - @Test(expected = IllegalArgumentException.class) + @Test public void shouldFailWhenResourceNameIsBlank() { - function.apply(" "); + final Executable testMethod = () -> function.apply(" "); + final IllegalArgumentException expectedThrown = assertThrows(IllegalArgumentException.class, testMethod); + assertThat(expectedThrown.getMessage(), is(equalTo("resourceName must not be null or empty!"))); } } diff --git a/pom.xml b/pom.xml index f133dcfef9..e26666d86c 100644 --- a/pom.xml +++ b/pom.xml @@ -314,6 +314,21 @@ hamcrest-library ${hamcrest.version} + + org.junit.jupiter + junit-jupiter-api + 5.3.1 + + + org.junit.jupiter + junit-jupiter-engine + 5.3.1 + + + org.junit.vintage + junit-vintage-engine + 5.3.1 + uk.co.datumedge hamcrest-json @@ -747,6 +762,23 @@ -Dfile.encoding=UTF-8 false + + + org.junit.jupiter + junit-jupiter-engine + 5.3.1 + + + org.junit.platform + junit-platform-engine + 1.3.1 + + + org.junit.vintage + junit-vintage-engine + 5.3.1 + + From 7c78dac9bf9508354d5c0df8b2569f1d46482013 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Thu, 13 Sep 2018 22:45:38 +0200 Subject: [PATCH 042/155] Fix merge problems in WeldFactoryTest --- weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java b/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java index 090d8540ad..e2fbf960db 100644 --- a/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java +++ b/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java @@ -1,6 +1,8 @@ package io.cucumber.weld; +import io.cucumber.core.exception.CucumberException; import io.cucumber.java.api.ObjectFactory; + import org.jboss.weld.environment.se.Weld; import org.junit.After; import org.junit.Before; @@ -91,7 +93,7 @@ public void stopCalledWithoutStart() { "and we can't do much to fix it in Cucumber-JVM.\n" + "\n" + "java.lang.NullPointerException\n" + - "\tat cucumber.runtime.java.weld.WeldFactory.stop"; + "\tat io.cucumber.weld.WeldFactory.stop"; assertThat(this.errContent.toString(), is(startsWith(expectedErrOutput))); } From 62bf1f0b52dc603ad3c09236cb000a641cce4485 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Fri, 14 Sep 2018 00:36:56 +0200 Subject: [PATCH 043/155] [Docs] Replace package html with package-info.java --- .../api/event/ConcurrentEventListener.java | 1 - .../cucumber/core/options/RuntimeOptions.java | 14 +- .../cucumber/core/plugin/PluginFactory.java | 1 - .../io/cucumber/core/snippets/Snippet.java | 1 - .../guice/{impl => }/GuiceFactory.java | 2 +- .../{impl => }/InjectorSourceFactory.java | 2 +- .../InjectorSourceInstantiationFailed.java | 2 +- .../java/io/cucumber/guice/api/README.java | 8 - .../io/cucumber/guice/api/package-info.java | 152 ++++++++++++++++++ .../java/io/cucumber/guice/api/package.html | 150 ----------------- .../java/io/cucumber/guice/package-info.java | 8 + .../guice/{impl => }/GuiceFactoryTest.java | 3 +- .../{impl => }/InjectorSourceFactoryTest.java | 4 +- .../main/groovy/generate-annotations.groovy | 20 +-- .../main/groovy/generate-interfaces.groovy | 12 +- java/src/main/groovy/lambda.java.gsp | 8 +- .../io/cucumber/needle/api/package-info.java | 7 + .../java/io/cucumber/needle/api/package.html | 10 -- .../java/io/cucumber/needle/package-info.java | 8 + .../main/java/io/cucumber/openejb/README.java | 5 - .../io/cucumber/openejb/package-info.java | 7 + .../java/io/cucumber/openejb/package.html | 6 - .../io/cucumber/picocontainer/README.java | 5 - .../cucumber/picocontainer/package-info.java | 8 + .../io/cucumber/picocontainer/package.html | 6 - pom.xml | 27 ++-- .../java/io/cucumber/spring/api/package.html | 6 - .../java/io/cucumber/spring/package-info.java | 7 + .../main/java/cucumber/api/weld/README.java | 5 - .../main/java/cucumber/api/weld/package.html | 6 - .../java/io/cucumber/weld/package-info.java | 7 + 31 files changed, 261 insertions(+), 247 deletions(-) rename guice/src/main/java/io/cucumber/guice/{impl => }/GuiceFactory.java (97%) rename guice/src/main/java/io/cucumber/guice/{impl => }/InjectorSourceFactory.java (98%) rename guice/src/main/java/io/cucumber/guice/{impl => }/InjectorSourceInstantiationFailed.java (88%) delete mode 100644 guice/src/main/java/io/cucumber/guice/api/README.java create mode 100644 guice/src/main/java/io/cucumber/guice/api/package-info.java delete mode 100644 guice/src/main/java/io/cucumber/guice/api/package.html create mode 100644 guice/src/main/java/io/cucumber/guice/package-info.java rename guice/src/test/java/io/cucumber/guice/{impl => }/GuiceFactoryTest.java (99%) rename guice/src/test/java/io/cucumber/guice/{impl => }/InjectorSourceFactoryTest.java (98%) create mode 100644 needle/src/main/java/io/cucumber/needle/api/package-info.java delete mode 100644 needle/src/main/java/io/cucumber/needle/api/package.html create mode 100644 needle/src/main/java/io/cucumber/needle/package-info.java delete mode 100644 openejb/src/main/java/io/cucumber/openejb/README.java create mode 100644 openejb/src/main/java/io/cucumber/openejb/package-info.java delete mode 100644 openejb/src/main/java/io/cucumber/openejb/package.html delete mode 100644 picocontainer/src/main/java/io/cucumber/picocontainer/README.java create mode 100644 picocontainer/src/main/java/io/cucumber/picocontainer/package-info.java delete mode 100644 picocontainer/src/main/java/io/cucumber/picocontainer/package.html delete mode 100644 spring/src/main/java/io/cucumber/spring/api/package.html create mode 100644 spring/src/main/java/io/cucumber/spring/package-info.java delete mode 100644 weld/src/main/java/cucumber/api/weld/README.java delete mode 100644 weld/src/main/java/cucumber/api/weld/package.html create mode 100644 weld/src/main/java/io/cucumber/weld/package-info.java diff --git a/core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java b/core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java index 616e24b9ca..4f6eed43c0 100644 --- a/core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java +++ b/core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java @@ -23,7 +23,6 @@ * will return different a different thread for two test cases * executed on a different thread (but not necessarily the * executing thread). - *

    * * @see Event */ diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 687a838772..669147c6fe 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -1,16 +1,16 @@ package io.cucumber.core.options; +import gherkin.GherkinDialect; +import gherkin.GherkinDialectProvider; +import gherkin.IGherkinDialectProvider; import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.datatable.DataTable; import io.cucumber.core.model.PathWithLines; import io.cucumber.core.util.FixJava; import io.cucumber.core.util.Mapper; -import gherkin.GherkinDialect; -import gherkin.GherkinDialectProvider; -import gherkin.IGherkinDialectProvider; +import io.cucumber.datatable.DataTable; import java.io.IOException; import java.io.InputStreamReader; @@ -75,10 +75,10 @@ public String map(String keyword) { /** * Create a new instance from a list of options, for example: - *

    - * + *

    {@code Arrays.asList("--name", "the fox", "--plugin", "pretty", "--strict");}
    * - * @param argv the arguments + * @param resourceLoader used to load rerun files + * @param argv the arguments */ public RuntimeOptions(ResourceLoader resourceLoader, List argv) { this(resourceLoader, Env.INSTANCE, argv); diff --git a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java index 92c256bf25..308029d538 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java +++ b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java @@ -20,7 +20,6 @@ *

    * The String is of the form name[:output] where name is either a fully qualified class name or one of the built-in * short names. The output is optional for some plugins (and mandatory for some). - * * * @see Plugin for specific requirements */ diff --git a/core/src/main/java/io/cucumber/core/snippets/Snippet.java b/core/src/main/java/io/cucumber/core/snippets/Snippet.java index be8be60daf..2d76505d4f 100644 --- a/core/src/main/java/io/cucumber/core/snippets/Snippet.java +++ b/core/src/main/java/io/cucumber/core/snippets/Snippet.java @@ -7,7 +7,6 @@ public interface Snippet { /** * @return a {@link java.text.MessageFormat} template used to generate a snippet. The template can access the * following variables: - *

    *

      *
    • {0} : Step Keyword
    • *
    • {1} : Value of {@link #escapePattern(String)}
    • diff --git a/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java b/guice/src/main/java/io/cucumber/guice/GuiceFactory.java similarity index 97% rename from guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java rename to guice/src/main/java/io/cucumber/guice/GuiceFactory.java index e39b9c740b..c3a96d326c 100644 --- a/guice/src/main/java/io/cucumber/guice/impl/GuiceFactory.java +++ b/guice/src/main/java/io/cucumber/guice/GuiceFactory.java @@ -1,4 +1,4 @@ -package io.cucumber.guice.impl; +package io.cucumber.guice; import com.google.inject.Injector; import io.cucumber.java.api.ObjectFactory; diff --git a/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java b/guice/src/main/java/io/cucumber/guice/InjectorSourceFactory.java similarity index 98% rename from guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java rename to guice/src/main/java/io/cucumber/guice/InjectorSourceFactory.java index 7cf2caca60..5c1305e4d9 100644 --- a/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceFactory.java +++ b/guice/src/main/java/io/cucumber/guice/InjectorSourceFactory.java @@ -1,4 +1,4 @@ -package io.cucumber.guice.impl; +package io.cucumber.guice; import com.google.inject.Guice; import com.google.inject.Stage; diff --git a/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java b/guice/src/main/java/io/cucumber/guice/InjectorSourceInstantiationFailed.java similarity index 88% rename from guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java rename to guice/src/main/java/io/cucumber/guice/InjectorSourceInstantiationFailed.java index 8254682e9a..5befc8f9da 100644 --- a/guice/src/main/java/io/cucumber/guice/impl/InjectorSourceInstantiationFailed.java +++ b/guice/src/main/java/io/cucumber/guice/InjectorSourceInstantiationFailed.java @@ -1,4 +1,4 @@ -package io.cucumber.guice.impl; +package io.cucumber.guice; import io.cucumber.core.exception.CucumberException; diff --git a/guice/src/main/java/io/cucumber/guice/api/README.java b/guice/src/main/java/io/cucumber/guice/api/README.java deleted file mode 100644 index 55e41f0e6b..0000000000 --- a/guice/src/main/java/io/cucumber/guice/api/README.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.cucumber.guice.api; - - -/** - * Please see package documentation in package.html - */ -public class README { -} diff --git a/guice/src/main/java/io/cucumber/guice/api/package-info.java b/guice/src/main/java/io/cucumber/guice/api/package-info.java new file mode 100644 index 0000000000..f83f56e1df --- /dev/null +++ b/guice/src/main/java/io/cucumber/guice/api/package-info.java @@ -0,0 +1,152 @@ +/** + * Cucumber Guice configuration Api + *

      + * This module allows you to use Google Guice dependency injection in your Cucumber tests. Guice comes as standard with + * singleton scope and 'no scope'. This module adds Cucumber scenario scope to the scopes available for use in your + * test code. The rest of this documentation assumes you have at least a basic understanding of Guice. Please refer to + * the Guice wiki if necessary, see + * https://github.com/google/guice/wiki/Motivation + *

      + *

      About scopes, injectors and migration from earlier versions

      + *

      + * It's important to realise the differences in how this module functions when compared with earlier versions. The + * changes are as follows. + *

      + *

      Version 1.1.7 and earlier

      + *

      + * A Guice injector is created at the start of each test scenario and is destroyed at the end of each test scenario. + * There is no scenario scope, just singleton and 'no scope'. + *

      + *

      Version 1.1.8 onwards

      + *

      + * A Guice injector is created once before any tests are run and is destroyed after the last test has run. Before each + * test scenario a new scenario scope is created. At the end of the test scenario the scenario scope is destroyed. + * Singleton scope exists throughout all test scenarios. + *

      + *

      Migrating to version 1.1.8 or later

      + *

      + * Users wishing to migrate should replace @Singleton annotations with @ScenarioScope + * annotations. Guice modules should also have their singleton bindings updated. All bindings in + * Scopes.SINGLETON should be replaced with bindings in CucumberScopes.SCENARIO. + *

      + *

      Using the module

      + *

      + * By including the cucumber-guice jar on your CLASSPATH your Step Definitions will be + * instantiated by Guice. There are two main modes of using the module: with scope annotations and with module + * bindings. The two modes can also be mixed. When mixing modes it is important to realise that binding a class in a + * scope in a module takes precedence if the same class is also bound using a scope annotation. + *

      + *

      Scoping your step definitions

      + *

      + * Usually you will want to bind your step definition classes in either scenario scope or in singleton scope. It is not + * recommended to leave your step definition classes with no scope as it means that Cucumber will instantiate a new + * instance of the class for each step within a scenario that uses that step definition. + *

      + *

      Scenario scope

      + *

      + * Cucumber will create exactly one instance of a class bound in scenario scope for each scenario in which it is used. + * You should use scenario scope when you want to store state during a scenario but do not want the state to interfere + * with subsequent scenarios. + *

      + *

      + *

      Singleton scope

      + *

      + * Cucumber will create just one instance of a class bound in singleton scope that will last for the lifetime of all + * test scenarios in the test run. You should use singleton scope if your classes are stateless. You can also use + * singleton scope when your classes contain state but with caution. You should be absolutely sure that a state change + * in one scenario could not possibly influence the success or failure of a subsequent scenario. As an example of when + * you might use a singleton, imagine you have an http client that is expensive to create. By holding a reference to + * the client in a class bound in singleton scope you can reuse the client in multiple scenarios. + *

      + *

      Using scope annotations

      + *

      + * This is the easy route if you're new to Guice. To bind a class in scenario scope add the + * io.cucumber.guice.api.ScenarioScoped annotation to the class definition. The class should have + * a no-args constructor or one constructor that is annotated with javax.inject.Inject. For example: + *

      + *
      + * import cucumber.runtime.java.guice.ScenarioScoped;
      + * import javax.inject.Inject;
      + *
      + * {@literal @}ScenarioScoped
      + * public class ScenarioScopedSteps {
      + *
      + * private final Object someInjectedDependency;
      + *
      + * {@literal @}Inject
      + * public ScenarioScopedSteps(Object someInjectedDependency) {
      + * this.someInjectedDependency = someInjectedDependency;
      + * }
      + *
      + * ...
      + * }
      + * 
      + *

      + * To bind a class in singleton scope add the javax.inject.Singleton annotation to the class definition. + * One strategy for using stateless step definitions is to use providers to share stateful scenario scoped instances + * between stateless singleton step definition instances. For example: + *

      + *
      + * import javax.inject.Inject;
      + * import javax.inject.Singleton;
      + *
      + * {@literal @}Singleton
      + * public class MyStatelessSteps {
      + *
      + * private final Provider<MyStatefulObject> providerMyStatefulObject;
      + *
      + * {@literal @}Inject
      + * public MyStatelessSteps(Provider<MyStatefulObject> providerMyStatefulObject) {
      + * this.providerMyStatefulObject = providerMyStatefulObject;
      + * }
      + *
      + * {@literal @}Given("^I have (\\d+) cukes in my belly$")
      + * public void I_have_cukes_in_my_belly(int n) {
      + * providerMyStatefulObject.get().iHaveCukesInMyBelly(n);
      + * }
      + *
      + * ...
      + * }
      + * 
      + *

      + * There is an alternative explanation of using + * + * providers for mixing scopes on the Guice wiki. + *

      + *

      Using module bindings

      + *

      + * As an alternative to using annotations you may prefer to declare Guice bindings in a class that implements + * com.google.inject.Module. To do this you should create a class that implements + * io.cucumber.guice.api.InjectorSource. This gives you complete control over how you obtain a + * Guice injector and it's Guice modules. The injector must provide a binding for + * io.cucumber.guice.api.ScenarioScope. It should also provide a binding for the + * io.cucumber.guice.api.ScenarioScoped annotation if your classes are using the annotation. The + * easiest way to do this it to use CucumberModules.SCENARIO. For example: + *

      + *
      + * import com.google.inject.Guice;
      + * import com.google.inject.Injector;
      + * import com.google.inject.Stage;
      + * import cucumber.api.guice.CucumberModules;
      + * import cucumber.runtime.java.guice.InjectorSource;
      + *
      + * public class YourInjectorSource implements InjectorSource {
      + *
      + * {@literal @}Override
      + * public Injector getInjector() {
      + * return Guice.createInjector(Stage.PRODUCTION, CucumberModules.SCENARIO, new YourModule());
      + * }
      + * }
      + * 
      + *

      + * Cucumber needs to know where to find the io.cucumber.guice.api.InjectorSource that it will use. + * You should create a properties file called cucumber.properties and place it in the root of the + * classpath. The file should contain a single property key called guice.injector-source with a value + * equal to the fully qualified name of the io.cucumber.guice.api.InjectorSource. For example: + *

      + *
      + * guice.injector-source=com.company.YourInjectorSource
      + * 
      + */ +package io.cucumber.guice.api; diff --git a/guice/src/main/java/io/cucumber/guice/api/package.html b/guice/src/main/java/io/cucumber/guice/api/package.html deleted file mode 100644 index 79ce44ca8a..0000000000 --- a/guice/src/main/java/io/cucumber/guice/api/package.html +++ /dev/null @@ -1,150 +0,0 @@ - -

      - This module allows you to use Google Guice dependency injection in your Cucumber tests. Guice comes as standard with - singleton scope and 'no scope'. This module adds Cucumber scenario scope to the scopes available for use in your - test code. The rest of this documentation assumes you have at least a basic understanding of Guice. Please refer to - the Guice wiki if necessary, see - https://github.com/google/guice/wiki/Motivation -

      -

      About scopes, injectors and migration from earlier versions

      -

      - It's important to realise the differences in how this module functions when compared with earlier versions. The - changes are as follows. -

      -

      Version 1.1.7 and earlier

      -

      - A Guice injector is created at the start of each test scenario and is destroyed at the end of each test scenario. - There is no scenario scope, just singleton and 'no scope'. -

      -

      Version 1.1.8 onwards

      -

      - A Guice injector is created once before any tests are run and is destroyed after the last test has run. Before each - test scenario a new scenario scope is created. At the end of the test scenario the scenario scope is destroyed. - Singleton scope exists throughout all test scenarios. -

      -

      Migrating to version 1.1.8 or later

      -

      - Users wishing to migrate should replace @Singleton annotations with @ScenarioScope - annotations. Guice modules should also have their singleton bindings updated. All bindings in - Scopes.SINGLETON should be replaced with bindings in CucumberScopes.SCENARIO. -

      -

      Using the module

      -

      - By including the cucumber-guice jar on your CLASSPATH your Step Definitions will be - instantiated by Guice. There are two main modes of using the module: with scope annotations and with module - bindings. The two modes can also be mixed. When mixing modes it is important to realise that binding a class in a - scope in a module takes precedence if the same class is also bound using a scope annotation. -

      -

      Scoping your step definitions

      -

      - Usually you will want to bind your step definition classes in either scenario scope or in singleton scope. It is not - recommended to leave your step definition classes with no scope as it means that Cucumber will instantiate a new - instance of the class for each step within a scenario that uses that step definition. -

      -

      Scenario scope

      -

      - Cucumber will create exactly one instance of a class bound in scenario scope for each scenario in which it is used. - You should use scenario scope when you want to store state during a scenario but do not want the state to interfere - with subsequent scenarios. -

      -

      -

      Singleton scope

      -

      - Cucumber will create just one instance of a class bound in singleton scope that will last for the lifetime of all - test scenarios in the test run. You should use singleton scope if your classes are stateless. You can also use - singleton scope when your classes contain state but with caution. You should be absolutely sure that a state change - in one scenario could not possibly influence the success or failure of a subsequent scenario. As an example of when - you might use a singleton, imagine you have an http client that is expensive to create. By holding a reference to - the client in a class bound in singleton scope you can reuse the client in multiple scenarios. -

      -

      Using scope annotations

      -

      - This is the easy route if you're new to Guice. To bind a class in scenario scope add the - io.cucumber.guice.api.ScenarioScoped annotation to the class definition. The class should have - a no-args constructor or one constructor that is annotated with javax.inject.Inject. For example: -

      -
      -        import cucumber.runtime.java.guice.ScenarioScoped;
      -        import javax.inject.Inject;
      -
      -        {@literal @}ScenarioScoped
      -        public class ScenarioScopedSteps {
      -
      -            private final Object someInjectedDependency;
      -
      -            {@literal @}Inject
      -            public ScenarioScopedSteps(Object someInjectedDependency) {
      -                this.someInjectedDependency = someInjectedDependency;
      -            }
      -
      -            ...
      -        }
      -    
      -

      - To bind a class in singleton scope add the javax.inject.Singleton annotation to the class definition. - One strategy for using stateless step definitions is to use providers to share stateful scenario scoped instances - between stateless singleton step definition instances. For example: -

      -
      -        import javax.inject.Inject;
      -        import javax.inject.Singleton;
      -
      -        {@literal @}Singleton
      -        public class MyStatelessSteps {
      -
      -            private final Provider<MyStatefulObject> providerMyStatefulObject;
      -
      -            {@literal @}Inject
      -            public MyStatelessSteps(Provider<MyStatefulObject> providerMyStatefulObject) {
      -                this.providerMyStatefulObject = providerMyStatefulObject;
      -            }
      -
      -            {@literal @}Given("^I have (\\d+) cukes in my belly$")
      -            public void I_have_cukes_in_my_belly(int n) {
      -                providerMyStatefulObject.get().iHaveCukesInMyBelly(n);
      -            }
      -
      -            ...
      -        }
      -    
      -

      - There is an alternative explanation of using - - providers for mixing scopes on the Guice wiki. -

      -

      Using module bindings

      -

      - As an alternative to using annotations you may prefer to declare Guice bindings in a class that implements - com.google.inject.Module. To do this you should create a class that implements - io.cucumber.guice.api.InjectorSource. This gives you complete control over how you obtain a - Guice injector and it's Guice modules. The injector must provide a binding for - io.cucumber.guice.api.ScenarioScope. It should also provide a binding for the - io.cucumber.guice.api.ScenarioScoped annotation if your classes are using the annotation. The - easiest way to do this it to use CucumberModules.SCENARIO. For example: -

      -
      -        import com.google.inject.Guice;
      -        import com.google.inject.Injector;
      -        import com.google.inject.Stage;
      -        import cucumber.api.guice.CucumberModules;
      -        import cucumber.runtime.java.guice.InjectorSource;
      -
      -        public class YourInjectorSource implements InjectorSource {
      -
      -            {@literal @}Override
      -            public Injector getInjector() {
      -                return Guice.createInjector(Stage.PRODUCTION, CucumberModules.SCENARIO, new YourModule());
      -            }
      -        }
      -    
      -

      - Cucumber needs to know where to find the io.cucumber.guice.api.InjectorSource that it will use. - You should create a properties file called cucumber.properties and place it in the root of the - classpath. The file should contain a single property key called guice.injector-source with a value - equal to the fully qualified name of the io.cucumber.guice.api.InjectorSource. For example: -

      -
      -        guice.injector-source=com.company.YourInjectorSource
      -    
      - diff --git a/guice/src/main/java/io/cucumber/guice/package-info.java b/guice/src/main/java/io/cucumber/guice/package-info.java new file mode 100644 index 0000000000..aa38ae1963 --- /dev/null +++ b/guice/src/main/java/io/cucumber/guice/package-info.java @@ -0,0 +1,8 @@ +/** + * Enables dependency injection by Guice + *

      + * By including the cucumber-guice on your CLASSPATH your step definitions will be + * instantiated by Guice. + */ +package io.cucumber.guice; + diff --git a/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java similarity index 99% rename from guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java rename to guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java index fc5893aee5..3b0a3ca4e0 100644 --- a/guice/src/test/java/io/cucumber/guice/impl/GuiceFactoryTest.java +++ b/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java @@ -1,4 +1,4 @@ -package io.cucumber.guice.impl; +package io.cucumber.guice; import com.google.inject.AbstractModule; import com.google.inject.Guice; @@ -6,6 +6,7 @@ import com.google.inject.Module; import com.google.inject.Scopes; import com.google.inject.Stage; +import io.cucumber.guice.GuiceFactory; import io.cucumber.java.api.ObjectFactory; import io.cucumber.guice.api.CucumberModules; import io.cucumber.guice.api.CucumberScopes; diff --git a/guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/InjectorSourceFactoryTest.java similarity index 98% rename from guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java rename to guice/src/test/java/io/cucumber/guice/InjectorSourceFactoryTest.java index c267538069..383c8428bf 100644 --- a/guice/src/test/java/io/cucumber/guice/impl/InjectorSourceFactoryTest.java +++ b/guice/src/test/java/io/cucumber/guice/InjectorSourceFactoryTest.java @@ -1,7 +1,9 @@ -package io.cucumber.guice.impl; +package io.cucumber.guice; import com.google.inject.Injector; import io.cucumber.core.options.Env; +import io.cucumber.guice.InjectorSourceFactory; +import io.cucumber.guice.InjectorSourceInstantiationFailed; import io.cucumber.guice.api.InjectorSource; import org.junit.Test; diff --git a/java/src/main/groovy/generate-annotations.groovy b/java/src/main/groovy/generate-annotations.groovy index bc3b681656..7f1c7cac01 100644 --- a/java/src/main/groovy/generate-annotations.groovy +++ b/java/src/main/groovy/generate-annotations.groovy @@ -24,14 +24,14 @@ def localeFor(lang) { } // TODO: Need to add i18n.getName() and i18n.getNative() for better names. -def package_html = """\ - -

      - \${locale.getDisplayLanguage()} -

      - +def package_info_java = """\ +/** + * \${locale.getDisplayLanguage()} + */ +package io.cucumber.java.api.annotation.\${normalized_language}; """ + def unsupported = ["em"] // The generated files for Emoij do not compile. def dialectProvider = new GherkinDialectProvider() @@ -52,11 +52,11 @@ GherkinDialectProvider.DIALECTS.keySet().each { language -> } } - // html + // package-info.java def locale = localeFor(dialect.language) - def binding = ["locale": locale] - def html = engine.createTemplate(package_html).make(binding).toString() - def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/annotation/${normalized_language}/package.html") + def binding = [ "locale": locale, "normalized_language": normalized_language ] + def html = engine.createTemplate(package_info_java).make(binding).toString() + def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/annotation/${normalized_language}/package-info.java") file.write(html, "UTF-8") } } \ No newline at end of file diff --git a/java/src/main/groovy/generate-interfaces.groovy b/java/src/main/groovy/generate-interfaces.groovy index aab28c284e..88d592c9ea 100644 --- a/java/src/main/groovy/generate-interfaces.groovy +++ b/java/src/main/groovy/generate-interfaces.groovy @@ -6,13 +6,23 @@ SimpleTemplateEngine engine = new SimpleTemplateEngine() def unsupported = ["em"] // The generated files for Emoij do not compile. def dialectProvider = new GherkinDialectProvider() +def localeFor(lang) { + languageAndCountry = lang.split("-") + if (languageAndCountry.length == 1) { + return new Locale(lang) + } else { + return new Locale(languageAndCountry[0], languageAndCountry[1]) + } +} + GherkinDialectProvider.DIALECTS.keySet().each { language -> def dialect = dialectProvider.getDialect(language, null) def normalized_language = dialect.language.replaceAll("[\\s-]", "_").toLowerCase() if (!unsupported.contains(normalized_language)) { def templateSource = new File(project.baseDir, "src/main/groovy/lambda.java.gsp").getText() def className = "${normalized_language}".capitalize() - def binding = [ "i18n":dialect, "className":className ] + def locale = localeFor(dialect.language) + def binding = [ "i18n":dialect, "className":className, "locale": locale ] def template = engine.createTemplate(templateSource).make(binding) def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/lambda/${className}.java") file.parentFile.mkdirs() diff --git a/java/src/main/groovy/lambda.java.gsp b/java/src/main/groovy/lambda.java.gsp index 52eebc6a1e..66505d8e0d 100644 --- a/java/src/main/groovy/lambda.java.gsp +++ b/java/src/main/groovy/lambda.java.gsp @@ -16,6 +16,8 @@ import io.cucumber.java.Java8StepDefinition; import io.cucumber.java.LambdaGlueBase; /** + * ${locale.getDisplayLanguage()} + *

      * To execute steps in a feature file the steps must be * connected to executable code. This can be done by * implementing this interface. @@ -67,7 +69,9 @@ public interface ${className} extends LambdaGlueBase { * * @param expression the cucumber expression * @param body a lambda expression with ${arity} parameters - */ + * <% (1..arity).each { i -> %> + * @param type of argument ${i} <% } %> + */ default <${genericSignature}> void ${java.text.Normalizer.normalize(kw.replaceAll("[\\s',!]", ""), java.text.Normalizer.Form.NFC)}(String expression, A${arity}<${genericSignature}> body) { LambdaGlueRegistry.INSTANCE.get().addStepDefinition((typeRegistry) -> Java8StepDefinition.create(expression, A${arity}.class, body, typeRegistry) @@ -80,6 +84,8 @@ public interface ${className} extends LambdaGlueBase { * @param expression the cucumber expression * @param timeoutMillis max amount of milliseconds this is allowed to run for. 0 (default) means no restriction. * @param body a lambda expression with ${arity} parameters + * <% (1..arity).each { i -> %> + * @param type of argument ${i} <% } %> */ default <${genericSignature}> void ${java.text.Normalizer.normalize(kw.replaceAll("[\\s',!]", ""), java.text.Normalizer.Form.NFC)}(String expression, long timeoutMillis, A${arity}<${genericSignature}> body) { LambdaGlueRegistry.INSTANCE.get().addStepDefinition((typeRegistry) -> diff --git a/needle/src/main/java/io/cucumber/needle/api/package-info.java b/needle/src/main/java/io/cucumber/needle/api/package-info.java new file mode 100644 index 0000000000..ffb7827dd0 --- /dev/null +++ b/needle/src/main/java/io/cucumber/needle/api/package-info.java @@ -0,0 +1,7 @@ +/** + * Cucumber Needle configuration Api + *

      + * You can use the InjectionProviderInstanceSupplier and NeedleInjectionProvider to configure the behavior of the + * needle injection. + */ +package io.cucumber.needle.api; \ No newline at end of file diff --git a/needle/src/main/java/io/cucumber/needle/api/package.html b/needle/src/main/java/io/cucumber/needle/api/package.html deleted file mode 100644 index 53513df03a..0000000000 --- a/needle/src/main/java/io/cucumber/needle/api/package.html +++ /dev/null @@ -1,10 +0,0 @@ - -

      - By including the cucumber-needle jar - on your CLASSPATH your Glue classes will be instantiated - by needle. - - You can use the InjectionProviderInstanceSupplier and NeedleInjectionProvider to configure the behavior of the - needle injection. -

      - diff --git a/needle/src/main/java/io/cucumber/needle/package-info.java b/needle/src/main/java/io/cucumber/needle/package-info.java new file mode 100644 index 0000000000..4611a3e808 --- /dev/null +++ b/needle/src/main/java/io/cucumber/needle/package-info.java @@ -0,0 +1,8 @@ +/** + * Enables dependency injection by Needle + *

      + * By including the cucumber-needle on your CLASSPATH your step definitions will be + * instantiated by Needle.. + */ +package io.cucumber.needle; + diff --git a/openejb/src/main/java/io/cucumber/openejb/README.java b/openejb/src/main/java/io/cucumber/openejb/README.java deleted file mode 100644 index fb47cd4438..0000000000 --- a/openejb/src/main/java/io/cucumber/openejb/README.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.cucumber.openejb; - - -public class README { -} diff --git a/openejb/src/main/java/io/cucumber/openejb/package-info.java b/openejb/src/main/java/io/cucumber/openejb/package-info.java new file mode 100644 index 0000000000..981cc9d4c2 --- /dev/null +++ b/openejb/src/main/java/io/cucumber/openejb/package-info.java @@ -0,0 +1,7 @@ +/** + * Enables dependency injection by OpenEJB + *

      + * By including the cucumber-openejb on your CLASSPATH your step definitions will be + * instantiated by OpenEJB. + */ +package io.cucumber.openejb; \ No newline at end of file diff --git a/openejb/src/main/java/io/cucumber/openejb/package.html b/openejb/src/main/java/io/cucumber/openejb/package.html deleted file mode 100644 index 75fe26af79..0000000000 --- a/openejb/src/main/java/io/cucumber/openejb/package.html +++ /dev/null @@ -1,6 +0,0 @@ - -

      - There is no API for this module, but by including the cucumber-openejb jar - on your CLASSPATH your Step Definitions will be instantiated by OpenEJB. -

      - diff --git a/picocontainer/src/main/java/io/cucumber/picocontainer/README.java b/picocontainer/src/main/java/io/cucumber/picocontainer/README.java deleted file mode 100644 index 80d6123537..0000000000 --- a/picocontainer/src/main/java/io/cucumber/picocontainer/README.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.cucumber.picocontainer; - - -public class README { -} diff --git a/picocontainer/src/main/java/io/cucumber/picocontainer/package-info.java b/picocontainer/src/main/java/io/cucumber/picocontainer/package-info.java new file mode 100644 index 0000000000..28f8b56b10 --- /dev/null +++ b/picocontainer/src/main/java/io/cucumber/picocontainer/package-info.java @@ -0,0 +1,8 @@ +/** + * Enables dependency injection by PicoContainer + *

      + * By including the cucumber-picocontainer on your CLASSPATH your step definitions will be + * instantiated by PicoContainer. + */ +package io.cucumber.picocontainer; + diff --git a/picocontainer/src/main/java/io/cucumber/picocontainer/package.html b/picocontainer/src/main/java/io/cucumber/picocontainer/package.html deleted file mode 100644 index 06bc15485b..0000000000 --- a/picocontainer/src/main/java/io/cucumber/picocontainer/package.html +++ /dev/null @@ -1,6 +0,0 @@ - -

      - There is no API for this module, but by including the cucumber-picocontainer jar - on your CLASSPATH your Step Definitions will be instantiated by PicoContainer. -

      - diff --git a/pom.xml b/pom.xml index 9a4b45d145..a106b28218 100644 --- a/pom.xml +++ b/pom.xml @@ -687,23 +687,31 @@ 3.0.0-M1 false - io.cucumber.*,org.springframework + io.cucumber.examples*,org.springframework http://docs.oracle.com/javase/7/docs/api/ http://junit.sourceforge.net/javadoc/ - Core API Packages - io.cucumber.core.api.*:io.cucumber.junit.api.*:io.cucumber.testng.api.* + API Packages + + cucumber.api.*:io.cucumber.core.api:io.cucumber.core.api.*:io.cucumber.junit.api:io.cucumber.testng.api + - I18n - Java - io.cucumber.java.api.* + I18n + io.cucumber.java.api.lambda:io.cucumber.java.api.annotation.* + + Dependency Injection Providers + + io.cucumber.spring:io.cucumber.weld:io.cucumber.guice:io.cucumber.needle:io.cucumber.picocontainer:io.cucumber.openejb + + + - java @@ -827,16 +835,9 @@ - - true - - io\.cucumber..* - - true - io\.cucumber\..* org\.springframework\.core\..* diff --git a/spring/src/main/java/io/cucumber/spring/api/package.html b/spring/src/main/java/io/cucumber/spring/api/package.html deleted file mode 100644 index 933747349d..0000000000 --- a/spring/src/main/java/io/cucumber/spring/api/package.html +++ /dev/null @@ -1,6 +0,0 @@ - -

      - By including the cucumber-spring jar - on your CLASSPATH your Step Definitions will be instantiated by Spring. -

      - diff --git a/spring/src/main/java/io/cucumber/spring/package-info.java b/spring/src/main/java/io/cucumber/spring/package-info.java new file mode 100644 index 0000000000..4a02cd337d --- /dev/null +++ b/spring/src/main/java/io/cucumber/spring/package-info.java @@ -0,0 +1,7 @@ +/** + * Enables dependency injection by Spring + *

      + * By including the cucumber-spring on your CLASSPATH your step definitions will be + * instantiated by Spring. + */ +package io.cucumber.spring; diff --git a/weld/src/main/java/cucumber/api/weld/README.java b/weld/src/main/java/cucumber/api/weld/README.java deleted file mode 100644 index cbf88b20db..0000000000 --- a/weld/src/main/java/cucumber/api/weld/README.java +++ /dev/null @@ -1,5 +0,0 @@ -package cucumber.api.weld; - - -public class README { -} diff --git a/weld/src/main/java/cucumber/api/weld/package.html b/weld/src/main/java/cucumber/api/weld/package.html deleted file mode 100644 index 775ebb6bdf..0000000000 --- a/weld/src/main/java/cucumber/api/weld/package.html +++ /dev/null @@ -1,6 +0,0 @@ - -

      - There is no API for this module, but by including the cucumber-weld jar - on your CLASSPATH your Step Definitions will be instantiated by Weld. -

      - diff --git a/weld/src/main/java/io/cucumber/weld/package-info.java b/weld/src/main/java/io/cucumber/weld/package-info.java new file mode 100644 index 0000000000..4134893a6b --- /dev/null +++ b/weld/src/main/java/io/cucumber/weld/package-info.java @@ -0,0 +1,7 @@ +/** + * Enables dependency injection by Weld + *

      + * By including the cucumber-weld on your CLASSPATH your step definitions will be + * instantiated by Weld. + */ +package io.cucumber.weld; From e37ff58549389c5521f43df682e87c18d394c718 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 23 Sep 2018 20:59:49 +0200 Subject: [PATCH 044/155] [Java] Remove GlueBase The split between java and java8 necessitated a glue base interface to store lambda glue classes in the java backend. As java and java8 have been merged this class is no longer needed. Instead lambda glue steps now extend LambdaGlue. --- java/src/main/groovy/lambda.java.gsp | 4 ++-- java/src/main/java/io/cucumber/java/Function.java | 7 ------- java/src/main/java/io/cucumber/java/GlueBase.java | 4 ---- .../src/main/java/io/cucumber/java/JavaBackend.java | 13 +++++++------ .../java/{LambdaGlueBase.java => LambdaGlue.java} | 2 +- .../java/io/cucumber/java/LambdaGlueRegistry.java | 4 +++- 6 files changed, 13 insertions(+), 21 deletions(-) delete mode 100644 java/src/main/java/io/cucumber/java/Function.java delete mode 100644 java/src/main/java/io/cucumber/java/GlueBase.java rename java/src/main/java/io/cucumber/java/{LambdaGlueBase.java => LambdaGlue.java} (99%) diff --git a/java/src/main/groovy/lambda.java.gsp b/java/src/main/groovy/lambda.java.gsp index 66505d8e0d..a234f44951 100644 --- a/java/src/main/groovy/lambda.java.gsp +++ b/java/src/main/groovy/lambda.java.gsp @@ -13,7 +13,7 @@ import io.cucumber.java.api.StepdefBody.A9; import io.cucumber.java.LambdaGlueRegistry; import io.cucumber.java.Java8StepDefinition; -import io.cucumber.java.LambdaGlueBase; +import io.cucumber.java.LambdaGlue; /** * ${locale.getDisplayLanguage()} @@ -34,7 +34,7 @@ import io.cucumber.java.LambdaGlueBase; * attempt to transform the data table or doc string to the the * type of last argument. */ -public interface ${className} extends LambdaGlueBase { +public interface ${className} extends LambdaGlue { <% i18n.stepKeywords.findAll { !it.contains('*') && !it.matches("^\\d.*") }.sort().unique().each { kw -> %> /** * Creates a new step definition. diff --git a/java/src/main/java/io/cucumber/java/Function.java b/java/src/main/java/io/cucumber/java/Function.java deleted file mode 100644 index 5cb1e9c509..0000000000 --- a/java/src/main/java/io/cucumber/java/Function.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.cucumber.java; - -public interface Function { - - R apply(T t); - -} diff --git a/java/src/main/java/io/cucumber/java/GlueBase.java b/java/src/main/java/io/cucumber/java/GlueBase.java deleted file mode 100644 index 82b8dee8ce..0000000000 --- a/java/src/main/java/io/cucumber/java/GlueBase.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.cucumber.java; - -public interface GlueBase { -} diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index d3949dac73..161f0e6456 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.function.Function; import static io.cucumber.core.io.MultiLoader.packageName; import static io.cucumber.java.ObjectFactoryLoader.loadObjectFactory; @@ -41,7 +42,7 @@ public class JavaBackend implements Backend, LambdaGlueRegistry { private final MethodScanner methodScanner; private Glue glue; - private List> glueBaseClasses = new ArrayList>(); + private List> lambdaGlueClasses = new ArrayList<>(); /** * The constructor called by reflection by default. @@ -73,14 +74,14 @@ public void loadGlue(Glue glue, List gluePaths) { // Scan for Java8 style glue (lambdas) for (final String gluePath : gluePaths) { - Collection> glueDefinerClasses = classFinder.getDescendants(GlueBase.class, packageName(gluePath)); - for (final Class glueClass : glueDefinerClasses) { + Collection> glueDefinerClasses = classFinder.getDescendants(LambdaGlue.class, packageName(gluePath)); + for (final Class glueClass : glueDefinerClasses) { if (glueClass.isInterface()) { continue; } if (objectFactory.addClass(glueClass)) { - glueBaseClasses.add(glueClass); + lambdaGlueClasses.add(glueClass); } } } @@ -107,8 +108,8 @@ public void buildWorld() { // in the constructor. try { INSTANCE.set(this); - for (Class glueBaseClass : glueBaseClasses) { - objectFactory.getInstance(glueBaseClass); + for (Class lambdaGlueClass: lambdaGlueClasses) { + objectFactory.getInstance(lambdaGlueClass); } } finally { INSTANCE.remove(); diff --git a/java/src/main/java/io/cucumber/java/LambdaGlueBase.java b/java/src/main/java/io/cucumber/java/LambdaGlue.java similarity index 99% rename from java/src/main/java/io/cucumber/java/LambdaGlueBase.java rename to java/src/main/java/io/cucumber/java/LambdaGlue.java index a72da60a43..94a92e1e25 100644 --- a/java/src/main/java/io/cucumber/java/LambdaGlueBase.java +++ b/java/src/main/java/io/cucumber/java/LambdaGlue.java @@ -3,7 +3,7 @@ import io.cucumber.java.api.HookBody; import io.cucumber.java.api.HookNoArgsBody; -public interface LambdaGlueBase extends GlueBase { +public interface LambdaGlue { String[] EMPTY_TAG_EXPRESSIONS = new String[0]; long NO_TIMEOUT = 0; diff --git a/java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java b/java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java index 46ad5454a8..5408491a50 100644 --- a/java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java +++ b/java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java @@ -4,8 +4,10 @@ import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; +import java.util.function.Function; + public interface LambdaGlueRegistry { - ThreadLocal INSTANCE = new ThreadLocal(); + ThreadLocal INSTANCE = new ThreadLocal<>(); void addStepDefinition(Function stepDefinition); From e6ce32e22028abde550d4211d073e21fd4982bc7 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 23 Sep 2018 21:12:51 +0200 Subject: [PATCH 045/155] [Java] Add repeatable annotations Adds the support for repeatable step definition annotations to the JavaBackend e.g.: ``` @When("the customer opens his account") @When("the account is opened by the customer") public void open_account() { } ``` Resolves part of #1447. --- java/src/main/groovy/annotation.java.gsp | 15 ++++- .../java/io/cucumber/java/JavaBackend.java | 17 +++-- .../java/io/cucumber/java/MethodScanner.java | 24 ++++++- .../io/cucumber/java/StepDefAnnotations.java | 11 ++++ ...efinitionMarksCorrectStackElementTest.java | 2 + .../io/cucumber/java/JavaBackendTest.java | 65 +++++++++---------- .../java/lambda/AnonInnerClassStepdefs.java | 7 +- .../io/cucumber/java/repeatable/Stepdefs.java | 12 ++++ 8 files changed, 106 insertions(+), 47 deletions(-) create mode 100644 java/src/main/java/io/cucumber/java/StepDefAnnotations.java create mode 100644 java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java diff --git a/java/src/main/groovy/annotation.java.gsp b/java/src/main/groovy/annotation.java.gsp index 4221b4b778..7b31e7423d 100644 --- a/java/src/main/groovy/annotation.java.gsp +++ b/java/src/main/groovy/annotation.java.gsp @@ -1,12 +1,14 @@ package io.cucumber.java.api.annotation.${lang}; import io.cucumber.java.StepDefAnnotation; +import io.cucumber.java.StepDefAnnotations; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; +import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import java.lang.annotation.Documented; /** * To execute steps in a feature file the steps must be @@ -29,6 +31,7 @@ import java.lang.annotation.Documented; @Target(ElementType.METHOD) @StepDefAnnotation @Documented +@Repeatable(${kw}.${kw}s.class) public @interface ${kw} { /** * @return a cucumber or regular expression @@ -40,5 +43,15 @@ public @interface ${kw} { */ long timeout() default 0; + /** + * Allows the use of multiple '${kw}'s on a single method. + */ + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @StepDefAnnotations + @Documented + @interface ${kw}s { + ${kw}[] value(); + } } diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 161f0e6456..12e15aaccc 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -131,15 +131,14 @@ public List getSnippet(PickleStep step, String keyword, SnippetType.Func void addStepDefinition(Annotation annotation, Method method) { try { - if (objectFactory.addClass(method.getDeclaringClass())) { - glue.addStepDefinition( - new JavaStepDefinition( - method, - expression(annotation), - timeoutMillis(annotation), - objectFactory, - typeRegistry)); - } + objectFactory.addClass(method.getDeclaringClass()); + glue.addStepDefinition( + new JavaStepDefinition( + method, + expression(annotation), + timeoutMillis(annotation), + objectFactory, + typeRegistry)); } catch (CucumberException e) { throw e; } catch (Throwable e) { diff --git a/java/src/main/java/io/cucumber/java/MethodScanner.java b/java/src/main/java/io/cucumber/java/MethodScanner.java index daa39d2f64..42d84baf9a 100644 --- a/java/src/main/java/io/cucumber/java/MethodScanner.java +++ b/java/src/main/java/io/cucumber/java/MethodScanner.java @@ -1,5 +1,6 @@ package io.cucumber.java; +import io.cucumber.core.runtime.Invoker; import io.cucumber.java.api.After; import io.cucumber.java.api.AfterStep; import io.cucumber.java.api.Before; @@ -55,7 +56,10 @@ void scan(JavaBackend javaBackend, List gluePaths) { * @param glueCodeClass the class where the method is declared. */ void scan(JavaBackend javaBackend, Method method, Class glueCodeClass) { - Annotation[] methodAnnotations = method.getAnnotations(); + scan(javaBackend, method, glueCodeClass, method.getAnnotations()); + } + + private void scan(JavaBackend javaBackend, Method method, Class glueCodeClass, Annotation[] methodAnnotations) { for (Annotation annotation : methodAnnotations) { if (isHookAnnotation(annotation)) { validateMethod(method, glueCodeClass); @@ -63,6 +67,8 @@ void scan(JavaBackend javaBackend, Method method, Class glueCodeClass) { } else if (isStepdefAnnotation(annotation)) { validateMethod(method, glueCodeClass); javaBackend.addStepDefinition(annotation, method); + } else if (isRepeatedStepdefAnnotation(annotation)) { + scan(javaBackend, method, glueCodeClass, repeatedAnnotations(annotation)); } } } @@ -85,4 +91,20 @@ private boolean isStepdefAnnotation(Annotation annotation) { Class annotationClass = annotation.annotationType(); return annotationClass.getAnnotation(StepDefAnnotation.class) != null; } + + + private boolean isRepeatedStepdefAnnotation(Annotation annotation) { + Class annotationClass = annotation.annotationType(); + return annotationClass.getAnnotation(StepDefAnnotations.class) != null; + } + + private Annotation[] repeatedAnnotations(Annotation annotation) { + try { + Method expressionMethod = annotation.getClass().getMethod("value"); + return ( Annotation[]) Invoker.invoke(annotation, expressionMethod, 0); + } catch (Throwable e) { + throw new CucumberException(e); + } + } + } diff --git a/java/src/main/java/io/cucumber/java/StepDefAnnotations.java b/java/src/main/java/io/cucumber/java/StepDefAnnotations.java new file mode 100644 index 0000000000..cc7f48fe11 --- /dev/null +++ b/java/src/main/java/io/cucumber/java/StepDefAnnotations.java @@ -0,0 +1,11 @@ +package io.cucumber.java; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.ANNOTATION_TYPE) +public @interface StepDefAnnotations { +} diff --git a/java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java b/java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java index 4203ffa30c..7d63622022 100644 --- a/java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java +++ b/java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java @@ -9,6 +9,8 @@ import org.junit.Test; import org.junit.rules.ExpectedException; +import java.util.function.Function; + import static java.util.Locale.ENGLISH; public class Java8LambdaStepDefinitionMarksCorrectStackElementTest { diff --git a/java/src/test/java/io/cucumber/java/JavaBackendTest.java b/java/src/test/java/io/cucumber/java/JavaBackendTest.java index 73f17c45bb..1cd0fc3d81 100644 --- a/java/src/test/java/io/cucumber/java/JavaBackendTest.java +++ b/java/src/test/java/io/cucumber/java/JavaBackendTest.java @@ -1,31 +1,49 @@ package io.cucumber.java; -import io.cucumber.java.api.ObjectFactory; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.backend.Glue; -import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.java.stepdefs.Stepdefs; import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.java.api.ObjectFactory; +import io.cucumber.java.stepdefs.Stepdefs; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.jupiter.api.function.Executable; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import java.util.List; import java.util.Locale; import static java.lang.Thread.currentThread; import static java.util.Arrays.asList; +import static java.util.stream.Collectors.toList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; public class JavaBackendTest { + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Captor + public ArgumentCaptor stepDefinition; + + @Mock + public Glue glue; + private ObjectFactory factory; private JavaBackend backend; @@ -41,7 +59,6 @@ public void createBackend() { @Test public void finds_step_definitions_by_classpath_url() { - GlueStub glue = new GlueStub(); backend.loadGlue(glue, asList("classpath:cucumber/runtime/java/stepdefs")); backend.buildWorld(); assertEquals(Stepdefs.class, factory.getInstance(Stepdefs.class).getClass()); @@ -49,7 +66,6 @@ public void finds_step_definitions_by_classpath_url() { @Test public void finds_step_definitions_by_package_name() { - GlueStub glue = new GlueStub(); backend.loadGlue(glue, asList("io.cucumber.java.stepdefs")); backend.buildWorld(); assertEquals(Stepdefs.class, factory.getInstance(Stepdefs.class).getClass()); @@ -57,38 +73,21 @@ public void finds_step_definitions_by_package_name() { @Test public void detects_subclassed_glue_and_throws_exception() { - GlueStub glue = new GlueStub(); final Executable testMethod = () -> backend.loadGlue(glue, asList("io.cucumber.java.stepdefs", "io.cucumber.java.incorrectlysubclassedstepdefs")); final CucumberException expectedThrown = assertThrows(CucumberException.class, testMethod); assertThat(expectedThrown.getMessage(), is(equalTo("You're not allowed to extend classes that define Step Definitions or hooks. class io.cucumber.java.incorrectlysubclassedstepdefs.SubclassesStepdefs extends class io.cucumber.java.stepdefs.Stepdefs"))); } - private class GlueStub implements Glue { - - @Override - public void addStepDefinition(StepDefinition stepDefinition) { - //no-op - } - - @Override - public void addBeforeStepHook(HookDefinition beforeStepHook) { - throw new UnsupportedOperationException(); - } - - @Override - public void addBeforeHook(HookDefinition hookDefinition) { - throw new UnsupportedOperationException(); - } - - @Override - public void addAfterStepHook(HookDefinition hookDefinition) { - throw new UnsupportedOperationException(); - } - - @Override - public void addAfterHook(HookDefinition hookDefinition) { - throw new UnsupportedOperationException(); - } + @Test + public void detects_repeated_annotations() { + backend.loadGlue(glue, asList("io.cucumber.java.repeatable")); + verify(glue, times(2)).addStepDefinition(stepDefinition.capture()); + + List patterns = stepDefinition.getAllValues() + .stream() + .map(StepDefinition::getPattern) + .collect(toList()); + assertThat(patterns, equalTo(asList("test", "test again"))); } diff --git a/java/src/test/java/io/cucumber/java/lambda/AnonInnerClassStepdefs.java b/java/src/test/java/io/cucumber/java/lambda/AnonInnerClassStepdefs.java index cb532d1408..d33ca8e2e0 100644 --- a/java/src/test/java/io/cucumber/java/lambda/AnonInnerClassStepdefs.java +++ b/java/src/test/java/io/cucumber/java/lambda/AnonInnerClassStepdefs.java @@ -3,14 +3,15 @@ import static org.junit.Assert.assertEquals; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.java.Function; -import io.cucumber.java.GlueBase; import io.cucumber.java.Java8StepDefinition; import io.cucumber.java.JavaBackend; +import io.cucumber.java.LambdaGlue; import io.cucumber.java.api.StepdefBody; import io.cucumber.core.backend.StepDefinition; -public class AnonInnerClassStepdefs implements GlueBase { +import java.util.function.Function; + +public class AnonInnerClassStepdefs implements LambdaGlue { public AnonInnerClassStepdefs() { JavaBackend.INSTANCE.get().addStepDefinition(new Function() { diff --git a/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java b/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java new file mode 100644 index 0000000000..31a80d7234 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java @@ -0,0 +1,12 @@ +package io.cucumber.java.repeatable; + +import io.cucumber.java.api.annotation.en.Given; + +public class Stepdefs { + + @Given("test") + @Given("test again") + public void test() { + + } +} From 0987a74687290d81d75d3b1cbb5c2a4c0d754cca Mon Sep 17 00:00:00 2001 From: John Patrick Date: Sun, 30 Sep 2018 20:27:19 +0200 Subject: [PATCH 046/155] [Build] Define Automatic-Module-Names Define Automatic-Module-Names for all jar files generated so that they can be used within the Java Platform Module System, instead of being put into the UNNAMED bucket. --- core/pom.xml | 4 ++++ guice/pom.xml | 4 ++++ java/pom.xml | 4 ++++ junit/pom.xml | 4 ++++ needle/pom.xml | 3 +++ openejb/pom.xml | 4 ++++ picocontainer/pom.xml | 4 ++++ pom.xml | 8 ++++++++ spring/pom.xml | 4 ++++ testng/pom.xml | 4 ++++ weld/pom.xml | 4 ++++ 11 files changed, 47 insertions(+) diff --git a/core/pom.xml b/core/pom.xml index b92dd18f6d..38c6605c08 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -120,4 +120,8 @@ + + + io.cucumber.core + diff --git a/guice/pom.xml b/guice/pom.xml index c5ae3edd7e..4f5aed4ee1 100644 --- a/guice/pom.xml +++ b/guice/pom.xml @@ -46,4 +46,8 @@ test + + + io.cucumber.guice + diff --git a/java/pom.xml b/java/pom.xml index 4cb230b30c..d5b11f3691 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -94,4 +94,8 @@ + + + io.cucumber.java + diff --git a/junit/pom.xml b/junit/pom.xml index b753305203..65c070f696 100644 --- a/junit/pom.xml +++ b/junit/pom.xml @@ -38,4 +38,8 @@ test + + + io.cucumber.junit + diff --git a/needle/pom.xml b/needle/pom.xml index b118111b4a..077a9b5aed 100644 --- a/needle/pom.xml +++ b/needle/pom.xml @@ -67,4 +67,7 @@ + + io.cucumber.needle + diff --git a/openejb/pom.xml b/openejb/pom.xml index 1e0e983fdb..7e7f17ad11 100644 --- a/openejb/pom.xml +++ b/openejb/pom.xml @@ -49,4 +49,8 @@ + + + io.cucumber.openejb + diff --git a/picocontainer/pom.xml b/picocontainer/pom.xml index 8007af6de0..c1834ff603 100644 --- a/picocontainer/pom.xml +++ b/picocontainer/pom.xml @@ -67,4 +67,8 @@ + + + io.cucumber.picocontainer + diff --git a/pom.xml b/pom.xml index 28fefbfd98..8760688bb5 100644 --- a/pom.xml +++ b/pom.xml @@ -78,6 +78,7 @@ 0.5.0 6.1.0 1.1.3 + @@ -726,6 +727,13 @@ org.apache.maven.plugins maven-jar-plugin 3.0.2 + + + + ${project.Automatic-Module-Name} + + + diff --git a/spring/pom.xml b/spring/pom.xml index af6677a5f3..69475ccfba 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -68,4 +68,8 @@ test + + + io.cucumber.spring + diff --git a/testng/pom.xml b/testng/pom.xml index 69addfb302..59a05042c0 100644 --- a/testng/pom.xml +++ b/testng/pom.xml @@ -31,4 +31,8 @@ test + + + io.cucumber.testng + diff --git a/weld/pom.xml b/weld/pom.xml index 33cf728db8..16e449ebdd 100644 --- a/weld/pom.xml +++ b/weld/pom.xml @@ -51,4 +51,8 @@ + + + io.cucumber.weld + From 07d5f93f30b19090132d21570ca59922cf1e4521 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sun, 30 Sep 2018 21:51:50 +0200 Subject: [PATCH 047/155] [Core] Reduce plugin memory usage (#1469) The ordered event publisher is only needed when dealing with legacy plugins. As the ordered event publisher stores all events and replays them later memory usage can be reduced by creating it only when needed. --- .../java/io/cucumber/core/plugin/Plugins.java | 15 +++- .../io/cucumber/core/plugin/PluginsTest.java | 72 +++++++++---------- 2 files changed, 46 insertions(+), 41 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/plugin/Plugins.java b/core/src/main/java/io/cucumber/core/plugin/Plugins.java index 87a40fdc46..2e40eb39f8 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Plugins.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugins.java @@ -20,17 +20,26 @@ public final class Plugins { private final PluginFactory pluginFactory; private final EventPublisher eventPublisher; - private final EventPublisher orderedEventPublisher; + private EventPublisher orderedEventPublisher; private final Options options; public Plugins(PluginFactory pluginFactory, EventPublisher eventPublisher, Options options) { this.pluginFactory = pluginFactory; this.eventPublisher = eventPublisher; - this.orderedEventPublisher = createCanonicalOrderEventPublisher(); this.options = options; this.plugins = createPlugins(); } + + private EventPublisher getOrderedEventPublisher() { + // The ordered event publisher stores all events + // so don't create it unless we need it. + if(orderedEventPublisher == null){ + orderedEventPublisher = createCanonicalOrderEventPublisher(); + } + return orderedEventPublisher; + } + private EventPublisher createCanonicalOrderEventPublisher() { final CanonicalOrderEventPublisher canonicalOrderEventPublisher = new CanonicalOrderEventPublisher(); this.eventPublisher.registerHandlerFor(Event.class, new EventHandler() { @@ -103,7 +112,7 @@ private void setEventBusOnEventListenerPlugins(Plugin plugin) { formatter.setEventPublisher(eventPublisher); } else if (plugin instanceof EventListener) { EventListener formatter = (EventListener) plugin; - formatter.setEventPublisher(orderedEventPublisher); + formatter.setEventPublisher(getOrderedEventPublisher()); } } diff --git a/core/src/test/java/io/cucumber/core/plugin/PluginsTest.java b/core/src/test/java/io/cucumber/core/plugin/PluginsTest.java index 356c990a35..aab6fc22dc 100644 --- a/core/src/test/java/io/cucumber/core/plugin/PluginsTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PluginsTest.java @@ -1,29 +1,27 @@ -package cucumber.runtime.formatter; - -import cucumber.api.event.ConcurrentEventListener; -import cucumber.api.event.Event; -import cucumber.api.event.EventHandler; -import cucumber.api.event.EventListener; -import cucumber.api.event.EventPublisher; -import cucumber.api.formatter.ColorAware; -import cucumber.api.formatter.StrictAware; -import cucumber.runner.CanonicalOrderEventPublisher; -import cucumber.runtime.RuntimeOptions; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.api.plugin.StrictAware; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.options.RuntimeOptions; import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; -import java.util.Collections; - -import static java.lang.ClassLoader.getSystemClassLoader; +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.quality.Strictness.STRICT_STUBS; @@ -32,62 +30,60 @@ public class PluginsTest { @Rule public MockitoRule mockitoRule = MockitoJUnit.rule().strictness(STRICT_STUBS); + @Mock private EventPublisher rootEventPublisher; - - private PluginFactory pluginFactory = new PluginFactory(); - + @Mock + private ResourceLoader resourceLoader; @Captor private ArgumentCaptor eventPublisher; + private PluginFactory pluginFactory = new PluginFactory(); + @Test public void shouldSetStrictOnPlugin() { - RuntimeOptions runtimeOptions = new RuntimeOptions("--strict"); - Plugins plugins = new Plugins(getSystemClassLoader(), pluginFactory, rootEventPublisher, runtimeOptions); - StrictAware plugin = Mockito.mock(StrictAware.class); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("--strict")); + Plugins plugins = new Plugins(pluginFactory, rootEventPublisher, runtimeOptions); + StrictAware plugin = mock(StrictAware.class); plugins.addPlugin(plugin); verify(plugin).setStrict(true); } - @Test public void shouldSetMonochromeOnPlugin() { - RuntimeOptions runtimeOptions = new RuntimeOptions("--monochrome"); - Plugins plugins = new Plugins(getSystemClassLoader(), pluginFactory, rootEventPublisher, runtimeOptions); - ColorAware plugin = Mockito.mock(ColorAware.class); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("--monochrome")); + Plugins plugins = new Plugins(pluginFactory, rootEventPublisher, runtimeOptions); + ColorAware plugin = mock(ColorAware.class); plugins.addPlugin(plugin); verify(plugin).setMonochrome(true); } - @Test public void shouldSetConcurrentEventListener() { - RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); - Plugins plugins = new Plugins(getSystemClassLoader(), pluginFactory, rootEventPublisher, runtimeOptions); - ConcurrentEventListener plugin = Mockito.mock(ConcurrentEventListener.class); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, emptyList()); + Plugins plugins = new Plugins(pluginFactory, rootEventPublisher, runtimeOptions); + ConcurrentEventListener plugin = mock(ConcurrentEventListener.class); plugins.addPlugin(plugin); verify(plugin, times(1)).setEventPublisher(rootEventPublisher); } - @Test public void shouldSetNonConcurrentEventListener() { - RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); - Plugins plugins = new Plugins(getSystemClassLoader(), pluginFactory, rootEventPublisher, runtimeOptions); - EventListener plugin = Mockito.mock(EventListener.class); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, emptyList()); + Plugins plugins = new Plugins(pluginFactory, rootEventPublisher, runtimeOptions); + EventListener plugin = mock(EventListener.class); plugins.addPlugin(plugin); verify(plugin, times(1)).setEventPublisher(eventPublisher.capture()); assertEquals(CanonicalOrderEventPublisher.class, eventPublisher.getValue().getClass()); } - @Test public void shouldRegisterCanonicalOrderEventPublisherWithRootEventPublisher() { - RuntimeOptions runtimeOptions = new RuntimeOptions(Collections.emptyList()); - Plugins plugins = new Plugins(getSystemClassLoader(), pluginFactory, rootEventPublisher, runtimeOptions); - EventListener plugin = Mockito.mock(EventListener.class); + RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, emptyList()); + Plugins plugins = new Plugins(pluginFactory, rootEventPublisher, runtimeOptions); + EventListener plugin = mock(EventListener.class); plugins.addPlugin(plugin); - verify(rootEventPublisher, times(1)).registerHandlerFor(eq(Event.class), ArgumentMatchers.>any()); + verify(rootEventPublisher, times(1)).registerHandlerFor(eq(Event.class), ArgumentMatchers.any()); } } \ No newline at end of file From bc0d4d0d0874a914d0fe56bee91d7c06f50ddfbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aslak=20Helles=C3=B8y?= Date: Sun, 30 Sep 2018 21:00:04 +0100 Subject: [PATCH 048/155] [Core] Remove deprecated legacy tags (#1335) The old --tags "@foo" --tags "@bar,@zap" tags are no longer supported. Only a single tag expression can be applied in a hook. Multiple tag expressions can be provided in the configuration. These are combined using 'and' semantics. --- .../java/io/cucumber/core/filter/Filters.java | 6 +- .../java/io/cucumber/core/filter/Options.java | 2 +- .../core/filter/TagExpressionOld.java | 161 --------- .../io/cucumber/core/filter/TagPredicate.java | 27 +- .../cucumber/core/options/RuntimeOptions.java | 16 +- .../core/filter/TagPredicateTest.java | 45 +-- .../cucumber/core/options/RerunFileTest.java | 4 +- .../options/RuntimeOptionsFactoryTest.java | 4 +- .../core/options/RuntimeOptionsTest.java | 10 +- .../calculator/RpnCalculatorStepdefs.java | 2 +- .../calculator/RpnCalculatorStepdefs.java | 2 +- .../io/cucumber/java/Java8HookDefinition.java | 16 +- .../java/io/cucumber/java/JavaBackend.java | 17 +- .../io/cucumber/java/JavaHookDefinition.java | 4 +- .../java/io/cucumber/java/LambdaGlue.java | 318 ++++++++++++++++-- .../main/java/io/cucumber/java/api/After.java | 2 +- .../java/io/cucumber/java/api/AfterStep.java | 4 +- .../java/io/cucumber/java/api/Before.java | 2 +- .../java/io/cucumber/java/api/BeforeStep.java | 2 +- .../java/io/cucumber/java/api/HookBody.java | 1 + .../io/cucumber/java/api/HookNoArgsBody.java | 1 + .../java/io/cucumber/java/JavaHookTest.java | 2 +- .../spring/api/SpringTransactionHooks.java | 4 +- .../commonglue/TransactionStepDefs.java | 4 +- 24 files changed, 357 insertions(+), 299 deletions(-) delete mode 100644 core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java diff --git a/core/src/main/java/io/cucumber/core/filter/Filters.java b/core/src/main/java/io/cucumber/core/filter/Filters.java index ba4bfed509..c81b99d86d 100644 --- a/core/src/main/java/io/cucumber/core/filter/Filters.java +++ b/core/src/main/java/io/cucumber/core/filter/Filters.java @@ -13,9 +13,9 @@ public final class Filters { public Filters(Options options) { filters = new ArrayList<>(); - List tagFilters = options.getTagFilters(); - if (!tagFilters.isEmpty()) { - this.filters.add(new TagPredicate(tagFilters)); + List tagExpressions = options.getTagExpressions(); + if (!tagExpressions.isEmpty()) { + this.filters.add(new TagPredicate(tagExpressions)); } List nameFilters = options.getNameFilters(); if (!nameFilters.isEmpty()) { diff --git a/core/src/main/java/io/cucumber/core/filter/Options.java b/core/src/main/java/io/cucumber/core/filter/Options.java index 7b44cc257a..8dba8b5c67 100644 --- a/core/src/main/java/io/cucumber/core/filter/Options.java +++ b/core/src/main/java/io/cucumber/core/filter/Options.java @@ -5,7 +5,7 @@ import java.util.regex.Pattern; public interface Options { - List getTagFilters(); + List getTagExpressions(); List getNameFilters(); diff --git a/core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java b/core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java deleted file mode 100644 index 2372c15bc2..0000000000 --- a/core/src/main/java/io/cucumber/core/filter/TagExpressionOld.java +++ /dev/null @@ -1,161 +0,0 @@ -package io.cucumber.core.filter; - -import gherkin.pickles.PickleTag; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -final class TagExpressionOld { - private final Map limits = new HashMap(); - private And and = new And(); - - static boolean isOldTagExpression(String tagExpression) { - if (tagExpression == null) { - return false; - } - if (tagExpression.contains(",")) { - System.err.println("WARNING: Found tags option '" + tagExpression + "'. Support for '@tag1,@tag2' will be removed from the next release of Cucumber-JVM. Please use '@tag or @tag2' instead"); - } - if (tagExpression.contains("~")) { - System.err.println("WARNING: Found tags option '" + tagExpression + "'. Support for '~@tag' will be removed from the next release of Cucumber-JVM. Please use 'not @tag' instead."); - } - return tagExpression.contains(",") || tagExpression.contains("~"); - } - - TagExpressionOld(List tagExpressions) { - for (String tagExpression : tagExpressions) { - add(tagExpression.split("\\s*,\\s*")); - } - } - - boolean evaluate(Collection tags) { - return and.isEmpty() || and.eval(tags); - } - - public Map limits() { - return limits; - } - - public boolean isEmpty() { - return and.isEmpty(); - } - - private void add(String[] tags) { - Or or = new Or(); - for (String tag : tags) { - boolean negation; - tag = tag.trim(); - if (tag.startsWith("~")) { - tag = tag.substring(1); - negation = true; - } else { - negation = false; - } - String[] tagAndLimit = tag.split(":"); - if (tagAndLimit.length == 2) { - tag = tagAndLimit[0]; - int limit = Integer.parseInt(tagAndLimit[1]); - if (limits.containsKey(tag) && limits.get(tag) != limit) { - throw new BadTagLimitException(tag, limits.get(tag), limit); - } - limits.put(tag, limit); - } - - if (negation) { - or.add(new Not(new TagExp(tag))); - } else { - or.add(new TagExp(tag)); - } - } - and.add(or); - } - - private interface Expression { - boolean eval(Collection tags); - } - - private class Not implements Expression { - private final Expression expression; - - Not(Expression expression) { - this.expression = expression; - } - - public boolean eval(Collection tags) { - return !expression.eval(tags); - } - } - - private class And implements Expression { - private List expressions = new ArrayList(); - - public void add(Expression expression) { - expressions.add(expression); - } - - public boolean eval(Collection tags) { - boolean result = true; - for (Expression expression : expressions) { - result = expression.eval(tags); - if (!result) break; - } - return result; - } - - public boolean isEmpty() { - return expressions.isEmpty(); - } - } - - private class Or implements Expression { - private List expressions = new ArrayList(); - - public void add(Expression expression) { - expressions.add(expression); - } - - public boolean eval(Collection tags) { - boolean result = false; - for (Expression expression : expressions) { - result = expression.eval(tags); - if (result) break; - } - return result; - } - } - - private class TagExp implements Expression { - private final String tagName; - - TagExp(String tagName) { - if (!tagName.startsWith("@")) { - throw new BadTagException(tagName); - } - this.tagName = tagName; - } - - public boolean eval(Collection tags) { - for (PickleTag tag : tags) { - if (tagName.equals(tag.getName())) { - return true; - } - } - return false; - } - } - - private class BadTagException extends RuntimeException { - BadTagException(String tagName) { - super("Bad tag: \"" + tagName + "\""); - } - } - - private class BadTagLimitException extends RuntimeException { - BadTagLimitException(String tag, int limitA, int limitB) { - super("Inconsistent tag limits for " + tag + ": " + limitA + " and " + limitB); - } - } -} diff --git a/core/src/main/java/io/cucumber/core/filter/TagPredicate.java b/core/src/main/java/io/cucumber/core/filter/TagPredicate.java index 3e00268fc3..285eaad676 100644 --- a/core/src/main/java/io/cucumber/core/filter/TagPredicate.java +++ b/core/src/main/java/io/cucumber/core/filter/TagPredicate.java @@ -9,24 +9,24 @@ import java.util.Collection; import java.util.List; -import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; public final class TagPredicate implements PicklePredicate { - private final List expressions = new ArrayList(); - private final List oldStyleExpressions = new ArrayList(); + private final List expressions = new ArrayList<>(); - public TagPredicate(List tagExpressions) { + public TagPredicate(String tagExpression) { + this(tagExpression.isEmpty() ? emptyList() : singletonList(tagExpression)); + } + + TagPredicate(List tagExpressions) { if (tagExpressions == null) { return; } TagExpressionParser parser = new TagExpressionParser(); for (String tagExpression : tagExpressions) { - if (TagExpressionOld.isOldTagExpression(tagExpression)) { - oldStyleExpressions.add(new TagExpressionOld(asList(tagExpression))); - } else { - expressions.add(parser.parse(tagExpression)); - } + expressions.add(parser.parse(tagExpression)); } } @@ -36,12 +36,11 @@ public boolean apply(PickleEvent pickleEvent) { } public boolean apply(Collection pickleTags) { - for (TagExpressionOld oldStyleExpression : oldStyleExpressions) { - if (!oldStyleExpression.evaluate(pickleTags)) { - return false; - } + if (expressions.isEmpty()) { + return true; } - List tags = new ArrayList(); + + List tags = new ArrayList<>(); for (PickleTag pickleTag : pickleTags) { tags.add(pickleTag.getName()); } diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 669147c6fe..6e8d460369 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -54,7 +54,7 @@ public String map(String keyword) { }; private final List glue = new ArrayList(); - private final List tagFilters = new ArrayList(); + private final List tagExpressions = new ArrayList(); private final List nameFilters = new ArrayList(); private final Map> lineFilters = new HashMap>(); private final List featurePaths = new ArrayList(); @@ -121,7 +121,7 @@ public List plugins() { } private void parse(List args) { - List parsedTagFilters = new ArrayList(); + List parsedTagExpressions = new ArrayList(); List parsedNameFilters = new ArrayList(); Map> parsedLineFilters = new HashMap>(); List parsedFeaturePaths = new ArrayList(); @@ -151,7 +151,7 @@ private void parse(List args) { String gluePath = args.remove(0); parsedGlue.add(gluePath); } else if (arg.equals("--tags") || arg.equals("-t")) { - parsedTagFilters.add(args.remove(0)); + parsedTagExpressions.add(args.remove(0)); } else if (arg.equals("--plugin") || arg.equals("--add-plugin") || arg.equals("-p")) { parsedPluginData.addPluginName(args.remove(0), arg.equals("--add-plugin")); } else if (arg.equals("--no-dry-run") || arg.equals("--dry-run") || arg.equals("-d")) { @@ -180,9 +180,9 @@ private void parse(List args) { processPathWithLines(parsedLineFilters, parsedFeaturePaths, new PathWithLines(arg)); } } - if (!parsedTagFilters.isEmpty() || !parsedNameFilters.isEmpty() || !parsedLineFilters.isEmpty() || haveLineFilters(parsedFeaturePaths)) { - tagFilters.clear(); - tagFilters.addAll(parsedTagFilters); + if (!parsedTagExpressions.isEmpty() || !parsedNameFilters.isEmpty() || !parsedLineFilters.isEmpty() || haveLineFilters(parsedFeaturePaths)) { + tagExpressions.clear(); + tagExpressions.addAll(parsedTagExpressions); nameFilters.clear(); nameFilters.addAll(parsedNameFilters); lineFilters.clear(); @@ -355,8 +355,8 @@ public List getNameFilters() { return nameFilters; } - public List getTagFilters() { - return tagFilters; + public List getTagExpressions() { + return tagExpressions; } public Map> getLineFilters() { diff --git a/core/src/test/java/io/cucumber/core/filter/TagPredicateTest.java b/core/src/test/java/io/cucumber/core/filter/TagPredicateTest.java index e083270aa4..928cbf4a7b 100644 --- a/core/src/test/java/io/cucumber/core/filter/TagPredicateTest.java +++ b/core/src/test/java/io/cucumber/core/filter/TagPredicateTest.java @@ -27,13 +27,20 @@ public class TagPredicateTest { private static final String NOT_FOO_TAG_VALUE = "not @FOO"; private static final String FOO_OR_BAR_TAG_VALUE = "@FOO or @BAR"; private static final String FOO_AND_BAR_TAG_VALUE = "@FOO and @BAR"; - private static final String OLD_STYLE_NOT_FOO_TAG_VALUE = "~@FOO"; - private static final String OLD_STYLE_FOO_OR_BAR_TAG_VALUE = "@FOO,@BAR"; @Test public void empty_tag_predicate_matches_pickle_with_any_tags() { PickleEvent pickleEvent = createPickleWithTags(asList(FOO_TAG)); - TagPredicate predicate = new TagPredicate(null); + TagPredicate predicate = new TagPredicate(""); + + assertTrue(predicate.apply(pickleEvent)); + } + + + @Test + public void list_of_empty_tag_predicates_matches_pickle_with_any_tags() { + PickleEvent pickleEvent = createPickleWithTags(asList(FOO_TAG)); + TagPredicate predicate = new TagPredicate(asList("", "")); assertTrue(predicate.apply(pickleEvent)); } @@ -126,38 +133,6 @@ public void or_tag_predicate_does_not_match_pickle_none_of_the_tags() { assertFalse(predicate.apply(pickleEvent)); } - @Test - public void old_style_not_tag_predicate_is_handled() { - PickleEvent pickleEvent = createPickleWithTags(asList(BAR_TAG)); - TagPredicate predicate = new TagPredicate(asList(OLD_STYLE_NOT_FOO_TAG_VALUE)); - - assertTrue(predicate.apply(pickleEvent)); - } - - @Test - public void old_style_or_tag_predicate_is_handled() { - PickleEvent pickleEvent = createPickleWithTags(asList(FOO_TAG)); - TagPredicate predicate = new TagPredicate(asList(OLD_STYLE_FOO_OR_BAR_TAG_VALUE)); - - assertTrue(predicate.apply(pickleEvent)); - } - - @Test - public void multiple_tag_expressions_are_combined_with_and() { - PickleEvent pickleEvent = createPickleWithTags(asList(FOO_TAG, BAR_TAG)); - TagPredicate predicate = new TagPredicate(asList(FOO_TAG_VALUE, BAR_TAG_VALUE)); - - assertTrue(predicate.apply(pickleEvent)); - } - - @Test - public void old_and_new_style_tag_expressions_can_be_combined() { - PickleEvent pickleEvent = createPickleWithTags(asList(BAR_TAG)); - TagPredicate predicate = new TagPredicate(asList(BAR_TAG_VALUE, OLD_STYLE_NOT_FOO_TAG_VALUE)); - - assertTrue(predicate.apply(pickleEvent)); - } - private PickleEvent createPickleWithTags(List tags) { return new PickleEvent("uri", new Pickle(NAME, LANGUAGE, NO_STEPS, tags, asList(MOCK_LOCATION))); } diff --git a/core/src/test/java/io/cucumber/core/options/RerunFileTest.java b/core/src/test/java/io/cucumber/core/options/RerunFileTest.java index 3bc318f0f1..3e9a145f6a 100644 --- a/core/src/test/java/io/cucumber/core/options/RerunFileTest.java +++ b/core/src/test/java/io/cucumber/core/options/RerunFileTest.java @@ -6,13 +6,11 @@ import java.io.ByteArrayInputStream; import java.io.IOException; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Properties; -import static io.cucumber.core.options.Env.INSTANCE; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; import static java.util.Collections.emptyMap; @@ -185,7 +183,7 @@ public void clobbers_tag_and_name_filters_from_cli_if_rerun_file_specified_in_cu RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, env, asList("--tags", "@should_be_clobbered", "--name", "should_be_clobbered")); - assertEquals(Collections.emptyList(), runtimeOptions.getTagFilters()); + assertEquals(Collections.emptyList(), runtimeOptions.getTagExpressions()); } private ResourceLoader mockFileResource(String path, String contents) throws IOException { diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java index 879449e8f6..07510d28ba 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java @@ -8,8 +8,6 @@ import io.cucumber.core.exception.CucumberException; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.plugin.Plugins; -import io.cucumber.core.runner.TimeService; -import io.cucumber.core.runner.TimeServiceEventBus; import org.junit.Test; import org.junit.jupiter.api.function.Executable; @@ -76,7 +74,7 @@ public void create_without_options_with_base_class_without_options() { public void create_with_no_name() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(NoName.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - assertTrue(runtimeOptions.getTagFilters().isEmpty()); + assertTrue(runtimeOptions.getTagExpressions().isEmpty()); assertTrue(runtimeOptions.getNameFilters().isEmpty()); assertTrue(runtimeOptions.getLineFilters().isEmpty()); } diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index 043c0251ee..1444cced95 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -67,7 +67,7 @@ public void strips_line_filters_from_feature_paths_and_put_them_among_line_filte public void assigns_filters_from_tags() { RuntimeOptions options = createRuntimeOptions("--tags", "@keep_this", "somewhere_else"); assertEquals(asList("somewhere_else"), options.getFeaturePaths()); - assertEquals(asList("@keep_this"), options.getTagFilters()); + assertEquals(asList("@keep_this"), options.getTagExpressions()); } @Test @@ -227,7 +227,7 @@ public void clobbers_filters_from_cli_if_filters_specified_in_cucumber_options_p Properties properties = new Properties(); properties.setProperty("cucumber.options", "--tags @clobber_with_this"); RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--tags", "@should_be_clobbered"); - assertEquals(asList("@clobber_with_this"), runtimeOptions.getTagFilters()); + assertEquals(asList("@clobber_with_this"), runtimeOptions.getTagExpressions()); } @Test @@ -235,7 +235,7 @@ public void clobbers_tag_and_name_filters_from_cli_if_line_filters_specified_in_ Properties properties = new Properties(); properties.setProperty("cucumber.options", "path/file.feature:3"); RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--tags", "@should_be_clobbered", "--name", "should_be_clobbered"); - assertEquals(Collections.emptyList(), runtimeOptions.getTagFilters()); + assertEquals(Collections.emptyList(), runtimeOptions.getTagExpressions()); } @@ -244,7 +244,7 @@ public void preserves_filters_from_cli_if_filters_not_specified_in_cucumber_opti Properties properties = new Properties(); properties.setProperty("cucumber.options", "--strict"); RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--tags", "@keep_this"); - assertEquals(asList("@keep_this"), runtimeOptions.getTagFilters()); + assertEquals(asList("@keep_this"), runtimeOptions.getTagExpressions()); } @Test @@ -277,7 +277,7 @@ public void clobbers_line_filters_from_cli_if_features_specified_in_cucumber_opt properties.setProperty("cucumber.options", "new newer"); RuntimeOptions runtimeOptions = createRuntimeOptions(properties, "--tags", "@keep_this", "path/file1.feature:1"); assertEquals(asList("new", "newer"), runtimeOptions.getFeaturePaths()); - assertEquals(asList("@keep_this"), runtimeOptions.getTagFilters()); + assertEquals(asList("@keep_this"), runtimeOptions.getTagExpressions()); } @Test diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index d5102a2a4f..241d923781 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -36,7 +36,7 @@ public void the_result_is(double expected) { assertEquals(expected, calc.value()); } - @Before({"not @foo"}) + @Before("not @foo") public void before() { System.out.println("Runs before scenarios *not* tagged with @foo"); } diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index c8a33130fd..5a6a3a6de3 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -30,7 +30,7 @@ public RpnCalculatorStepdefs() { Then("the result is {int}", (Integer expected) -> assertEquals(expected.doubleValue(), calc.value())); - Before(new String[]{"not @foo"}, (Scenario scenario) -> { + Before("not @foo", (Scenario scenario) -> { scenario.write("Runs before scenarios *not* tagged with @foo"); }); diff --git a/java/src/main/java/io/cucumber/java/Java8HookDefinition.java b/java/src/main/java/io/cucumber/java/Java8HookDefinition.java index bd72e794a5..68e1a4fa73 100644 --- a/java/src/main/java/io/cucumber/java/Java8HookDefinition.java +++ b/java/src/main/java/io/cucumber/java/Java8HookDefinition.java @@ -1,14 +1,12 @@ package io.cucumber.java; -import static java.util.Arrays.asList; - +import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; -import io.cucumber.java.api.HookBody; -import io.cucumber.java.api.HookNoArgsBody; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.filter.TagPredicate; -import gherkin.pickles.PickleTag; import io.cucumber.core.runtime.Invoker; +import io.cucumber.java.api.HookBody; +import io.cucumber.java.api.HookNoArgsBody; import java.util.Collection; @@ -20,20 +18,20 @@ public class Java8HookDefinition implements HookDefinition { private final HookBody hookBody; private final StackTraceElement location; - private Java8HookDefinition(String[] tagExpressions, int order, long timeoutMillis, HookBody hookBody, HookNoArgsBody hookNoArgsBody) { + private Java8HookDefinition(String tagExpressions, int order, long timeoutMillis, HookBody hookBody, HookNoArgsBody hookNoArgsBody) { this.order = order; this.timeoutMillis = timeoutMillis; - this.tagPredicate = new TagPredicate(asList(tagExpressions)); + this.tagPredicate = new TagPredicate(tagExpressions); this.hookBody = hookBody; this.hookNoArgsBody = hookNoArgsBody; this.location = new Exception().getStackTrace()[3]; } - public Java8HookDefinition(String[] tagExpressions, int order, long timeoutMillis, HookBody hookBody) { + Java8HookDefinition(String tagExpressions, int order, long timeoutMillis, HookBody hookBody) { this(tagExpressions, order, timeoutMillis, hookBody, null); } - public Java8HookDefinition(String[] tagExpressions, int order, long timeoutMillis, HookNoArgsBody hookNoArgsBody) { + Java8HookDefinition(String tagExpressions, int order, long timeoutMillis, HookNoArgsBody hookNoArgsBody) { this(tagExpressions, order, timeoutMillis, null, hookNoArgsBody); } diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 12e15aaccc..8bcda5b1b8 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -154,21 +154,21 @@ public void addStepDefinition(Function stepDefinit void addHook(Annotation annotation, Method method) { if (objectFactory.addClass(method.getDeclaringClass())) { if (annotation.annotationType().equals(Before.class)) { - String[] tagExpressions = ((Before) annotation).value(); + String tagExpression = ((Before) annotation).value(); long timeout = ((Before) annotation).timeout(); - addBeforeHookDefinition(new JavaHookDefinition(method, tagExpressions, ((Before) annotation).order(), timeout, objectFactory)); + addBeforeHookDefinition(new JavaHookDefinition(method, tagExpression, ((Before) annotation).order(), timeout, objectFactory)); } else if (annotation.annotationType().equals(After.class)) { - String[] tagExpressions = ((After) annotation).value(); + String tagExpression = ((After) annotation).value(); long timeout = ((After) annotation).timeout(); - addAfterHookDefinition(new JavaHookDefinition(method, tagExpressions, ((After) annotation).order(), timeout, objectFactory)); + addAfterHookDefinition(new JavaHookDefinition(method, tagExpression, ((After) annotation).order(), timeout, objectFactory)); } else if (annotation.annotationType().equals(BeforeStep.class)) { - String[] tagExpressions = ((BeforeStep) annotation).value(); + String tagExpression = ((BeforeStep) annotation).value(); long timeout = ((BeforeStep) annotation).timeout(); - addBeforeStepHookDefinition(new JavaHookDefinition(method, tagExpressions, ((BeforeStep) annotation).order(), timeout, objectFactory)); + addBeforeStepHookDefinition(new JavaHookDefinition(method, tagExpression, ((BeforeStep) annotation).order(), timeout, objectFactory)); } else if (annotation.annotationType().equals(AfterStep.class)) { - String[] tagExpressions = ((AfterStep) annotation).value(); + String tagExpression = ((AfterStep) annotation).value(); long timeout = ((AfterStep) annotation).timeout(); - addAfterStepHookDefinition(new JavaHookDefinition(method, tagExpressions, ((AfterStep) annotation).order(), timeout, objectFactory)); + addAfterStepHookDefinition(new JavaHookDefinition(method, tagExpression, ((AfterStep) annotation).order(), timeout, objectFactory)); } } } @@ -194,7 +194,6 @@ public void addBeforeStepHookDefinition(HookDefinition beforeStepHook) { } - private String expression(Annotation annotation) throws Throwable { Method expressionMethod = annotation.getClass().getMethod("value"); return (String) Invoker.invoke(annotation, expressionMethod, 0); diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index 2e49e91681..f371bd1911 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -22,10 +22,10 @@ class JavaHookDefinition implements HookDefinition { private final int order; private final ObjectFactory objectFactory; - JavaHookDefinition(Method method, String[] tagExpressions, int order, long timeoutMillis, ObjectFactory objectFactory) { + JavaHookDefinition(Method method, String tagExpression, int order, long timeoutMillis, ObjectFactory objectFactory) { this.method = method; this.timeoutMillis = timeoutMillis; - this.tagPredicate = new TagPredicate(asList(tagExpressions)); + this.tagPredicate = new TagPredicate(tagExpression); this.order = order; this.objectFactory = objectFactory; } diff --git a/java/src/main/java/io/cucumber/java/LambdaGlue.java b/java/src/main/java/io/cucumber/java/LambdaGlue.java index 94a92e1e25..efefce4fe0 100644 --- a/java/src/main/java/io/cucumber/java/LambdaGlue.java +++ b/java/src/main/java/io/cucumber/java/LambdaGlue.java @@ -5,169 +5,419 @@ public interface LambdaGlue { - String[] EMPTY_TAG_EXPRESSIONS = new String[0]; + String EMPTY_TAG_EXPRESSIONS = ""; long NO_TIMEOUT = 0; - int DEFAULT_BEFORE_ORDER = 0; + int DEFAULT_BEFORE_ORDER = 1000; int DEFAULT_AFTER_ORDER = 1000; + /** + * Defines an before hook. + * + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void Before(final HookBody body) { JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } - default void Before(String[] tagExpressions, final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpressions, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + /** + * Defines an before hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ + default void Before(String tagExpression, final HookBody body) { + JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } + /** + * Defines an before hook. + * + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void Before(long timeoutMillis, final HookBody body) { JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); } + /** + * Defines an before hook. + * + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void Before(int order, final HookBody body) { JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } - default void Before(String[] tagExpressions, long timeoutMillis, int order, final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpressions, order, timeoutMillis, body)); + /** + * Defines an before hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ + default void Before(String tagExpression, long timeoutMillis, int order, final HookBody body) { + JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } + /** + * Defines an before hook. + * + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void Before(final HookNoArgsBody body) { JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } - default void Before(String[] tagExpressions, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpressions, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + /** + * Defines an before hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param body lambda to execute + */ + default void Before(String tagExpression, final HookNoArgsBody body) { + JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } + /** + * Defines an before hook. + * + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param body lambda to execute + */ default void Before(long timeoutMillis, final HookNoArgsBody body) { JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); } + /** + * Defines an before hook. + * + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute + */ default void Before(int order, final HookNoArgsBody body) { JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } - default void Before(String[] tagExpressions, long timeoutMillis, int order, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpressions, order, timeoutMillis, body)); + /** + * Defines an before hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute + */ + default void Before(String tagExpression, long timeoutMillis, int order, final HookNoArgsBody body) { + JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } + /** + * Defines an before step hook. + * + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void BeforeStep(final HookBody body) { JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } - default void BeforeStep(String[] tagExpressions, final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpressions, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + /** + * Defines an before step hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ + default void BeforeStep(String tagExpression, final HookBody body) { + JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } + /** + * Defines an before step hook. + * + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void BeforeStep(long timeoutMillis, final HookBody body) { JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); } + /** + * Defines an before step hook. + * + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void BeforeStep(int order, final HookBody body) { JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } - default void BeforeStep(String[] tagExpressions, long timeoutMillis, int order, final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpressions, order, timeoutMillis, body)); + /** + * Defines an before step hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ + default void BeforeStep(String tagExpression, long timeoutMillis, int order, final HookBody body) { + JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } + /** + * Defines an before step hook. + * + * @param body lambda to execute + */ default void BeforeStep(final HookNoArgsBody body) { JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } - default void BeforeStep(String[] tagExpressions, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpressions, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + + /** + * Defines an before step hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param body lambda to execute + */ + default void BeforeStep(String tagExpression, final HookNoArgsBody body) { + JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } + + /** + * Defines an before step hook. + * + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param body lambda to execute + */ default void BeforeStep(long timeoutMillis, final HookNoArgsBody body) { JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); } + /** + * Defines an before step hook. + * + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute + */ default void BeforeStep(int order, final HookNoArgsBody body) { JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } - default void BeforeStep(String[] tagExpressions, long timeoutMillis, int order, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpressions, order, timeoutMillis, body)); + /** + * Defines an before step hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute + */ + default void BeforeStep(String tagExpression, long timeoutMillis, int order, final HookNoArgsBody body) { + JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } + /** + * Defines an after hook. + * + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void After(final HookBody body) { JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } - default void After(String[] tagExpressions, final HookBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpressions, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + /** + * Defines an after hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ + default void After(String tagExpression, final HookBody body) { + JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } + /** + * Defines an after hook. + * + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void After(long timeoutMillis, final HookBody body) { JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); } + /** + * Defines an after hook. + * + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void After(int order, final HookBody body) { JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } - default void After(String[] tagExpressions, long timeoutMillis, int order, final HookBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpressions, order, timeoutMillis, body)); + /** + * Defines and after hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ + default void After(String tagExpression, long timeoutMillis, int order, final HookBody body) { + JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } + /** + * Defines and after hook. + * + * @param body lambda to execute + */ default void After(final HookNoArgsBody body) { JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } - default void After(String[] tagExpressions, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpressions, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + /** + * Defines and after hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param body lambda to execute + */ + default void After(String tagExpression, final HookNoArgsBody body) { + JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } + /** + * Defines and after hook. + * + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param body lambda to execute + */ default void After(long timeoutMillis, final HookNoArgsBody body) { JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); } + /** + * Defines and after hook. + * + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute + */ default void After(int order, final HookNoArgsBody body) { JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } - default void After(String[] tagExpressions, long timeoutMillis, int order, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpressions, order, timeoutMillis, body)); + /** + * Defines and after hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute + */ + default void After(String tagExpression, long timeoutMillis, int order, final HookNoArgsBody body) { + JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } + /** + * Defines and after step hook. + * + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void AfterStep(final HookBody body) { JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } - default void AfterStep(String[] tagExpressions, final HookBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpressions, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + /** + * Defines and after step hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ + default void AfterStep(String tagExpression, final HookBody body) { + JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } + /** + * Defines and after step hook. + * + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void AfterStep(long timeoutMillis, final HookBody body) { JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); } + /** + * Defines and after step hook. + * + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ default void AfterStep(int order, final HookBody body) { JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } - default void AfterStep(String[] tagExpressions, long timeoutMillis, int order, final HookBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpressions, order, timeoutMillis, body)); + /** + * Defines and after step hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument + */ + default void AfterStep(String tagExpression, long timeoutMillis, int order, final HookBody body) { + JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } + /** + * Defines and after step hook. + * + * @param body lambda to execute + */ default void AfterStep(final HookNoArgsBody body) { JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } - default void AfterStep(String[] tagExpressions, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpressions, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + /** + * Defines and after step hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param body lambda to execute + */ + default void AfterStep(String tagExpression, final HookNoArgsBody body) { + JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } + /** + * Defines and after step hook. + * + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param body lambda to execute + */ default void AfterStep(long timeoutMillis, final HookNoArgsBody body) { JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); } + /** + * Defines and after step hook. + * + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute + */ default void AfterStep(int order, final HookNoArgsBody body) { JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } - default void AfterStep(String[] tagExpressions, long timeoutMillis, int order, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpressions, order, timeoutMillis, body)); + /** + * Defines and after step hook. + * + * @param tagExpression a tag expression, if the expression applies to the current scenario this hook will be executed + * @param timeoutMillis max amount of milliseconds this is allowed to run for + * @param order the order in which this hook should run. Higher numbers are run first + * @param body lambda to execute + */ + default void AfterStep(String tagExpression, long timeoutMillis, int order, final HookNoArgsBody body) { + JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } } diff --git a/java/src/main/java/io/cucumber/java/api/After.java b/java/src/main/java/io/cucumber/java/api/After.java index eaa644da60..793be6f86f 100644 --- a/java/src/main/java/io/cucumber/java/api/After.java +++ b/java/src/main/java/io/cucumber/java/api/After.java @@ -11,7 +11,7 @@ /** * @return a tag expression */ - String[] value() default {}; + String value() default ""; /** * @return max amount of milliseconds this is allowed to run for. 0 (default) means no restriction. diff --git a/java/src/main/java/io/cucumber/java/api/AfterStep.java b/java/src/main/java/io/cucumber/java/api/AfterStep.java index 9c5dfaadc0..5eb8a74077 100644 --- a/java/src/main/java/io/cucumber/java/api/AfterStep.java +++ b/java/src/main/java/io/cucumber/java/api/AfterStep.java @@ -9,9 +9,9 @@ @Target(ElementType.METHOD) public @interface AfterStep { /** - * @return a tag expression + * @return a tag expression, if the expression applies to the current scenario this hook will be executed. */ - String[] value() default {}; + String value() default ""; /** * @return max amount of milliseconds this is allowed to run for. 0 (default) means no restriction. diff --git a/java/src/main/java/io/cucumber/java/api/Before.java b/java/src/main/java/io/cucumber/java/api/Before.java index feedc57c91..db6b786355 100644 --- a/java/src/main/java/io/cucumber/java/api/Before.java +++ b/java/src/main/java/io/cucumber/java/api/Before.java @@ -11,7 +11,7 @@ /** * @return a tag expression */ - String[] value() default {}; + String value() default ""; /** * @return max amount of milliseconds this is allowed to run for. 0 (default) means no restriction. diff --git a/java/src/main/java/io/cucumber/java/api/BeforeStep.java b/java/src/main/java/io/cucumber/java/api/BeforeStep.java index 7e7e1f68ad..bf82131a7a 100644 --- a/java/src/main/java/io/cucumber/java/api/BeforeStep.java +++ b/java/src/main/java/io/cucumber/java/api/BeforeStep.java @@ -11,7 +11,7 @@ /** * @return a tag expression */ - String[] value() default {}; + String value() default ""; /** * @return max amount of milliseconds this is allowed to run for. 0 (default) means no restriction. diff --git a/java/src/main/java/io/cucumber/java/api/HookBody.java b/java/src/main/java/io/cucumber/java/api/HookBody.java index afba2bbe66..ad72ca6292 100644 --- a/java/src/main/java/io/cucumber/java/api/HookBody.java +++ b/java/src/main/java/io/cucumber/java/api/HookBody.java @@ -2,6 +2,7 @@ import io.cucumber.core.api.Scenario; +@FunctionalInterface public interface HookBody { void accept(Scenario scenario) throws Throwable; } diff --git a/java/src/main/java/io/cucumber/java/api/HookNoArgsBody.java b/java/src/main/java/io/cucumber/java/api/HookNoArgsBody.java index e261abae41..1ce5344301 100644 --- a/java/src/main/java/io/cucumber/java/api/HookNoArgsBody.java +++ b/java/src/main/java/io/cucumber/java/api/HookNoArgsBody.java @@ -1,5 +1,6 @@ package io.cucumber.java.api; +@FunctionalInterface public interface HookNoArgsBody { void accept() throws Throwable; } diff --git a/java/src/test/java/io/cucumber/java/JavaHookTest.java b/java/src/test/java/io/cucumber/java/JavaHookTest.java index 15d172b437..7e2ed1e961 100644 --- a/java/src/test/java/io/cucumber/java/JavaHookTest.java +++ b/java/src/test/java/io/cucumber/java/JavaHookTest.java @@ -192,7 +192,7 @@ public void fails_if_hook_argument_is_not_scenario_result() throws Throwable { public static class HasHooks { - @Before({"(@foo or @bar) and @zap"}) + @Before("(@foo or @bar) and @zap") public void before() { } diff --git a/spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java b/spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java index 7e4cfc4229..d1f5c8cf5d 100644 --- a/spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java +++ b/spring/src/main/java/io/cucumber/spring/api/SpringTransactionHooks.java @@ -55,12 +55,12 @@ public void setTxnManagerBeanName(String txnManagerBeanName) { private TransactionStatus transactionStatus; - @Before(value = {"@txn"}, order = 100) + @Before(value = "@txn", order = 100) public void startTransaction() { transactionStatus = obtainPlatformTransactionManager().getTransaction(new DefaultTransactionDefinition()); } - @After(value = {"@txn"}, order = 100) + @After(value = "@txn", order = 100) public void rollBackTransaction() { obtainPlatformTransactionManager().rollback(transactionStatus); } diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java b/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java index 01e00a5318..df731d2359 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java @@ -22,13 +22,13 @@ public void the_scenarios_shall_execute_within_a_transaction() throws Throwable TransactionSynchronizationManager.isActualTransactionActive()); } - @Before(value = {"@txn"}, order = 99) + @Before(value = "@txn", order = 99) public void before_transaction_scenario() { assertFalse("A transaction is active", TransactionSynchronizationManager.isActualTransactionActive()); } - @After(value = {"@txn"}, order = 99) + @After(value = "@txn", order = 99) public void after_transaction_scenario() { assertFalse("A transaction is active", TransactionSynchronizationManager.isActualTransactionActive()); From d3af6c3e5fda202a38f0425ba8bdb62873ba434e Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 5 Oct 2018 22:22:41 +0200 Subject: [PATCH 049/155] Set version to master to avoid merge conflicts --- core/pom.xml | 2 +- examples/java-calculator-testng/pom.xml | 2 +- examples/java-calculator/pom.xml | 2 +- examples/java-wicket/java-wicket-main/pom.xml | 2 +- examples/java-wicket/java-wicket-test/pom.xml | 2 +- examples/java-wicket/pom.xml | 2 +- examples/java8-calculator/pom.xml | 2 +- examples/pom.xml | 2 +- examples/spring-txn/pom.xml | 2 +- guice/pom.xml | 2 +- java/pom.xml | 2 +- junit/pom.xml | 2 +- kotlin-java8/pom.xml | 2 +- needle/pom.xml | 2 +- openejb/pom.xml | 2 +- picocontainer/pom.xml | 2 +- pom.xml | 2 +- spring/pom.xml | 2 +- testng/pom.xml | 2 +- weld/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 38c6605c08..a106f5b86d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT cucumber-core diff --git a/examples/java-calculator-testng/pom.xml b/examples/java-calculator-testng/pom.xml index 85040c9d62..ab13cdfea3 100644 --- a/examples/java-calculator-testng/pom.xml +++ b/examples/java-calculator-testng/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT java-calculator-testng diff --git a/examples/java-calculator/pom.xml b/examples/java-calculator/pom.xml index 253c79523e..a57d8df0e7 100644 --- a/examples/java-calculator/pom.xml +++ b/examples/java-calculator/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT java-calculator diff --git a/examples/java-wicket/java-wicket-main/pom.xml b/examples/java-wicket/java-wicket-main/pom.xml index 7cb2916c06..5c4a94ad1c 100644 --- a/examples/java-wicket/java-wicket-main/pom.xml +++ b/examples/java-wicket/java-wicket-main/pom.xml @@ -3,7 +3,7 @@ io.cucumber java-wicket - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT java-wicket-main Examples: Wicket application diff --git a/examples/java-wicket/java-wicket-test/pom.xml b/examples/java-wicket/java-wicket-test/pom.xml index 415925b6c3..4984a4b550 100644 --- a/examples/java-wicket/java-wicket-test/pom.xml +++ b/examples/java-wicket/java-wicket-test/pom.xml @@ -3,7 +3,7 @@ io.cucumber java-wicket - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT java-wicket-test Examples: Wicket application tested with Selenium diff --git a/examples/java-wicket/pom.xml b/examples/java-wicket/pom.xml index 202600c6a4..8c562b33e8 100644 --- a/examples/java-wicket/pom.xml +++ b/examples/java-wicket/pom.xml @@ -3,7 +3,7 @@ io.cucumber cucumber-examples - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT java-wicket pom diff --git a/examples/java8-calculator/pom.xml b/examples/java8-calculator/pom.xml index 6ccf834c4b..d6046109ae 100644 --- a/examples/java8-calculator/pom.xml +++ b/examples/java8-calculator/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT java8-calculator diff --git a/examples/pom.xml b/examples/pom.xml index 971b1bf0bb..aabf3a71d0 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT cucumber-examples diff --git a/examples/spring-txn/pom.xml b/examples/spring-txn/pom.xml index 88cb8fca33..4ce5ecc06d 100644 --- a/examples/spring-txn/pom.xml +++ b/examples/spring-txn/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT spring-txn diff --git a/guice/pom.xml b/guice/pom.xml index 4f5aed4ee1..f3757444a9 100644 --- a/guice/pom.xml +++ b/guice/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT cucumber-guice diff --git a/java/pom.xml b/java/pom.xml index d5b11f3691..57e679f061 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT cucumber-java diff --git a/junit/pom.xml b/junit/pom.xml index 65c070f696..2ad7798caa 100644 --- a/junit/pom.xml +++ b/junit/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT cucumber-junit diff --git a/kotlin-java8/pom.xml b/kotlin-java8/pom.xml index 650fd8b7d9..a51530f550 100644 --- a/kotlin-java8/pom.xml +++ b/kotlin-java8/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT cucumber-kotlin-java8 diff --git a/needle/pom.xml b/needle/pom.xml index 077a9b5aed..31373f294c 100644 --- a/needle/pom.xml +++ b/needle/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT cucumber-needle diff --git a/openejb/pom.xml b/openejb/pom.xml index 7e7f17ad11..c6743284d3 100644 --- a/openejb/pom.xml +++ b/openejb/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT cucumber-openejb diff --git a/picocontainer/pom.xml b/picocontainer/pom.xml index c1834ff603..1f76f74bee 100644 --- a/picocontainer/pom.xml +++ b/picocontainer/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT cucumber-picocontainer diff --git a/pom.xml b/pom.xml index 8760688bb5..5ffad93434 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT pom Cucumber-JVM Cucumber for the JVM diff --git a/spring/pom.xml b/spring/pom.xml index 69475ccfba..18d8f00e42 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT cucumber-spring diff --git a/testng/pom.xml b/testng/pom.xml index 59a05042c0..279e530419 100644 --- a/testng/pom.xml +++ b/testng/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT cucumber-testng diff --git a/weld/pom.xml b/weld/pom.xml index 16e449ebdd..2c431a6de3 100644 --- a/weld/pom.xml +++ b/weld/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.0.2-SNAPSHOT cucumber-weld From e0ed878bc698b03f605e3a72dad4b2de3d536816 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 5 Oct 2018 22:29:08 +0200 Subject: [PATCH 050/155] Restore version --- core/pom.xml | 2 +- examples/java-calculator-testng/pom.xml | 2 +- examples/java-calculator/pom.xml | 2 +- examples/java-wicket/java-wicket-main/pom.xml | 2 +- examples/java-wicket/java-wicket-test/pom.xml | 2 +- examples/java-wicket/pom.xml | 2 +- examples/java8-calculator/pom.xml | 2 +- examples/pom.xml | 2 +- examples/spring-txn/pom.xml | 2 +- guice/pom.xml | 2 +- java/pom.xml | 2 +- junit/pom.xml | 2 +- kotlin-java8/pom.xml | 2 +- needle/pom.xml | 2 +- openejb/pom.xml | 2 +- picocontainer/pom.xml | 2 +- pom.xml | 2 +- spring/pom.xml | 2 +- testng/pom.xml | 2 +- weld/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index a106f5b86d..38c6605c08 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-core diff --git a/examples/java-calculator-testng/pom.xml b/examples/java-calculator-testng/pom.xml index ab13cdfea3..85040c9d62 100644 --- a/examples/java-calculator-testng/pom.xml +++ b/examples/java-calculator-testng/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT java-calculator-testng diff --git a/examples/java-calculator/pom.xml b/examples/java-calculator/pom.xml index a57d8df0e7..253c79523e 100644 --- a/examples/java-calculator/pom.xml +++ b/examples/java-calculator/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT java-calculator diff --git a/examples/java-wicket/java-wicket-main/pom.xml b/examples/java-wicket/java-wicket-main/pom.xml index 5c4a94ad1c..7cb2916c06 100644 --- a/examples/java-wicket/java-wicket-main/pom.xml +++ b/examples/java-wicket/java-wicket-main/pom.xml @@ -3,7 +3,7 @@ io.cucumber java-wicket - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT java-wicket-main Examples: Wicket application diff --git a/examples/java-wicket/java-wicket-test/pom.xml b/examples/java-wicket/java-wicket-test/pom.xml index 4984a4b550..415925b6c3 100644 --- a/examples/java-wicket/java-wicket-test/pom.xml +++ b/examples/java-wicket/java-wicket-test/pom.xml @@ -3,7 +3,7 @@ io.cucumber java-wicket - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT java-wicket-test Examples: Wicket application tested with Selenium diff --git a/examples/java-wicket/pom.xml b/examples/java-wicket/pom.xml index 8c562b33e8..202600c6a4 100644 --- a/examples/java-wicket/pom.xml +++ b/examples/java-wicket/pom.xml @@ -3,7 +3,7 @@ io.cucumber cucumber-examples - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT java-wicket pom diff --git a/examples/java8-calculator/pom.xml b/examples/java8-calculator/pom.xml index d6046109ae..6ccf834c4b 100644 --- a/examples/java8-calculator/pom.xml +++ b/examples/java8-calculator/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT java8-calculator diff --git a/examples/pom.xml b/examples/pom.xml index aabf3a71d0..971b1bf0bb 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-examples diff --git a/examples/spring-txn/pom.xml b/examples/spring-txn/pom.xml index 4ce5ecc06d..88cb8fca33 100644 --- a/examples/spring-txn/pom.xml +++ b/examples/spring-txn/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT spring-txn diff --git a/guice/pom.xml b/guice/pom.xml index f3757444a9..4f5aed4ee1 100644 --- a/guice/pom.xml +++ b/guice/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-guice diff --git a/java/pom.xml b/java/pom.xml index 57e679f061..d5b11f3691 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-java diff --git a/junit/pom.xml b/junit/pom.xml index 2ad7798caa..65c070f696 100644 --- a/junit/pom.xml +++ b/junit/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-junit diff --git a/kotlin-java8/pom.xml b/kotlin-java8/pom.xml index a51530f550..650fd8b7d9 100644 --- a/kotlin-java8/pom.xml +++ b/kotlin-java8/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-kotlin-java8 diff --git a/needle/pom.xml b/needle/pom.xml index 31373f294c..077a9b5aed 100644 --- a/needle/pom.xml +++ b/needle/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-needle diff --git a/openejb/pom.xml b/openejb/pom.xml index c6743284d3..7e7f17ad11 100644 --- a/openejb/pom.xml +++ b/openejb/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-openejb diff --git a/picocontainer/pom.xml b/picocontainer/pom.xml index 1f76f74bee..c1834ff603 100644 --- a/picocontainer/pom.xml +++ b/picocontainer/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-picocontainer diff --git a/pom.xml b/pom.xml index 5ffad93434..8760688bb5 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT pom Cucumber-JVM Cucumber for the JVM diff --git a/spring/pom.xml b/spring/pom.xml index 18d8f00e42..69475ccfba 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-spring diff --git a/testng/pom.xml b/testng/pom.xml index 279e530419..59a05042c0 100644 --- a/testng/pom.xml +++ b/testng/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-testng diff --git a/weld/pom.xml b/weld/pom.xml index 2c431a6de3..16e449ebdd 100644 --- a/weld/pom.xml +++ b/weld/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.0.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-weld From bb94e26bf048361f5c4ed54081cbc99a9cfb5469 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Thu, 1 Nov 2018 18:58:00 +0100 Subject: [PATCH 051/155] Fix merge --- core/pom.xml | 76 ------------------- .../cucumber/core/plugin/PrettyFormatter.java | 2 +- .../StepExpressionFactoryTest.java | 1 - .../stepexpression/TypeRegistryTest.java | 1 + .../java/calculator/ParameterTypes.java | 10 +-- .../io/cucumber/guice/api/CucumberScopes.java | 33 +++++++- .../io/cucumber/guice/api/package-info.java | 4 +- .../io/cucumber/guice/GuiceFactoryTest.java | 7 +- .../cucumber/junit/api/SkippedThrowable.java | 4 +- pom.xml | 1 - 10 files changed, 43 insertions(+), 96 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 2d76d8e517..38c6605c08 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -118,82 +118,6 @@ - - org.revapi - revapi-maven-plugin - - - - - java.method.addedToInterface - method void cucumber.api.TypeRegistry::setDefaultParameterTransformer(io.cucumber.cucumberexpressions.ParameterByTypeTransformer) - cucumber.api - cucumber.api.TypeRegistry - TypeRegistry - setDefaultParameterTransformer - method - This interface can be used by users of Cucumber but should not be implemented. - - - java.method.numberOfParametersChanged - method java.util.List<io.cucumber.stepexpression.Argument> io.cucumber.stepexpression.ArgumentMatcher::argumentsFrom(gherkin.pickles.PickleStep) - method java.util.List<io.cucumber.stepexpression.Argument> io.cucumber.stepexpression.ArgumentMatcher::argumentsFrom(gherkin.pickles.PickleStep, java.lang.reflect.Type[]) - io.cucumber.stepexpression - io.cucumber.stepexpression.ArgumentMatcher - ArgumentMatcher - argumentsFrom - method - This class is part of Cucumbers internal API. The change adds a vararg argument. - - - java.method.numberOfParametersChanged - method java.util.List<io.cucumber.stepexpression.Argument> io.cucumber.stepexpression.ExpressionArgumentMatcher::argumentsFrom(gherkin.pickles.PickleStep) - method java.util.List<io.cucumber.stepexpression.Argument> io.cucumber.stepexpression.ExpressionArgumentMatcher::argumentsFrom(gherkin.pickles.PickleStep, java.lang.reflect.Type[]) - io.cucumber.stepexpression - io.cucumber.stepexpression.ExpressionArgumentMatcher - ExpressionArgumentMatcher - argumentsFrom - method - This class is part of Cucumbers internal API. - - - java.method.numberOfParametersChanged - method java.util.List<io.cucumber.stepexpression.Argument> io.cucumber.stepexpression.StepExpression::match(java.lang.String) - method java.util.List<io.cucumber.stepexpression.Argument> io.cucumber.stepexpression.StepExpression::match(java.lang.String, java.lang.reflect.Type[]) - io.cucumber.stepexpression - io.cucumber.stepexpression.StepExpression - StepExpression - match - method - This class is part of Cucumbers internal API. The change adds a vararg argument. - - - java.method.numberOfParametersChanged - method java.util.List<io.cucumber.stepexpression.Argument> io.cucumber.stepexpression.StepExpression::match(java.lang.String, java.lang.String) - method java.util.List<io.cucumber.stepexpression.Argument> io.cucumber.stepexpression.StepExpression::match(java.lang.String, java.lang.String, java.lang.reflect.Type[]) - io.cucumber.stepexpression - io.cucumber.stepexpression.StepExpression - StepExpression - match - method - This class is part of Cucumbers internal API. The change adds a vararg argument. - - - java.method.numberOfParametersChanged - method java.util.List<io.cucumber.stepexpression.Argument> io.cucumber.stepexpression.StepExpression::match(java.lang.String, java.util.List<java.util.List<java.lang.String>>) - method java.util.List<io.cucumber.stepexpression.Argument> io.cucumber.stepexpression.StepExpression::match(java.lang.String, java.util.List<java.util.List<java.lang.String>>, java.lang.reflect.Type[]) - io.cucumber.stepexpression - io.cucumber.stepexpression.StepExpression - StepExpression - match - method - This class is part of Cucumbers internal API. The change adds a vararg argument. - - - - - - diff --git a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java index c8d7bf3804..7d4b7fc416 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java @@ -28,7 +28,7 @@ import java.util.List; -final class PrettyFormatter implements EventListener, ColorAware { +public final class PrettyFormatter implements EventListener, ColorAware { private static final String SCENARIO_INDENT = " "; private static final String STEP_INDENT = " "; private static final String EXAMPLES_INDENT = " "; diff --git a/core/src/test/java/io/cucumber/core/stepexpression/StepExpressionFactoryTest.java b/core/src/test/java/io/cucumber/core/stepexpression/StepExpressionFactoryTest.java index e6672f3bd0..227e39e73a 100644 --- a/core/src/test/java/io/cucumber/core/stepexpression/StepExpressionFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/stepexpression/StepExpressionFactoryTest.java @@ -14,7 +14,6 @@ import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertSame; public class StepExpressionFactoryTest { diff --git a/core/src/test/java/io/cucumber/stepexpression/TypeRegistryTest.java b/core/src/test/java/io/cucumber/stepexpression/TypeRegistryTest.java index 18ab53ebf1..101cac15d1 100644 --- a/core/src/test/java/io/cucumber/stepexpression/TypeRegistryTest.java +++ b/core/src/test/java/io/cucumber/stepexpression/TypeRegistryTest.java @@ -1,5 +1,6 @@ package io.cucumber.stepexpression; +import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.cucumberexpressions.ParameterByTypeTransformer; import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.cucumberexpressions.Transformer; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java index d3b0d6f464..d2883035c0 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ParameterTypes.java @@ -1,11 +1,11 @@ package io.cucumber.examples.java.calculator; -import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.core.api.TypeRegistry; -import io.cucumber.datatable.DataTableType; -import io.cucumber.examples.java.calculator.RpnCalculatorStepdefs.Entry; -import io.cucumber.examples.java.calculator.ShoppingStepdefs.Grocery; -import io.cucumber.cucumberexpressions.ParameterType; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.cucumberexpressions.ParameterByTypeTransformer; +import io.cucumber.datatable.TableCellByTypeTransformer; +import io.cucumber.datatable.TableEntryByTypeTransformer; +import io.cucumber.datatable.dependency.com.fasterxml.jackson.databind.ObjectMapper; import java.lang.reflect.Type; import java.util.Locale; diff --git a/guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java b/guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java index 28436f9212..9f46f9fdcb 100644 --- a/guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java +++ b/guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java @@ -1,9 +1,36 @@ package io.cucumber.guice.api; +import com.google.inject.Module; + /** - * Provides a convenient ScenarioScope instance for use when declaring bindings - * in implementations of com.google.inject.Module. + * Creates an instance of {@link ScenarioScope} for use when declaring bindings + * in implementations of {@link Module}. + *

      + * Note that when binding objects to the scenario scope it is recommended to bind + * them to the {@link ScenarioScoped} annotation instead. E.g: + * + * bind(ScenarioScopedObject.class).in(ScenarioScoped.class); */ public class CucumberScopes { - public static final ScenarioScope SCENARIO = new SequentialScenarioScope(); + /** + * A convenient instance of {@link ScenarioScope}. Should only be used + * in combination with {@link CucumberModules#SCENARIO}. + *

      + * Note that using this in combination with parallel execution results in + * undefined behaviour. + * + * @deprecated please use {@link #createScenarioScope()} instead + */ + @Deprecated + public static final ScenarioScope SCENARIO = createScenarioScope(); + + /** + * Creates a new instance of a ScenarioScope. + * + * @return a new instance of a ScenarioScope. + */ + public static ScenarioScope createScenarioScope() { + return new SequentialScenarioScope(); + } + } diff --git a/guice/src/main/java/io/cucumber/guice/api/package-info.java b/guice/src/main/java/io/cucumber/guice/api/package-info.java index f83f56e1df..d91b00979b 100644 --- a/guice/src/main/java/io/cucumber/guice/api/package-info.java +++ b/guice/src/main/java/io/cucumber/guice/api/package-info.java @@ -122,7 +122,7 @@ * Guice injector and it's Guice modules. The injector must provide a binding for * io.cucumber.guice.api.ScenarioScope. It should also provide a binding for the * io.cucumber.guice.api.ScenarioScoped annotation if your classes are using the annotation. The - * easiest way to do this it to use CucumberModules.SCENARIO. For example: + * easiest way to do this it to use CucumberModules.createScenarioModule(). For example: *

      *
        * import com.google.inject.Guice;
      @@ -135,7 +135,7 @@
        *
        * {@literal @}Override
        * public Injector getInjector() {
      - * return Guice.createInjector(Stage.PRODUCTION, CucumberModules.SCENARIO, new YourModule());
      + * return Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new YourModule());
        * }
        * }
        * 
      diff --git a/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java index 02b0f9e781..fb6623c059 100644 --- a/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java +++ b/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java @@ -6,16 +6,11 @@ import com.google.inject.Module; import com.google.inject.Scopes; import com.google.inject.Stage; -import io.cucumber.guice.GuiceFactory; -import io.cucumber.java.api.ObjectFactory; import io.cucumber.guice.api.CucumberModules; -import io.cucumber.guice.api.CucumberScopes; import io.cucumber.guice.api.ScenarioScoped; import io.cucumber.guice.matcher.ElementsAreAllEqualMatcher; import io.cucumber.guice.matcher.ElementsAreAllUniqueMatcher; -import cucumber.api.guice.CucumberModules; -import cucumber.api.java.ObjectFactory; -import cucumber.runtime.java.guice.ScenarioScoped; +import io.cucumber.java.api.ObjectFactory; import org.junit.After; import org.junit.Rule; import org.junit.Test; diff --git a/junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java b/junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java index c27577d81b..e0be481e79 100644 --- a/junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java +++ b/junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java @@ -1,5 +1,7 @@ package io.cucumber.junit.api; +import static java.util.Locale.ROOT; + class SkippedThrowable extends Throwable { private static final long serialVersionUID = 1L; @@ -12,7 +14,7 @@ enum NotificationLevel { STEP; String lowerCaseName() { - return name().toLowerCase(); + return name().toLowerCase(ROOT); } } } diff --git a/pom.xml b/pom.xml index 9379a95c50..cd4221ad71 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,6 @@ 4.3.20.RELEASE 1.11.16.RELEASE 5.3.6.Final - 2.4.1 4.2.0 1.11.3 From 27f9b33f425fab957c3238d974ddeb4d20d7cff3 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 3 Nov 2018 23:31:10 +0100 Subject: [PATCH 052/155] [JUnit] Only report the first failed assumption The junit-vintage implementation of junit-5 reports multiple failed assumptions as a MultipleFailure and treats it as a failure of the test case. As such we can only provide the first failed assumption. --- .../io/cucumber/junit/api/JUnitReporter.java | 12 ++++---- .../cucumber/junit/api/FeatureRunnerTest.java | 10 +++---- .../cucumber/junit/api/JUnitReporterTest.java | 20 ++++--------- picocontainer/pom.xml | 2 +- pom.xml | 29 +++++++++++++++++++ 5 files changed, 46 insertions(+), 27 deletions(-) diff --git a/junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java b/junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java index 83011e794d..c419b17d5c 100644 --- a/junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java +++ b/junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java @@ -160,15 +160,15 @@ void handleTestCaseResult(Result result) { if (stepErrors.isEmpty()) { stepErrors.add(new SkippedThrowable(SCENARIO)); } - for (Throwable error : stepErrors) { - pickleRunnerNotifier.addFailedAssumption(error); - } + stepErrors.stream() + .findFirst() + .ifPresent(error -> pickleRunnerNotifier.addFailedAssumption(error)); break; case PENDING: case UNDEFINED: - for (Throwable error : stepErrors) { - addFailureOrFailedAssumptionDependingOnStrictMode(pickleRunnerNotifier, error); - } + stepErrors.stream() + .findFirst() + .ifPresent(error -> addFailureOrFailedAssumptionDependingOnStrictMode(pickleRunnerNotifier, error)); break; case AMBIGUOUS: case FAILED: diff --git a/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java index 249774d71d..b5f1875211 100644 --- a/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java @@ -108,13 +108,13 @@ public void should_not_issue_notification_for_steps_by_default_scenario_outline_ InOrder order = inOrder(notifier); order.verify(notifier).fireTestStarted(argThat(new DescriptionMatcher("scenario outline name(feature name)"))); - order.verify(notifier, times(3)).fireTestAssumptionFailed(argThat(new FailureMatcher("scenario outline name(feature name)"))); + order.verify(notifier, times(1)).fireTestAssumptionFailed(argThat(new FailureMatcher("scenario outline name(feature name)"))); order.verify(notifier).fireTestFinished(argThat(new DescriptionMatcher("scenario outline name(feature name)"))); order.verify(notifier).fireTestStarted(argThat(new DescriptionMatcher("scenario outline name(feature name)"))); - order.verify(notifier, times(3)).fireTestAssumptionFailed(argThat(new FailureMatcher("scenario outline name(feature name)"))); + order.verify(notifier, times(1)).fireTestAssumptionFailed(argThat(new FailureMatcher("scenario outline name(feature name)"))); order.verify(notifier).fireTestFinished(argThat(new DescriptionMatcher("scenario outline name(feature name)"))); order.verify(notifier).fireTestStarted(argThat(new DescriptionMatcher("scenario outline name(feature name)"))); - order.verify(notifier, times(3)).fireTestAssumptionFailed(argThat(new FailureMatcher("scenario outline name(feature name)"))); + order.verify(notifier, times(1)).fireTestAssumptionFailed(argThat(new FailureMatcher("scenario outline name(feature name)"))); order.verify(notifier).fireTestFinished(argThat(new DescriptionMatcher("scenario outline name(feature name)"))); } @@ -135,10 +135,10 @@ public void should_not_issue_notification_for_steps_by_default_two_scenarios_wit InOrder order = inOrder(notifier); order.verify(notifier).fireTestStarted(argThat(new DescriptionMatcher("scenario_1 name(feature name)"))); - order.verify(notifier, times(3)).fireTestAssumptionFailed(argThat(new FailureMatcher("scenario_1 name(feature name)"))); + order.verify(notifier, times(1)).fireTestAssumptionFailed(argThat(new FailureMatcher("scenario_1 name(feature name)"))); order.verify(notifier).fireTestFinished(argThat(new DescriptionMatcher("scenario_1 name(feature name)"))); order.verify(notifier).fireTestStarted(argThat(new DescriptionMatcher("scenario_2 name(feature name)"))); - order.verify(notifier, times(2)).fireTestAssumptionFailed(argThat(new FailureMatcher("scenario_2 name(feature name)"))); + order.verify(notifier, times(1)).fireTestAssumptionFailed(argThat(new FailureMatcher("scenario_2 name(feature name)"))); order.verify(notifier).fireTestFinished(argThat(new DescriptionMatcher("scenario_2 name(feature name)"))); } diff --git a/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java b/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java index 15d219ebbb..fb537577ec 100644 --- a/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java @@ -334,14 +334,12 @@ public void test_case_finished_fires_assumption_failed_and_test_finished_for_ski jUnitReporter.handleTestCaseResult(result); ArgumentCaptor failureArgumentCaptor = ArgumentCaptor.forClass(Failure.class); - verify(runNotifier, times(2)).fireTestAssumptionFailed(failureArgumentCaptor.capture()); + verify(runNotifier, times(1)).fireTestAssumptionFailed(failureArgumentCaptor.capture()); verify(runNotifier).fireTestFinished(description); List failures = failureArgumentCaptor.getAllValues(); assertEquals(description, failures.get(0).getDescription()); assertEquals(exception1, failures.get(0).getException()); - assertEquals(description, failures.get(1).getDescription()); - assertEquals(exception2, failures.get(1).getException()); } @Test @@ -357,14 +355,12 @@ public void test_case_finished_fires_assumption_failed_and_test_finished_for_pen jUnitReporter.handleTestCaseResult(result); ArgumentCaptor failureArgumentCaptor = ArgumentCaptor.forClass(Failure.class); - verify(runNotifier, times(2)).fireTestAssumptionFailed(failureArgumentCaptor.capture()); + verify(runNotifier, times(1)).fireTestAssumptionFailed(failureArgumentCaptor.capture()); verify(runNotifier).fireTestFinished(description); List failures = failureArgumentCaptor.getAllValues(); assertEquals(description, failures.get(0).getDescription()); assertEquals(exception1, failures.get(0).getException()); - assertEquals(description, failures.get(1).getDescription()); - assertEquals(exception2, failures.get(1).getException()); } @Test @@ -380,14 +376,12 @@ public void test_case_finished_fires_failure_and_test_finished_for_pending_step_ jUnitReporter.handleTestCaseResult(result); ArgumentCaptor failureArgumentCaptor = ArgumentCaptor.forClass(Failure.class); - verify(runNotifier, times(2)).fireTestFailure(failureArgumentCaptor.capture()); + verify(runNotifier, times(1)).fireTestFailure(failureArgumentCaptor.capture()); verify(runNotifier).fireTestFinished(description); List failures = failureArgumentCaptor.getAllValues(); assertEquals(description, failures.get(0).getDescription()); assertEquals(exception1, failures.get(0).getException()); - assertEquals(description, failures.get(1).getDescription()); - assertEquals(exception2, failures.get(1).getException()); } @Test @@ -403,14 +397,12 @@ public void test_case_finished_fires_assumption_failed_and_test_finished_for_und jUnitReporter.handleTestCaseResult(result); ArgumentCaptor failureArgumentCaptor = ArgumentCaptor.forClass(Failure.class); - verify(runNotifier, times(2)).fireTestAssumptionFailed(failureArgumentCaptor.capture()); + verify(runNotifier, times(1)).fireTestAssumptionFailed(failureArgumentCaptor.capture()); verify(runNotifier).fireTestFinished(description); List failures = failureArgumentCaptor.getAllValues(); assertEquals(description, failures.get(0).getDescription()); assertEquals(exception1, failures.get(0).getException()); - assertEquals(description, failures.get(1).getDescription()); - assertEquals(exception2, failures.get(1).getException()); } @Test @@ -426,14 +418,12 @@ public void test_case_finished_fires_failure_and_test_finished_for_undefined_ste jUnitReporter.handleTestCaseResult(result); ArgumentCaptor failureArgumentCaptor = ArgumentCaptor.forClass(Failure.class); - verify(runNotifier, times(2)).fireTestFailure(failureArgumentCaptor.capture()); + verify(runNotifier, times(1)).fireTestFailure(failureArgumentCaptor.capture()); verify(runNotifier).fireTestFinished(description); List failures = failureArgumentCaptor.getAllValues(); assertEquals(description, failures.get(0).getDescription()); assertEquals(exception1, failures.get(0).getException()); - assertEquals(description, failures.get(1).getDescription()); - assertEquals(exception2, failures.get(1).getException()); } @Test diff --git a/picocontainer/pom.xml b/picocontainer/pom.xml index c1834ff603..8609d8c50f 100644 --- a/picocontainer/pom.xml +++ b/picocontainer/pom.xml @@ -57,7 +57,7 @@ - + diff --git a/pom.xml b/pom.xml index d88bc123e3..0a7bc32ace 100644 --- a/pom.xml +++ b/pom.xml @@ -634,6 +634,35 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + -Duser.language=en + -Xmx1024m + -XX:MaxPermSize=256m + -Dfile.encoding=UTF-8 + false + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + + + org.junit.platform + junit-platform-engine + ${junit-platform.version} + + + org.junit.vintage + junit-vintage-engine + ${junit-jupiter.version} + + + + org.apache.maven.plugins maven-war-plugin From a03dd01507f8c9ded71df2bbb46d85cd9320b330 Mon Sep 17 00:00:00 2001 From: John Patrick Date: Sun, 4 Nov 2018 21:22:23 +0100 Subject: [PATCH 053/155] [Java] Use ServiceLoader for ObjectFactory Closes: https://github.com/cucumber/cucumber-jvm/pull/1463 Fixes: https://github.com/cucumber/cucumber-jvm/issues/1450 --- .../io.cucumber.java.api.ObjectFactory | 1 + .../java/io/cucumber/java/JavaBackend.java | 2 +- .../io/cucumber/java/ObjectFactoryLoader.java | 82 +++++++++++-------- .../io.cucumber.java.api.ObjectFactory | 1 + .../io.cucumber.java.api.ObjectFactory | 1 + .../io.cucumber.java.api.ObjectFactory | 1 + .../io.cucumber.java.api.ObjectFactory | 1 + .../io.cucumber.java.api.ObjectFactory | 1 + 8 files changed, 56 insertions(+), 34 deletions(-) create mode 100644 guice/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory create mode 100644 needle/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory create mode 100644 openejb/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory create mode 100644 picocontainer/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory create mode 100644 spring/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory create mode 100644 weld/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory diff --git a/guice/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory b/guice/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory new file mode 100644 index 0000000000..9ec8b3e205 --- /dev/null +++ b/guice/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory @@ -0,0 +1 @@ +io.cucumber.guice.GuiceFactory \ No newline at end of file diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 8bcda5b1b8..871898cde0 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -54,7 +54,7 @@ public JavaBackend(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { } private JavaBackend(ClassFinder classFinder, TypeRegistry typeRegistry) { - this(loadObjectFactory(classFinder, Env.INSTANCE.get(ObjectFactory.class.getName())), classFinder, typeRegistry); + this(loadObjectFactory(Env.INSTANCE.get(ObjectFactory.class.getName())), classFinder, typeRegistry); } public JavaBackend(ObjectFactory objectFactory, ClassFinder classFinder, TypeRegistry typeRegistry) { diff --git a/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java b/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java index 7939b3939a..5a33f32912 100644 --- a/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java +++ b/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java @@ -1,56 +1,72 @@ package io.cucumber.java; -import io.cucumber.java.api.ObjectFactory; -import io.cucumber.core.io.ClassFinder; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.reflection.NoInstancesException; -import io.cucumber.core.reflection.Reflections; -import io.cucumber.core.reflection.TooManyInstancesException; +import io.cucumber.java.api.ObjectFactory; -import static java.util.Arrays.asList; +import java.util.Iterator; +import java.util.ServiceLoader; class ObjectFactoryLoader { private ObjectFactoryLoader() { } /** - * Loads an instance of {@link ObjectFactory}. The class name can be explicit, or it can be null. - * When it's null, the implementation is searched for in the
      cucumber.runtime
      packahe. + * Loads an instance of {@link ObjectFactory} using the {@link ServiceLoader}. + * When objectFactoryClassName is provided that object factory + * will be used if present. + *

      + * If objectFactoryClassName is not provided and there exactly one + * instance present that instance will be used. + *

      + * Otherwise a default object factory with no Dependency Injection capabilities + * will be used. * - * @param classFinder where to load classes from - * @param objectFactoryClassName specific class name of {@link ObjectFactory} implementation. May be null. + * @param objectFactoryClassName optional object factory to use * @return an instance of {@link ObjectFactory} */ - static ObjectFactory loadObjectFactory(ClassFinder classFinder, String objectFactoryClassName) { - ObjectFactory objectFactory; - try { - Reflections reflections = new Reflections(classFinder); - - if(objectFactoryClassName != null) { - Class objectFactoryClass = (Class) classFinder.loadClass(objectFactoryClassName); - objectFactory = reflections.newInstance(new Class[0], new Object[0], objectFactoryClass); - } else { - objectFactory = reflections.instantiateExactlyOneSubclass(ObjectFactory.class, asList("io.cucumber"), new Class[0], new Object[0], null); + static ObjectFactory loadObjectFactory(String objectFactoryClassName) { + final ServiceLoader loader = ServiceLoader.load(ObjectFactory.class); + if (objectFactoryClassName == null) { + return loadSingleObjectFactoryOrDefault(loader); + + } + + return loadSelectedObjectFactory(loader, objectFactoryClassName); + } + + private static ObjectFactory loadSelectedObjectFactory(ServiceLoader loader, String objectFactoryClassName) { + for (ObjectFactory objectFactory : loader) { + if (objectFactoryClassName.equals(objectFactory.getClass().getName())) { + return objectFactory; } - } catch (TooManyInstancesException e) { - System.out.println(e.getMessage()); - System.out.println(getMultipleObjectFactoryLogMessage()); + } + + throw new CucumberException("Could not find object factory " + objectFactoryClassName); + } + + private static ObjectFactory loadSingleObjectFactoryOrDefault(ServiceLoader loader) { + final Iterator objectFactories = loader.iterator(); + + ObjectFactory objectFactory; + if (objectFactories.hasNext()) { + objectFactory = objectFactories.next(); + } else { objectFactory = new DefaultJavaObjectFactory(); - } catch (NoInstancesException e) { + } + + if (objectFactories.hasNext()) { + System.out.println(getMultipleObjectFactoryLogMessage()); objectFactory = new DefaultJavaObjectFactory(); - } catch (ClassNotFoundException e) { - throw new CucumberException("Couldn't instantiate custom ObjectFactory", e); } return objectFactory; } private static String getMultipleObjectFactoryLogMessage() { - StringBuilder sb = new StringBuilder(); - sb.append("More than one Cucumber ObjectFactory was found in the classpath\n\n"); - sb.append("You probably may have included, for instance, cucumber-spring AND cucumber-guice as part of\n"); - sb.append("your dependencies. When this happens, Cucumber falls back to instantiating the\n"); - sb.append("DefaultJavaObjectFactory implementation which doesn't provide IoC.\n"); - sb.append("In order to enjoy IoC features, please remove the unnecessary dependencies from your classpath.\n"); - return sb.toString(); + return "More than one Cucumber ObjectFactory was found in the classpath\n" + + "\n" + + "You probably may have included, for instance, cucumber-spring AND cucumber-guice as part of\n" + + "your dependencies. When this happens, Cucumber falls back to instantiating the\n" + + "DefaultJavaObjectFactory implementation which doesn't provide IoC.\n" + + "In order to enjoy IoC features, please remove the unnecessary dependencies from your classpath.\n"; } } diff --git a/needle/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory b/needle/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory new file mode 100644 index 0000000000..5aefc07af8 --- /dev/null +++ b/needle/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory @@ -0,0 +1 @@ +io.cucumber.needle.NeedleFactory \ No newline at end of file diff --git a/openejb/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory b/openejb/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory new file mode 100644 index 0000000000..093b29637b --- /dev/null +++ b/openejb/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory @@ -0,0 +1 @@ +io.cucumber.openejb.OpenEJBObjectFactory \ No newline at end of file diff --git a/picocontainer/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory b/picocontainer/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory new file mode 100644 index 0000000000..9a764ac422 --- /dev/null +++ b/picocontainer/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory @@ -0,0 +1 @@ +io.cucumber.picocontainer.PicoFactory \ No newline at end of file diff --git a/spring/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory b/spring/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory new file mode 100644 index 0000000000..8dd041f509 --- /dev/null +++ b/spring/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory @@ -0,0 +1 @@ +io.cucumber.spring.SpringFactory \ No newline at end of file diff --git a/weld/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory b/weld/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory new file mode 100644 index 0000000000..965281dd4b --- /dev/null +++ b/weld/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory @@ -0,0 +1 @@ +io.cucumber.weld.WeldFactory \ No newline at end of file From acf347ec2cd08afd64fb0856454e3c5ecc5b5ab6 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sun, 4 Nov 2018 23:16:13 +0100 Subject: [PATCH 054/155] [Core] User ServiceLoader to load backend implementations --- .../core/backend/BackendProviderService.java | 10 ++ ...upplier.java => BackendServiceLoader.java} | 40 +++++--- .../io/cucumber/core/runtime/Runtime.java | 2 +- .../io/cucumber/core/backend/StubBackend.java | 38 ------- .../backend/StubBackendProviderService.java | 40 ++++++++ ...est.java => BackendServiceLoaderTest.java} | 15 ++- .../runtime/SingletonRunnerSupplierTest.java | 5 +- .../ThreadLocalRunnerSupplierTest.java | 2 +- ...cumber.core.backend.BackendProviderService | 1 + .../java/io/cucumber/java/JavaBackend.java | 9 +- .../java/JavaBackendProviderService.java | 14 +++ ...cumber.core.backend.BackendProviderService | 1 + .../java/io/cucumber/junit/api/Cucumber.java | 4 +- .../junit/api/StubBackendProviderService.java | 48 +++++++++ .../cucumber/junit/api/stub/StubBackend.java | 90 ----------------- ...cumber.core.backend.BackendProviderService | 1 + .../testng/api/TestNGCucumberRunner.java | 4 +- .../io/cucumber/testng/api/StubBackend.java | 39 -------- .../api/StubBackendProviderService.java | 98 +++++++++++++++++++ ...cumber.core.backend.BackendProviderService | 1 + 20 files changed, 254 insertions(+), 208 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/backend/BackendProviderService.java rename core/src/main/java/io/cucumber/core/runtime/{BackendModuleBackendSupplier.java => BackendServiceLoader.java} (62%) delete mode 100644 core/src/test/java/io/cucumber/core/backend/StubBackend.java create mode 100644 core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java rename core/src/test/java/io/cucumber/core/runtime/{BackendModuleBackendSupplierTest.java => BackendServiceLoaderTest.java} (75%) create mode 100644 core/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService create mode 100644 java/src/main/java/io/cucumber/java/JavaBackendProviderService.java create mode 100644 java/src/main/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService create mode 100644 junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java delete mode 100644 junit/src/test/java/io/cucumber/junit/api/stub/StubBackend.java create mode 100644 junit/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService delete mode 100644 testng/src/test/java/io/cucumber/testng/api/StubBackend.java create mode 100644 testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java create mode 100644 testng/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService diff --git a/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java b/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java new file mode 100644 index 0000000000..3628d1da15 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java @@ -0,0 +1,10 @@ +package io.cucumber.core.backend; + +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.stepexpression.TypeRegistry; + +public interface BackendProviderService { + + Backend create(ResourceLoader resourceLoader, TypeRegistry typeRegistry); + +} diff --git a/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java b/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java similarity index 62% rename from core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java rename to core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java index ac7968e940..f6866ccb3b 100644 --- a/core/src/main/java/io/cucumber/core/runtime/BackendModuleBackendSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java @@ -2,6 +2,7 @@ import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendProviderService; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.exception.CucumberException; @@ -11,50 +12,57 @@ import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.TypeRegistry; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Locale; - -import static java.util.Collections.singletonList; - +import java.util.ServiceLoader; /** - * Supplies instances of {@link Backend} found by scanning {@code cucumber.runtime} for implementations. + * Supplies instances of {@link Backend} created by using a {@link ServiceLoader} + * to locate instance of {@link BackendSupplier}. */ -public final class BackendModuleBackendSupplier implements BackendSupplier { +public final class BackendServiceLoader implements BackendSupplier { private final ResourceLoader resourceLoader; private final ClassFinder classFinder; private final RuntimeOptions runtimeOptions; - private final List packages; - - public BackendModuleBackendSupplier(ResourceLoader resourceLoader, ClassFinder classFinder, RuntimeOptions runtimeOptions) { - this(resourceLoader, classFinder, runtimeOptions, singletonList("io.cucumber")); - } - BackendModuleBackendSupplier(ResourceLoader resourceLoader, ClassFinder classFinder, RuntimeOptions runtimeOptions, List packages) { + public BackendServiceLoader(ResourceLoader resourceLoader, ClassFinder classFinder, RuntimeOptions runtimeOptions) { this.resourceLoader = resourceLoader; this.classFinder = classFinder; this.runtimeOptions = runtimeOptions; - this.packages = packages; } @Override public Collection get() { - Collection backends = loadBackends(); + return get(ServiceLoader.load(BackendProviderService.class)); + } + + Collection get(Iterable serviceLoader) { + Collection backends = loadBackends(serviceLoader); if (backends.isEmpty()) { throw new CucumberException("No backends were found. Please make sure you have a backend module on your CLASSPATH."); } return backends; } - private Collection loadBackends() { + private Collection loadBackends(Iterable serviceLoader) { + final TypeRegistry typeRegistry = createTypeRegistry(); + + List backends = new ArrayList<>(); + for (BackendProviderService backendProviderService : serviceLoader) { + backends.add(backendProviderService.create(resourceLoader, typeRegistry)); + } + return backends; + } + + private TypeRegistry createTypeRegistry() { Reflections reflections = new Reflections(classFinder); TypeRegistryConfigurer typeRegistryConfigurer = reflections.instantiateExactlyOneSubclass(TypeRegistryConfigurer.class, MultiLoader.packageName(runtimeOptions.getGlue()), new Class[0], new Object[0], new DefaultTypeRegistryConfiguration()); TypeRegistry typeRegistry = new TypeRegistry(typeRegistryConfigurer.locale()); typeRegistryConfigurer.configureTypeRegistry(typeRegistry); - - return reflections.instantiateSubclasses(Backend.class, packages, new Class[]{ResourceLoader.class, TypeRegistry.class}, new Object[]{resourceLoader, typeRegistry}); + return typeRegistry; } private static final class DefaultTypeRegistryConfiguration implements TypeRegistryConfigurer { diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 0bc6cf1113..9e81666a64 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -190,7 +190,7 @@ public Runtime build() { final BackendSupplier backendSupplier = this.backendSupplier != null ? this.backendSupplier - : new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); + : new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); final Plugins plugins = new Plugins(new PluginFactory(), this.eventBus, runtimeOptions); for (final Plugin plugin : additionalPlugins) { diff --git a/core/src/test/java/io/cucumber/core/backend/StubBackend.java b/core/src/test/java/io/cucumber/core/backend/StubBackend.java deleted file mode 100644 index e9f4fa88ab..0000000000 --- a/core/src/test/java/io/cucumber/core/backend/StubBackend.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.cucumber.core.backend; - -import io.cucumber.core.api.options.SnippetType; -import io.cucumber.core.io.ResourceLoader; -import gherkin.pickles.PickleStep; -import io.cucumber.core.stepexpression.TypeRegistry; - -import java.util.List; - -import static java.util.Collections.emptyList; - -public class StubBackend implements Backend { - - @SuppressWarnings("unused") // reflection to create backend - public StubBackend(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { - - } - - @Override - public void loadGlue(Glue glue, List gluePaths) { - - } - - @Override - public void buildWorld() { - - } - - @Override - public void disposeWorld() { - - } - - @Override - public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { - return emptyList(); - } -} diff --git a/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java b/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java new file mode 100644 index 0000000000..11f24340bc --- /dev/null +++ b/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java @@ -0,0 +1,40 @@ +package io.cucumber.core.backend; + +import gherkin.pickles.PickleStep; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.stepexpression.TypeRegistry; + +import java.util.List; + +import static java.util.Collections.emptyList; + +public class StubBackendProviderService implements BackendProviderService { + @Override + public Backend create(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + return new StubBackend(); + } + + static class StubBackend implements Backend { + + @Override + public void loadGlue(Glue glue, List gluePaths) { + + } + + @Override + public void buildWorld() { + + } + + @Override + public void disposeWorld() { + + } + + @Override + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { + return emptyList(); + } + } +} diff --git a/core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java similarity index 75% rename from core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java rename to core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java index f5778015d3..3c665f410b 100644 --- a/core/src/test/java/io/cucumber/core/runtime/BackendModuleBackendSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java @@ -14,13 +14,12 @@ import java.util.Collections; -import static java.util.Collections.singletonList; +import static java.util.Collections.emptyList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; -public class BackendModuleBackendSupplierTest { - +public class BackendServiceLoaderTest { @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -28,23 +27,23 @@ public class BackendModuleBackendSupplierTest { @Test public void should_create_a_backend() { ClassLoader classLoader = getClass().getClassLoader(); - RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions, singletonList("io.cucumber.core.backend")); + BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); assertThat(backendSupplier.get().iterator().next(), is(notNullValue())); } @Test public void should_throw_an_exception_when_no_backend_could_be_found() { ClassLoader classLoader = getClass().getClassLoader(); - RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); + RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions, singletonList("no.backend.here")); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); expectedException.expect(CucumberException.class); - assertThat(backendSupplier.get().iterator().next(), is(notNullValue())); + backendSupplier.get(emptyList()).iterator().next(); } } diff --git a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java index b08e86dd28..eda2ef6018 100644 --- a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java @@ -2,7 +2,6 @@ import io.cucumber.core.event.EventBus; -import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.io.ClassFinder; @@ -13,8 +12,6 @@ import org.junit.Before; import org.junit.Test; -import java.util.Collections; - import static io.cucumber.core.options.Env.INSTANCE; import static java.util.Collections.emptyList; import static org.hamcrest.CoreMatchers.is; @@ -33,7 +30,7 @@ public void before() { ResourceLoader resourceLoader = new MultiLoader(classLoader); RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, INSTANCE, emptyList()); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendModuleBackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); EventBus eventBus = new TimeServiceEventBus(TimeService.SYSTEM); runnerSupplier = new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier); } diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 771764983e..1b6454cb1f 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -37,7 +37,7 @@ public void before() { RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendModuleBackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); eventBus = new TimeServiceEventBus(TimeService.SYSTEM); runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier); } diff --git a/core/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService b/core/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService new file mode 100644 index 0000000000..2676ff3305 --- /dev/null +++ b/core/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService @@ -0,0 +1 @@ +io.cucumber.core.backend.StubBackendProviderService \ No newline at end of file diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 871898cde0..98381d28cd 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -44,12 +44,7 @@ public class JavaBackend implements Backend, LambdaGlueRegistry { private Glue glue; private List> lambdaGlueClasses = new ArrayList<>(); - /** - * The constructor called by reflection by default. - * - * @param resourceLoader - */ - public JavaBackend(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + JavaBackend(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { this(new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader()), typeRegistry); } @@ -57,7 +52,7 @@ private JavaBackend(ClassFinder classFinder, TypeRegistry typeRegistry) { this(loadObjectFactory(Env.INSTANCE.get(ObjectFactory.class.getName())), classFinder, typeRegistry); } - public JavaBackend(ObjectFactory objectFactory, ClassFinder classFinder, TypeRegistry typeRegistry) { + JavaBackend(ObjectFactory objectFactory, ClassFinder classFinder, TypeRegistry typeRegistry) { this.classFinder = classFinder; this.objectFactory = objectFactory; this.methodScanner = new MethodScanner(classFinder); diff --git a/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java b/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java new file mode 100644 index 0000000000..293b57cb52 --- /dev/null +++ b/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java @@ -0,0 +1,14 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendProviderService; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.stepexpression.TypeRegistry; + +public class JavaBackendProviderService implements BackendProviderService { + + @Override + public Backend create(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + return new JavaBackend(resourceLoader, typeRegistry); + } +} diff --git a/java/src/main/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService b/java/src/main/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService new file mode 100644 index 0000000000..6bb2a061c2 --- /dev/null +++ b/java/src/main/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService @@ -0,0 +1 @@ +io.cucumber.java.JavaBackendProviderService \ No newline at end of file diff --git a/junit/src/main/java/io/cucumber/junit/api/Cucumber.java b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java index 292b3e3c0d..64c3d501a4 100644 --- a/junit/src/main/java/io/cucumber/junit/api/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java @@ -6,7 +6,7 @@ import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeService; -import io.cucumber.core.runtime.BackendModuleBackendSupplier; +import io.cucumber.core.runtime.BackendServiceLoader; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.io.ClassFinder; @@ -86,7 +86,7 @@ public Cucumber(Class clazz) throws InitializationError { FeaturePathFeatureSupplier featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions, bus); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); + BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); Plugins plugins = new Plugins(new PluginFactory(), bus, runtimeOptions); this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); this.filters = new Filters(runtimeOptions); diff --git a/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java b/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java new file mode 100644 index 0000000000..0c63c3d780 --- /dev/null +++ b/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java @@ -0,0 +1,48 @@ +package io.cucumber.junit.api; + + +import gherkin.pickles.PickleStep; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendProviderService; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.stepexpression.TypeRegistry; + +import java.util.List; + +import static java.util.Collections.singletonList; + +public class StubBackendProviderService implements BackendProviderService { + @Override + public Backend create(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + return new StubBackend(); + } + + /** + * We need an implementation of Backend to prevent Runtime from blowing up. + */ + public static class StubBackend implements Backend { + StubBackend() { + + } + + @Override + public void loadGlue(Glue glue, List gluePaths) { + } + + @Override + public void buildWorld() { + } + + @Override + public void disposeWorld() { + } + + @Override + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { + return singletonList("STUB SNIPPET"); + } + } + +} diff --git a/junit/src/test/java/io/cucumber/junit/api/stub/StubBackend.java b/junit/src/test/java/io/cucumber/junit/api/stub/StubBackend.java deleted file mode 100644 index 2043a8ea5f..0000000000 --- a/junit/src/test/java/io/cucumber/junit/api/stub/StubBackend.java +++ /dev/null @@ -1,90 +0,0 @@ -package io.cucumber.junit.api.stub; - -import io.cucumber.core.api.options.SnippetType; -import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.stepexpression.Argument; -import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.core.backend.Backend; -import io.cucumber.core.backend.Glue; -import io.cucumber.core.io.ResourceLoader; -import gherkin.pickles.PickleStep; - -import java.util.Collections; -import java.util.List; - -import static java.util.Collections.singletonList; - -/** - * We need an implementation of Backend to prevent Runtime from blowing up. - */ -@SuppressWarnings("unused") -public class StubBackend implements Backend { - public StubBackend(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { - - } - - @Override - public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(createStepDefinition("background step")); - glue.addStepDefinition(createStepDefinition("scenario name")); - glue.addStepDefinition(createStepDefinition("scenario C")); - glue.addStepDefinition(createStepDefinition("scenario D")); - glue.addStepDefinition(createStepDefinition("scenario E")); - glue.addStepDefinition(createStepDefinition("first step")); - glue.addStepDefinition(createStepDefinition("second step")); - glue.addStepDefinition(createStepDefinition("third step")); - - } - - public StepDefinition createStepDefinition(final String pattern) { - return new StepDefinition() { - @Override - public List matchedArguments(PickleStep step) { - return pattern.equals(step.getText()) ? Collections.emptyList() : null; - } - - @Override - public String getLocation(boolean detail) { - return null; - } - - @Override - public Integer getParameterCount() { - return 0; - } - - @Override - public void execute(Object[] args) { - - } - - @Override - public boolean isDefinedAt(StackTraceElement stackTraceElement) { - return false; - } - - @Override - public String getPattern() { - return pattern; - } - - @Override - public boolean isScenarioScoped() { - return false; - } - }; - } - - @Override - public void buildWorld() { - } - - @Override - public void disposeWorld() { - } - - @Override - public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { - return singletonList("STUB SNIPPET"); - } -} diff --git a/junit/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService b/junit/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService new file mode 100644 index 0000000000..fb092f3236 --- /dev/null +++ b/junit/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService @@ -0,0 +1 @@ +io.cucumber.junit.api.StubBackendProviderService \ No newline at end of file diff --git a/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java index 2413b0cb49..969d2f69fb 100644 --- a/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java @@ -6,7 +6,7 @@ import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.TimeService; -import io.cucumber.core.runtime.BackendModuleBackendSupplier; +import io.cucumber.core.runtime.BackendServiceLoader; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.model.FeatureCompiler; @@ -50,7 +50,7 @@ public TestNGCucumberRunner(Class clazz) { runtimeOptions = runtimeOptionsFactory.create(); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendModuleBackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); bus = new TimeServiceEventBus(TimeService.SYSTEM); new Plugins(new PluginFactory(), bus, runtimeOptions); FeatureLoader featureLoader = new FeatureLoader(resourceLoader); diff --git a/testng/src/test/java/io/cucumber/testng/api/StubBackend.java b/testng/src/test/java/io/cucumber/testng/api/StubBackend.java deleted file mode 100644 index a8b1a7b424..0000000000 --- a/testng/src/test/java/io/cucumber/testng/api/StubBackend.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.cucumber.testng.api; - -import io.cucumber.core.api.options.SnippetType; -import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.core.backend.Backend; -import io.cucumber.core.backend.Glue; -import io.cucumber.core.io.ResourceLoader; -import gherkin.pickles.PickleStep; - -import java.util.List; - -import static java.util.Collections.singletonList; - -/** - * We need an implementation of Backend to prevent Runtime from blowing up. - */ -@SuppressWarnings("unused") -public class StubBackend implements Backend { - public StubBackend(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { - - } - - @Override - public void loadGlue(Glue glue, List gluePaths) { - } - - @Override - public void buildWorld() { - } - - @Override - public void disposeWorld() { - } - - @Override - public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { - return singletonList("STUB SNIPPET"); - } -} diff --git a/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java b/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java new file mode 100644 index 0000000000..7b6131cabb --- /dev/null +++ b/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java @@ -0,0 +1,98 @@ +package io.cucumber.testng.api; + + +import gherkin.pickles.PickleStep; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendProviderService; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.TypeRegistry; + +import java.util.Collections; +import java.util.List; + +import static java.util.Collections.singletonList; + +public class StubBackendProviderService implements BackendProviderService { + @Override + public Backend create(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + return new StubBackend(); + } + + /** + * We need an implementation of Backend to prevent Runtime from blowing up. + */ + private static class StubBackend implements Backend { + StubBackend() { + + } + + @Override + public void loadGlue(Glue glue, List gluePaths) { + glue.addStepDefinition(createStepDefinition("background step")); + glue.addStepDefinition(createStepDefinition("scenario name")); + glue.addStepDefinition(createStepDefinition("scenario C")); + glue.addStepDefinition(createStepDefinition("scenario D")); + glue.addStepDefinition(createStepDefinition("scenario E")); + glue.addStepDefinition(createStepDefinition("first step")); + glue.addStepDefinition(createStepDefinition("second step")); + glue.addStepDefinition(createStepDefinition("third step")); + + } + + private StepDefinition createStepDefinition(final String pattern) { + return new StepDefinition() { + @Override + public List matchedArguments(PickleStep step) { + return pattern.equals(step.getText()) ? Collections.emptyList() : null; + } + + @Override + public String getLocation(boolean detail) { + return null; + } + + @Override + public Integer getParameterCount() { + return 0; + } + + @Override + public void execute(Object[] args) { + + } + + @Override + public boolean isDefinedAt(StackTraceElement stackTraceElement) { + return false; + } + + @Override + public String getPattern() { + return pattern; + } + + @Override + public boolean isScenarioScoped() { + return false; + } + }; + } + + @Override + public void buildWorld() { + } + + @Override + public void disposeWorld() { + } + + @Override + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { + return singletonList("STUB SNIPPET"); + } + } +} diff --git a/testng/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService b/testng/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService new file mode 100644 index 0000000000..23a2329136 --- /dev/null +++ b/testng/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService @@ -0,0 +1 @@ +io.cucumber.testng.api.StubBackendProviderService \ No newline at end of file From 8010cfe73ae8b3125d7cfcee7aa998a1070d0022 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Fri, 9 Nov 2018 23:57:25 +0100 Subject: [PATCH 055/155] [Core] Provide object factory to backend module By moving the `ObjectFactory` to the `core` module is a first step towards several goals. 1. It is now possible to provide every backend with an object factory. This sets the stage dependency injection in Scala, Groovy and possibly Kotlin. 2. It is a prerequisite to separating the annotation and lambda based step definitions. Which itself is required to avoid any problems with Java 9's module system. 3. Finally it is a first step towards creating a proper test context to which the backend contribute glue rather manage it entirely. This clears the way for potential JUnit 5 like extensions. --- .../core/backend/BackendProviderService.java | 2 +- .../cucumber/core/backend}/ObjectFactory.java | 2 +- .../core/backend}/ObjectFactoryLoader.java | 47 ++++++++++++++++-- .../core/runtime/BackendServiceLoader.java | 14 ++++-- .../core/backend}/JavaObjectFactoryTest.java | 4 +- .../backend/StubBackendProviderService.java | 2 +- .../java/io/cucumber/guice/GuiceFactory.java | 4 +- ...=> io.cucumber.core.backend.ObjectFactory} | 0 .../io/cucumber/guice/GuiceFactoryTest.java | 2 +- .../java/DefaultJavaObjectFactory.java | 49 ------------------- .../java/io/cucumber/java/JavaBackend.java | 12 ++--- .../java/JavaBackendProviderService.java | 5 +- .../io/cucumber/java/JavaHookDefinition.java | 4 +- .../io/cucumber/java/JavaStepDefinition.java | 3 +- .../io/cucumber/java/JavaBackendTest.java | 18 +++---- .../java/io/cucumber/java/JavaHookTest.java | 4 +- .../cucumber/java/JavaStepDefinitionTest.java | 7 +-- .../java/JavaStepDefinitionTransposeTest.java | 2 +- .../io/cucumber/java/MethodScannerTest.java | 14 ++++-- .../io/cucumber/java/SingletonFactory.java | 2 +- .../junit/api/StubBackendProviderService.java | 4 +- .../io/cucumber/needle/NeedleFactory.java | 2 +- ...=> io.cucumber.core.backend.ObjectFactory} | 0 .../openejb/OpenEJBObjectFactory.java | 2 +- ...=> io.cucumber.core.backend.ObjectFactory} | 0 .../openejb/OpenEJBObjectFactoryTest.java | 2 +- .../cucumber/picocontainer/PicoFactory.java | 2 +- ...=> io.cucumber.core.backend.ObjectFactory} | 0 .../picocontainer/PicoFactoryTest.java | 2 +- .../io/cucumber/spring/SpringFactory.java | 2 +- ...=> io.cucumber.core.backend.ObjectFactory} | 0 .../io/cucumber/spring/SpringFactoryTest.java | 2 +- .../api/StubBackendProviderService.java | 4 +- .../java/io/cucumber/weld/WeldFactory.java | 2 +- ...=> io.cucumber.core.backend.ObjectFactory} | 0 .../io/cucumber/weld/WeldFactoryTest.java | 2 +- 36 files changed, 107 insertions(+), 116 deletions(-) rename {java/src/main/java/io/cucumber/java/api => core/src/main/java/io/cucumber/core/backend}/ObjectFactory.java (96%) rename {java/src/main/java/io/cucumber/java => core/src/main/java/io/cucumber/core/backend}/ObjectFactoryLoader.java (64%) rename {java/src/test/java/io/cucumber/java => core/src/test/java/io/cucumber/core/backend}/JavaObjectFactoryTest.java (86%) rename guice/src/main/resources/META-INF/services/{io.cucumber.java.api.ObjectFactory => io.cucumber.core.backend.ObjectFactory} (100%) delete mode 100644 java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java rename needle/src/main/resources/META-INF/services/{io.cucumber.java.api.ObjectFactory => io.cucumber.core.backend.ObjectFactory} (100%) rename openejb/src/main/resources/META-INF/services/{io.cucumber.java.api.ObjectFactory => io.cucumber.core.backend.ObjectFactory} (100%) rename picocontainer/src/main/resources/META-INF/services/{io.cucumber.java.api.ObjectFactory => io.cucumber.core.backend.ObjectFactory} (100%) rename spring/src/main/resources/META-INF/services/{io.cucumber.java.api.ObjectFactory => io.cucumber.core.backend.ObjectFactory} (100%) rename weld/src/main/resources/META-INF/services/{io.cucumber.java.api.ObjectFactory => io.cucumber.core.backend.ObjectFactory} (100%) diff --git a/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java b/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java index 3628d1da15..886a9d7527 100644 --- a/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java +++ b/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java @@ -5,6 +5,6 @@ public interface BackendProviderService { - Backend create(ResourceLoader resourceLoader, TypeRegistry typeRegistry); + Backend create(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry); } diff --git a/java/src/main/java/io/cucumber/java/api/ObjectFactory.java b/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java similarity index 96% rename from java/src/main/java/io/cucumber/java/api/ObjectFactory.java rename to core/src/main/java/io/cucumber/core/backend/ObjectFactory.java index 5ebaf5eb12..43cd6c45d4 100644 --- a/java/src/main/java/io/cucumber/java/api/ObjectFactory.java +++ b/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java @@ -1,4 +1,4 @@ -package io.cucumber.java.api; +package io.cucumber.core.backend; /** * Minimal facade for Dependency Injection containers diff --git a/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java b/core/src/main/java/io/cucumber/core/backend/ObjectFactoryLoader.java similarity index 64% rename from java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java rename to core/src/main/java/io/cucumber/core/backend/ObjectFactoryLoader.java index 5a33f32912..760cd8e276 100644 --- a/java/src/main/java/io/cucumber/java/ObjectFactoryLoader.java +++ b/core/src/main/java/io/cucumber/core/backend/ObjectFactoryLoader.java @@ -1,12 +1,14 @@ -package io.cucumber.java; +package io.cucumber.core.backend; import io.cucumber.core.exception.CucumberException; -import io.cucumber.java.api.ObjectFactory; +import java.lang.reflect.Constructor; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import java.util.ServiceLoader; -class ObjectFactoryLoader { +public class ObjectFactoryLoader { private ObjectFactoryLoader() { } @@ -24,7 +26,7 @@ private ObjectFactoryLoader() { * @param objectFactoryClassName optional object factory to use * @return an instance of {@link ObjectFactory} */ - static ObjectFactory loadObjectFactory(String objectFactoryClassName) { + public static ObjectFactory loadObjectFactory(String objectFactoryClassName) { final ServiceLoader loader = ServiceLoader.load(ObjectFactory.class); if (objectFactoryClassName == null) { return loadSingleObjectFactoryOrDefault(loader); @@ -69,4 +71,41 @@ private static String getMultipleObjectFactoryLogMessage() { "DefaultJavaObjectFactory implementation which doesn't provide IoC.\n" + "In order to enjoy IoC features, please remove the unnecessary dependencies from your classpath.\n"; } + + static class DefaultJavaObjectFactory implements ObjectFactory { + private final Map, Object> instances = new HashMap<>(); + + public void start() { + // No-op + } + + public void stop() { + instances.clear(); + } + + public boolean addClass(Class clazz) { + return true; + } + + public T getInstance(Class type) { + T instance = type.cast(instances.get(type)); + if (instance == null) { + instance = cacheNewInstance(type); + } + return instance; + } + + private T cacheNewInstance(Class type) { + try { + Constructor constructor = type.getConstructor(); + T instance = constructor.newInstance(); + instances.put(type, instance); + return instance; + } catch (NoSuchMethodException e) { + throw new CucumberException(String.format("%s doesn't have an empty constructor. If you need DI, put cucumber-picocontainer on the classpath", type), e); + } catch (Exception e) { + throw new CucumberException(String.format("Failed to instantiate %s", type), e); + } + } + } } diff --git a/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java b/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java index f6866ccb3b..b9c8a61174 100644 --- a/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java +++ b/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java @@ -4,12 +4,14 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; import io.cucumber.core.backend.BackendSupplier; -import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.reflection.Reflections; -import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.options.Env; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.reflection.Reflections; import io.cucumber.core.stepexpression.TypeRegistry; import java.util.ArrayList; @@ -18,6 +20,8 @@ import java.util.Locale; import java.util.ServiceLoader; +import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; + /** * Supplies instances of {@link Backend} created by using a {@link ServiceLoader} * to locate instance of {@link BackendSupplier}. @@ -49,10 +53,10 @@ Collection get(Iterable serviceLoader private Collection loadBackends(Iterable serviceLoader) { final TypeRegistry typeRegistry = createTypeRegistry(); - List backends = new ArrayList<>(); for (BackendProviderService backendProviderService : serviceLoader) { - backends.add(backendProviderService.create(resourceLoader, typeRegistry)); + ObjectFactory objectFactory = loadObjectFactory(Env.INSTANCE.get(ObjectFactory.class.getName())); + backends.add(backendProviderService.create(objectFactory, resourceLoader, typeRegistry)); } return backends; } diff --git a/java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java b/core/src/test/java/io/cucumber/core/backend/JavaObjectFactoryTest.java similarity index 86% rename from java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java rename to core/src/test/java/io/cucumber/core/backend/JavaObjectFactoryTest.java index 11aa0b62e6..1611cadff7 100644 --- a/java/src/test/java/io/cucumber/java/JavaObjectFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/backend/JavaObjectFactoryTest.java @@ -1,6 +1,6 @@ -package io.cucumber.java; +package io.cucumber.core.backend; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactoryLoader.DefaultJavaObjectFactory; import org.junit.Test; import static org.junit.Assert.assertNotNull; diff --git a/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java b/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java index 11f24340bc..d04017e5b6 100644 --- a/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java +++ b/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java @@ -11,7 +11,7 @@ public class StubBackendProviderService implements BackendProviderService { @Override - public Backend create(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + public Backend create(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { return new StubBackend(); } diff --git a/guice/src/main/java/io/cucumber/guice/GuiceFactory.java b/guice/src/main/java/io/cucumber/guice/GuiceFactory.java index c3a96d326c..2f714c105a 100644 --- a/guice/src/main/java/io/cucumber/guice/GuiceFactory.java +++ b/guice/src/main/java/io/cucumber/guice/GuiceFactory.java @@ -1,12 +1,12 @@ package io.cucumber.guice; import com.google.inject.Injector; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.options.Env; import io.cucumber.guice.api.ScenarioScope; /** - * Guice implementation of the io.cucumber.java.api.ObjectFactory. + * Guice implementation of the io.cucumber.core.backend.ObjectFactory. */ public class GuiceFactory implements ObjectFactory { diff --git a/guice/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory b/guice/src/main/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory similarity index 100% rename from guice/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory rename to guice/src/main/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory diff --git a/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java index fb6623c059..92786ef179 100644 --- a/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java +++ b/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java @@ -10,7 +10,7 @@ import io.cucumber.guice.api.ScenarioScoped; import io.cucumber.guice.matcher.ElementsAreAllEqualMatcher; import io.cucumber.guice.matcher.ElementsAreAllUniqueMatcher; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import org.junit.After; import org.junit.Rule; import org.junit.Test; diff --git a/java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java b/java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java deleted file mode 100644 index 927d723bf6..0000000000 --- a/java/src/main/java/io/cucumber/java/DefaultJavaObjectFactory.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.cucumber.java; - -import io.cucumber.java.api.ObjectFactory; -import io.cucumber.core.exception.CucumberException; - -import java.lang.reflect.Constructor; -import java.util.HashMap; -import java.util.Map; - -/** - * This class has package scope so it doesn't loadGlue loaded by reflection, - * thereby colliding with other DI implementations. - */ -class DefaultJavaObjectFactory implements ObjectFactory { - private final Map, Object> instances = new HashMap, Object>(); - - public void start() { - // No-op - } - - public void stop() { - instances.clear(); - } - - public boolean addClass(Class clazz) { - return true; - } - - public T getInstance(Class type) { - T instance = type.cast(instances.get(type)); - if (instance == null) { - instance = cacheNewInstance(type); - } - return instance; - } - - private T cacheNewInstance(Class type) { - try { - Constructor constructor = type.getConstructor(); - T instance = constructor.newInstance(); - instances.put(type, instance); - return instance; - } catch (NoSuchMethodException e) { - throw new CucumberException(String.format("%s doesn't have an empty constructor. If you need DI, put cucumber-picocontainer on the classpath", type), e); - } catch (Exception e) { - throw new CucumberException(String.format("Failed to instantiate %s", type), e); - } - } -} diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 98381d28cd..3abbe3cdf5 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -5,12 +5,12 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.options.Env; import io.cucumber.core.runtime.Invoker; import io.cucumber.core.snippets.SnippetGenerator; import io.cucumber.core.stepexpression.TypeRegistry; @@ -18,7 +18,6 @@ import io.cucumber.java.api.AfterStep; import io.cucumber.java.api.Before; import io.cucumber.java.api.BeforeStep; -import io.cucumber.java.api.ObjectFactory; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -28,7 +27,6 @@ import java.util.function.Function; import static io.cucumber.core.io.MultiLoader.packageName; -import static io.cucumber.java.ObjectFactoryLoader.loadObjectFactory; import static java.lang.Thread.currentThread; public class JavaBackend implements Backend, LambdaGlueRegistry { @@ -44,12 +42,8 @@ public class JavaBackend implements Backend, LambdaGlueRegistry { private Glue glue; private List> lambdaGlueClasses = new ArrayList<>(); - JavaBackend(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { - this(new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader()), typeRegistry); - } - - private JavaBackend(ClassFinder classFinder, TypeRegistry typeRegistry) { - this(loadObjectFactory(Env.INSTANCE.get(ObjectFactory.class.getName())), classFinder, typeRegistry); + JavaBackend(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + this(objectFactory, new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader()), typeRegistry); } JavaBackend(ObjectFactory objectFactory, ClassFinder classFinder, TypeRegistry typeRegistry) { diff --git a/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java b/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java index 293b57cb52..f0c87b9a12 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java +++ b/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java @@ -2,13 +2,14 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.TypeRegistry; public class JavaBackendProviderService implements BackendProviderService { @Override - public Backend create(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { - return new JavaBackend(resourceLoader, typeRegistry); + public Backend create(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + return new JavaBackend(objectFactory, resourceLoader, typeRegistry); } } diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index f371bd1911..c86c258606 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -1,7 +1,7 @@ package io.cucumber.java; import io.cucumber.core.api.Scenario; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.reflection.MethodFormat; @@ -12,8 +12,6 @@ import java.lang.reflect.Method; import java.util.Collection; -import static java.util.Arrays.asList; - class JavaHookDefinition implements HookDefinition { private final Method method; diff --git a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java index 0c0c03d8c8..fa4e6c7190 100644 --- a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java @@ -2,7 +2,7 @@ import io.cucumber.core.runtime.Invoker; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.ArgumentMatcher; import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; @@ -17,7 +17,6 @@ import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.ArrayList; -import java.lang.reflect.Type; import java.util.List; class JavaStepDefinition implements StepDefinition { diff --git a/java/src/test/java/io/cucumber/java/JavaBackendTest.java b/java/src/test/java/io/cucumber/java/JavaBackendTest.java index 1cd0fc3d81..1f15279b92 100644 --- a/java/src/test/java/io/cucumber/java/JavaBackendTest.java +++ b/java/src/test/java/io/cucumber/java/JavaBackendTest.java @@ -5,9 +5,8 @@ import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.io.ResourceLoaderClassFinder; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.java.stepdefs.Stepdefs; import org.junit.Before; import org.junit.Rule; @@ -28,7 +27,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsEqual.equalTo; -import static org.junit.Assert.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -42,33 +40,33 @@ public class JavaBackendTest { public ArgumentCaptor stepDefinition; @Mock - public Glue glue; + private Glue glue; + @Mock private ObjectFactory factory; + private JavaBackend backend; @Before public void createBackend() { ClassLoader classLoader = currentThread().getContextClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); - ResourceLoaderClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - this.factory = new DefaultJavaObjectFactory(); TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); - this.backend = new JavaBackend(factory, classFinder, typeRegistry); + this.backend = new JavaBackend(factory, resourceLoader, typeRegistry); } @Test public void finds_step_definitions_by_classpath_url() { - backend.loadGlue(glue, asList("classpath:cucumber/runtime/java/stepdefs")); + backend.loadGlue(glue, asList("classpath:io/cucumber/java/stepdefs")); backend.buildWorld(); - assertEquals(Stepdefs.class, factory.getInstance(Stepdefs.class).getClass()); + verify(factory).addClass(Stepdefs.class); } @Test public void finds_step_definitions_by_package_name() { backend.loadGlue(glue, asList("io.cucumber.java.stepdefs")); backend.buildWorld(); - assertEquals(Stepdefs.class, factory.getInstance(Stepdefs.class).getClass()); + verify(factory).addClass(Stepdefs.class); } @Test diff --git a/java/src/test/java/io/cucumber/java/JavaHookTest.java b/java/src/test/java/io/cucumber/java/JavaHookTest.java index 7e2ed1e961..49e9543a62 100644 --- a/java/src/test/java/io/cucumber/java/JavaHookTest.java +++ b/java/src/test/java/io/cucumber/java/JavaHookTest.java @@ -67,12 +67,10 @@ public class JavaHookTest { private JavaBackend backend; - private SingletonFactory objectFactory; + private SingletonFactory objectFactory = new SingletonFactory(); @org.junit.Before public void createBackendAndLoadNoGlue() { - this.objectFactory = new SingletonFactory(); - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 2821c06741..467157ad29 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -3,7 +3,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.TestStepFinished; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.java.api.annotation.en.Given; import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeServiceEventBus; @@ -18,7 +18,6 @@ import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.io.ResourceLoaderClassFinder; import gherkin.events.PickleEvent; import gherkin.pickles.Argument; import gherkin.pickles.Pickle; @@ -40,7 +39,6 @@ import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsEqual.equalTo; import static org.hamcrest.core.StringStartsWith.startsWith; import static java.util.Collections.emptyList; import static org.junit.Assert.assertEquals; @@ -74,10 +72,9 @@ public class JavaStepDefinitionTest { public void createBackendAndLoadNoGlue() { ClassLoader classLoader = currentThread().getContextClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); - ResourceLoaderClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); ObjectFactory factory = new SingletonFactory(defs); TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); - this.backend = new JavaBackend(factory, classFinder, typeRegistry); + this.backend = new JavaBackend(factory, resourceLoader, typeRegistry); RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); BackendSupplier backendSupplier = new BackendSupplier() { diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java index deb9fbaf11..44c87244e4 100755 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java @@ -1,7 +1,7 @@ package io.cucumber.java; import io.cucumber.java.api.Transpose; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.StepDefinition; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleLocation; diff --git a/java/src/test/java/io/cucumber/java/MethodScannerTest.java b/java/src/test/java/io/cucumber/java/MethodScannerTest.java index 942b39089f..62e96c1f06 100644 --- a/java/src/test/java/io/cucumber/java/MethodScannerTest.java +++ b/java/src/test/java/io/cucumber/java/MethodScannerTest.java @@ -1,15 +1,19 @@ package io.cucumber.java; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.backend.Glue; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import java.util.Collections; import java.util.Locale; @@ -21,8 +25,13 @@ public class MethodScannerTest { - private ResourceLoaderClassFinder classFinder; + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Mock private ObjectFactory factory; + + private ResourceLoaderClassFinder classFinder; private JavaBackend backend; @Before @@ -30,7 +39,6 @@ public void createBackend(){ ClassLoader classLoader = currentThread().getContextClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); this.classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - this.factory = Mockito.mock(ObjectFactory.class); TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); this.backend = new JavaBackend(factory, classFinder, typeRegistry); } diff --git a/java/src/test/java/io/cucumber/java/SingletonFactory.java b/java/src/test/java/io/cucumber/java/SingletonFactory.java index a16fc45019..b1792a8897 100644 --- a/java/src/test/java/io/cucumber/java/SingletonFactory.java +++ b/java/src/test/java/io/cucumber/java/SingletonFactory.java @@ -1,6 +1,6 @@ package io.cucumber.java; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; class SingletonFactory implements ObjectFactory { private Object singleton; diff --git a/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java b/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java index 0c63c3d780..0665b5b14f 100644 --- a/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java +++ b/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java @@ -6,6 +6,7 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.TypeRegistry; @@ -14,8 +15,9 @@ import static java.util.Collections.singletonList; public class StubBackendProviderService implements BackendProviderService { + @Override - public Backend create(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + public Backend create(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { return new StubBackend(); } diff --git a/needle/src/main/java/io/cucumber/needle/NeedleFactory.java b/needle/src/main/java/io/cucumber/needle/NeedleFactory.java index bc980580e1..ba27a5cba0 100644 --- a/needle/src/main/java/io/cucumber/needle/NeedleFactory.java +++ b/needle/src/main/java/io/cucumber/needle/NeedleFactory.java @@ -1,6 +1,6 @@ package io.cucumber.needle; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import de.akquinet.jbosscc.needle.NeedleTestcase; import de.akquinet.jbosscc.needle.injection.InjectionProvider; import org.slf4j.Logger; diff --git a/needle/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory b/needle/src/main/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory similarity index 100% rename from needle/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory rename to needle/src/main/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory diff --git a/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java b/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java index 91356a78b4..e4a2298058 100644 --- a/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java +++ b/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java @@ -1,7 +1,7 @@ package io.cucumber.openejb; import io.cucumber.core.exception.CucumberException; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import org.apache.openejb.OpenEjbContainer; import javax.ejb.embeddable.EJBContainer; diff --git a/openejb/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory b/openejb/src/main/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory similarity index 100% rename from openejb/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory rename to openejb/src/main/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory diff --git a/openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java b/openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java index 89c3aae346..dc2e54930f 100644 --- a/openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java +++ b/openejb/src/test/java/io/cucumber/openejb/OpenEJBObjectFactoryTest.java @@ -1,6 +1,6 @@ package io.cucumber.openejb; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import org.junit.Test; import static org.junit.Assert.assertNotNull; diff --git a/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java b/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java index c5077c9aee..4b8d177440 100644 --- a/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java +++ b/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java @@ -1,6 +1,6 @@ package io.cucumber.picocontainer; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.reflection.Reflections; import org.picocontainer.MutablePicoContainer; import org.picocontainer.PicoBuilder; diff --git a/picocontainer/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory b/picocontainer/src/main/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory similarity index 100% rename from picocontainer/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory rename to picocontainer/src/main/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java index 9402d4a365..0bba9e5cc6 100644 --- a/picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/PicoFactoryTest.java @@ -1,6 +1,6 @@ package io.cucumber.picocontainer; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import org.junit.Test; import static org.junit.Assert.assertNotNull; diff --git a/spring/src/main/java/io/cucumber/spring/SpringFactory.java b/spring/src/main/java/io/cucumber/spring/SpringFactory.java index c700fb60a5..f735df5f03 100644 --- a/spring/src/main/java/io/cucumber/spring/SpringFactory.java +++ b/spring/src/main/java/io/cucumber/spring/SpringFactory.java @@ -1,6 +1,6 @@ package io.cucumber.spring; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.exception.CucumberException; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; diff --git a/spring/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory b/spring/src/main/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory similarity index 100% rename from spring/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory rename to spring/src/main/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory diff --git a/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java b/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java index 6fcada4ada..e6f83fe8e1 100644 --- a/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java +++ b/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java @@ -1,7 +1,7 @@ package io.cucumber.spring; import io.cucumber.core.exception.CucumberException; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.spring.beans.BellyBean; import io.cucumber.spring.commonglue.AutowiresPlatformTransactionManager; import io.cucumber.spring.commonglue.AutowiresThirdStepDef; diff --git a/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java b/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java index 7b6131cabb..cf412c535d 100644 --- a/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java +++ b/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java @@ -6,6 +6,7 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.Argument; @@ -17,8 +18,9 @@ import static java.util.Collections.singletonList; public class StubBackendProviderService implements BackendProviderService { + @Override - public Backend create(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + public Backend create(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { return new StubBackend(); } diff --git a/weld/src/main/java/io/cucumber/weld/WeldFactory.java b/weld/src/main/java/io/cucumber/weld/WeldFactory.java index 53284572f9..74b883adba 100644 --- a/weld/src/main/java/io/cucumber/weld/WeldFactory.java +++ b/weld/src/main/java/io/cucumber/weld/WeldFactory.java @@ -1,7 +1,7 @@ package io.cucumber.weld; import io.cucumber.core.exception.CucumberException; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import org.jboss.weld.environment.se.Weld; import org.jboss.weld.environment.se.WeldContainer; diff --git a/weld/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory b/weld/src/main/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory similarity index 100% rename from weld/src/main/resources/META-INF/services/io.cucumber.java.api.ObjectFactory rename to weld/src/main/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory diff --git a/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java b/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java index e2fbf960db..d40609750f 100644 --- a/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java +++ b/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java @@ -1,7 +1,7 @@ package io.cucumber.weld; import io.cucumber.core.exception.CucumberException; -import io.cucumber.java.api.ObjectFactory; +import io.cucumber.core.backend.ObjectFactory; import org.jboss.weld.environment.se.Weld; import org.junit.After; From ec3b9d2944f4e806b4754cc02d39367d227731ef Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sun, 25 Nov 2018 13:28:16 +0100 Subject: [PATCH 056/155] [Java] Improve documentation around timeout Partial fix for #1506 --- java/src/main/groovy/annotation.java.gsp | 12 ++++++++++-- java/src/main/groovy/lambda.java.gsp | 18 +++++++++++++++--- .../main/java/io/cucumber/java/api/After.java | 12 +++++++++++- .../java/io/cucumber/java/api/AfterStep.java | 14 ++++++++++++-- .../main/java/io/cucumber/java/api/Before.java | 12 +++++++++++- .../java/io/cucumber/java/api/BeforeStep.java | 12 +++++++++++- 6 files changed, 70 insertions(+), 10 deletions(-) diff --git a/java/src/main/groovy/annotation.java.gsp b/java/src/main/groovy/annotation.java.gsp index 7b31e7423d..fa8d1b033e 100644 --- a/java/src/main/groovy/annotation.java.gsp +++ b/java/src/main/groovy/annotation.java.gsp @@ -34,12 +34,21 @@ import java.lang.annotation.Target; @Repeatable(${kw}.${kw}s.class) public @interface ${kw} { /** + * A cucumber or regular expression. + * * @return a cucumber or regular expression */ String value(); /** - * @return max amount of milliseconds this is allowed to run for. 0 (default) means no restriction. + * Duration in milliseconds this step is allowed to run. Cucumber + * will mark the step as failed when exceeded. + * + * When the maximum duration is exceeded the thread will + * receive an in interrupt. Note: if the interrupt is ignored + * cucumber will wait for the this hook to finish. + * + * @return timeout in milliseconds. 0 (default) means no restriction. */ long timeout() default 0; @@ -54,4 +63,3 @@ public @interface ${kw} { ${kw}[] value(); } } - diff --git a/java/src/main/groovy/lambda.java.gsp b/java/src/main/groovy/lambda.java.gsp index a234f44951..96387664f1 100644 --- a/java/src/main/groovy/lambda.java.gsp +++ b/java/src/main/groovy/lambda.java.gsp @@ -51,8 +51,14 @@ public interface ${className} extends LambdaGlue { /** * Creates a new step definition. * + * The timeout controls how long step is allowed to run. Cucumber + * will mark the step as failed when exceeded. When the maximum + * duration is exceeded the thread will receive an in interrupt. + * Note: if the interrupt is ignored cucumber will wait for the this + * step to finish. + * * @param expression the cucumber expression - * @param timeoutMillis max amount of milliseconds this is allowed to run for. 0 (default) means no restriction. + * @param timeoutMillis timeout in milliseconds. 0 (default) means no restriction. * @param body a lambda expression with no parameters */ default void ${java.text.Normalizer.normalize(kw.replaceAll("[\\s',!]", ""), java.text.Normalizer.Form.NFC)}(String expression, long timeoutMillis, A0 body) { @@ -63,7 +69,7 @@ public interface ${className} extends LambdaGlue { <% (1..9).each { arity -> def ts = (1..arity).collect { n -> "T"+n } - def genericSignature = ts.join(",") %> + def genericSignature = ts.join(",") %> /** * Creates a new step definition. * @@ -81,8 +87,14 @@ public interface ${className} extends LambdaGlue { /** * Creates a new step definition. * + * The timeout controls how long step is allowed to run. Cucumber + * will mark the step as failed when exceeded. When the maximum + * duration is exceeded the thread will receive an in interrupt. + * Note: if the interrupt is ignored cucumber will wait for the this + * step to finish. + * * @param expression the cucumber expression - * @param timeoutMillis max amount of milliseconds this is allowed to run for. 0 (default) means no restriction. + * @param timeoutMillis timeout in milliseconds. 0 (default) means no restriction. * @param body a lambda expression with ${arity} parameters * <% (1..arity).each { i -> %> * @param type of argument ${i} <% } %> diff --git a/java/src/main/java/io/cucumber/java/api/After.java b/java/src/main/java/io/cucumber/java/api/After.java index 793be6f86f..a13c74dd7b 100644 --- a/java/src/main/java/io/cucumber/java/api/After.java +++ b/java/src/main/java/io/cucumber/java/api/After.java @@ -9,12 +9,22 @@ @Target(ElementType.METHOD) public @interface After { /** + * Tag expression. If the expression applies to the current + * scenario this hook will be executed. + * * @return a tag expression */ String value() default ""; /** - * @return max amount of milliseconds this is allowed to run for. 0 (default) means no restriction. + * Duration in milliseconds this hook is allowed to run. Cucumber + * will mark the hook as failed when exceeded. + * + * When the maximum duration is exceeded the thread will + * receive an in interrupt. Note: if the interrupt is ignored + * cucumber will wait for the this hook to finish. + * + * @return timeout in milliseconds. 0 (default) means no restriction. */ long timeout() default 0; diff --git a/java/src/main/java/io/cucumber/java/api/AfterStep.java b/java/src/main/java/io/cucumber/java/api/AfterStep.java index 5eb8a74077..b04dc19990 100644 --- a/java/src/main/java/io/cucumber/java/api/AfterStep.java +++ b/java/src/main/java/io/cucumber/java/api/AfterStep.java @@ -9,12 +9,22 @@ @Target(ElementType.METHOD) public @interface AfterStep { /** - * @return a tag expression, if the expression applies to the current scenario this hook will be executed. + * Tag expression. If the expression applies to the current + * scenario this hook will be executed. + * + * @return a tag expression */ String value() default ""; /** - * @return max amount of milliseconds this is allowed to run for. 0 (default) means no restriction. + * Duration in milliseconds this hook is allowed to run. Cucumber + * will mark the hook as failed when exceeded. + * + * When the maximum duration is exceeded the thread will + * receive an in interrupt. Note: if the interrupt is ignored + * cucumber will wait for the this hook to finish. + * + * @return timeout in milliseconds. 0 (default) means no restriction. */ long timeout() default 0; diff --git a/java/src/main/java/io/cucumber/java/api/Before.java b/java/src/main/java/io/cucumber/java/api/Before.java index db6b786355..ca0e7092b8 100644 --- a/java/src/main/java/io/cucumber/java/api/Before.java +++ b/java/src/main/java/io/cucumber/java/api/Before.java @@ -9,12 +9,22 @@ @Target(ElementType.METHOD) public @interface Before { /** + * Tag expression. If the expression applies to the current + * scenario this hook will be executed. + * * @return a tag expression */ String value() default ""; /** - * @return max amount of milliseconds this is allowed to run for. 0 (default) means no restriction. + * Duration in milliseconds this hook is allowed to run. Cucumber + * will mark the hook as failed when exceeded. + * + * When the maximum duration is exceeded the thread will + * receive an in interrupt. Note: if the interrupt is ignored + * cucumber will wait for the this hook to finish. + * + * @return timeout in milliseconds. 0 (default) means no restriction. */ long timeout() default 0; diff --git a/java/src/main/java/io/cucumber/java/api/BeforeStep.java b/java/src/main/java/io/cucumber/java/api/BeforeStep.java index bf82131a7a..e5d35779ef 100644 --- a/java/src/main/java/io/cucumber/java/api/BeforeStep.java +++ b/java/src/main/java/io/cucumber/java/api/BeforeStep.java @@ -9,12 +9,22 @@ @Target(ElementType.METHOD) public @interface BeforeStep { /** + * Tag expression. If the expression applies to the current + * scenario this hook will be executed. + * * @return a tag expression */ String value() default ""; /** - * @return max amount of milliseconds this is allowed to run for. 0 (default) means no restriction. + * Duration in milliseconds this hook is allowed to run. Cucumber + * will mark the hook as failed when exceeded. + * + * When the maximum duration is exceeded the thread will + * receive an in interrupt. Note: if the interrupt is ignored + * cucumber will wait for the this hook to finish. + * + * @return timeout in milliseconds. 0 (default) means no restriction. */ long timeout() default 0; From 58bc6be9c201441a82885e5a8cbfda29cdf40883 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 20:37:01 +0100 Subject: [PATCH 057/155] [Core] Integrate dedicated option interfaces with existing interfaces --- .../cucumber/core/options/FilterOptions.java | 4 ++- .../cucumber/core/options/PluginOptions.java | 5 ++-- .../cucumber/core/options/RunnerOptions.java | 2 +- .../cucumber/core/options/RuntimeOptions.java | 25 +++++++++++-------- .../java/io/cucumber/core/plugin/Plugins.java | 8 +++--- .../runtime/FeaturePathFeatureSupplier.java | 12 ++++----- .../core/runtime/SingletonRunnerSupplier.java | 3 +-- .../runtime/ThreadLocalRunnerSupplier.java | 2 +- 8 files changed, 33 insertions(+), 28 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/options/FilterOptions.java b/core/src/main/java/io/cucumber/core/options/FilterOptions.java index fd51b1ef67..080228584b 100644 --- a/core/src/main/java/io/cucumber/core/options/FilterOptions.java +++ b/core/src/main/java/io/cucumber/core/options/FilterOptions.java @@ -1,10 +1,12 @@ package io.cucumber.core.options; +import io.cucumber.core.filter.Options; + import java.util.List; import java.util.Map; import java.util.regex.Pattern; -public interface FilterOptions { +public interface FilterOptions extends Options { List getNameFilters(); List getTagFilters(); diff --git a/core/src/main/java/io/cucumber/core/options/PluginOptions.java b/core/src/main/java/io/cucumber/core/options/PluginOptions.java index 680158d5a0..1f1b729be3 100644 --- a/core/src/main/java/io/cucumber/core/options/PluginOptions.java +++ b/core/src/main/java/io/cucumber/core/options/PluginOptions.java @@ -1,9 +1,8 @@ package io.cucumber.core.options; -import java.util.List; +import io.cucumber.core.plugin.Options; -public interface PluginOptions { - List getPluginNames(); +public interface PluginOptions extends Options { boolean isStrict(); diff --git a/core/src/main/java/io/cucumber/core/options/RunnerOptions.java b/core/src/main/java/io/cucumber/core/options/RunnerOptions.java index 1d7caaf4cb..6b0b516275 100644 --- a/core/src/main/java/io/cucumber/core/options/RunnerOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RunnerOptions.java @@ -1,6 +1,6 @@ package io.cucumber.core.options; -import cucumber.api.SnippetType; +import io.cucumber.core.api.options.SnippetType; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index c11f8033fd..b16e752760 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -107,6 +107,15 @@ public RuntimeOptions noSummaryPrinter() { return this; } + @Override + public List plugins() { + List plugins = new ArrayList<>(); + plugins.addAll(formatters); + plugins.addAll(stepDefinitionReporters); + plugins.addAll(summaryPrinters); + return plugins; + } + private void parse(List args) { List parsedTagExpressions = new ArrayList(); List parsedNameFilters = new ArrayList(); @@ -318,15 +327,6 @@ private void addKeywordRow(List> table, String key, List ke table.add(cells); } - @Override - public List getPluginNames() { - List pluginNames = new ArrayList<>(); - pluginNames.addAll(pluginFormatterNames); - pluginNames.addAll(pluginStepDefinitionReporterNames); - pluginNames.addAll(pluginSummaryPrinterNames); - return pluginNames; - } - @Override public List getGlue() { return glue; @@ -351,6 +351,11 @@ public List getFeaturePaths() { return featurePaths; } + @Override + public List getTagExpressions() { + return tagExpressions; + } + @Override public List getNameFilters() { return nameFilters; @@ -358,7 +363,7 @@ public List getNameFilters() { @Override public List getTagFilters() { - return tagFilters; + return tagExpressions; } @Override diff --git a/core/src/main/java/io/cucumber/core/plugin/Plugins.java b/core/src/main/java/io/cucumber/core/plugin/Plugins.java index 3782f9c464..21c7a43060 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Plugins.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugins.java @@ -55,8 +55,8 @@ public void receive(Event event) { private List createPlugins() { List plugins = new ArrayList(); if (!pluginNamesInstantiated) { - for (String pluginName : pluginOptions.getPluginNames()) { - Plugin plugin = pluginFactory.create(pluginName); + for (Options.Plugin pluginOption : pluginOptions.plugins()) { + Plugin plugin = pluginFactory.create(pluginOption); addPlugin(plugins, plugin); } pluginNamesInstantiated = true; @@ -96,14 +96,14 @@ private void addPlugin(List plugins, Plugin plugin) { private void setMonochromeOnColorAwarePlugins(Plugin plugin) { if (plugin instanceof ColorAware) { ColorAware colorAware = (ColorAware) plugin; - colorAware.setMonochrome(runtimeOptions.isMonochrome()); + colorAware.setMonochrome(pluginOptions.isMonochrome()); } } private void setStrictOnStrictAwarePlugins(Plugin plugin) { if (plugin instanceof StrictAware) { StrictAware strictAware = (StrictAware) plugin; - strictAware.setStrict(runtimeOptions.isStrict()); + strictAware.setStrict(pluginOptions.isStrict()); } } diff --git a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java index fc8ea6c9d0..0880bd73a3 100644 --- a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java @@ -1,10 +1,10 @@ package io.cucumber.core.runtime; import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.event.EventBus; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.model.FeatureLoader; -import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.options.FeatureOptions; import java.util.List; @@ -13,18 +13,18 @@ */ public final class FeaturePathFeatureSupplier implements FeatureSupplier { private final FeatureLoader featureLoader; - private final RuntimeOptions runtimeOptions; + private final FeatureOptions featureOptions; private final EventBus bus; - public FeaturePathFeatureSupplier(FeatureLoader featureLoader, RuntimeOptions runtimeOptions, EventBus bus) { + public FeaturePathFeatureSupplier(FeatureLoader featureLoader, FeatureOptions featureOptions, EventBus bus) { this.featureLoader = featureLoader; - this.runtimeOptions = runtimeOptions; + this.featureOptions = featureOptions; this.bus = bus; } @Override public List get() { - List features = featureLoader.load(runtimeOptions.getFeaturePaths(), System.out); + List features = featureLoader.load(featureOptions.getFeaturePaths(), System.out); for (CucumberFeature feature : features) { bus.send(new TestSourceRead(bus.getTime(), feature.getUri(), feature.getGherkinSource())); } diff --git a/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java index 04a716c4a4..8a1485e803 100644 --- a/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java @@ -2,9 +2,8 @@ import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.event.EventBus; -import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.options.RunnerOptions; import io.cucumber.core.runner.Runner; -import io.cucumber.core.runtime.RunnerSupplier; /** * Returns a single unique runner. diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java index 2629129b70..b6a9995c16 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java @@ -3,10 +3,10 @@ import io.cucumber.core.api.event.Event; import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.backend.BackendSupplier; -import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.event.AbstractEventBus; import io.cucumber.core.event.EventBus; import io.cucumber.core.options.RunnerOptions; +import io.cucumber.core.runner.Runner; /** * Creates a distinct runner for each calling thread. Each runner has its own bus, backend- and glue-suppliers. From cad164ade114995c4007d627ab6c58c4f1f3a06a Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 22:37:33 +0100 Subject: [PATCH 058/155] [Java] Separate lambdas and annotation into separate backends --- java/pom.xml | 1 - java/src/main/groovy/annotation.java.gsp | 2 +- .../main/groovy/generate-annotations.groovy | 4 +- .../java/io/cucumber/java/JavaBackend.java | 90 ++----------------- .../cucumber/java/JavaStepDefinitionTest.java | 2 +- .../io/cucumber/java/MethodScannerTest.java | 6 +- .../io/cucumber/java/annotation/Authors.java | 2 +- .../java/annotation/ScenarioStepDefs.java | 6 +- .../io/cucumber/java/annotation/Stepdefs.java | 2 +- .../java/annotation/SubstitutionStepdefs.java | 6 +- .../cucumber/java/annotation/UnusedGlue.java | 2 +- .../io/cucumber/java/repeatable/Stepdefs.java | 2 +- .../io/cucumber/java/stepdefs/Stepdefs.java | 2 +- 13 files changed, 25 insertions(+), 102 deletions(-) diff --git a/java/pom.xml b/java/pom.xml index d5b11f3691..d80288ed25 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -68,7 +68,6 @@ - diff --git a/java/src/main/groovy/annotation.java.gsp b/java/src/main/groovy/annotation.java.gsp index fa8d1b033e..f13909bc65 100644 --- a/java/src/main/groovy/annotation.java.gsp +++ b/java/src/main/groovy/annotation.java.gsp @@ -1,4 +1,4 @@ -package io.cucumber.java.api.annotation.${lang}; +package io.cucumber.java.api.${lang}; import io.cucumber.java.StepDefAnnotation; import io.cucumber.java.StepDefAnnotations; diff --git a/java/src/main/groovy/generate-annotations.groovy b/java/src/main/groovy/generate-annotations.groovy index 7f1c7cac01..61bfd2c7dd 100644 --- a/java/src/main/groovy/generate-annotations.groovy +++ b/java/src/main/groovy/generate-annotations.groovy @@ -43,7 +43,7 @@ GherkinDialectProvider.DIALECTS.keySet().each { language -> def normalized_kw = normalize(kw.replaceAll("[\\s',!\u00AD]", "")) def binding = ["lang": normalized_language, "kw": normalized_kw] def template = engine.createTemplate(templateSource).make(binding) - def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/annotation/${normalized_language}/${normalized_kw}.java") + def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/${normalized_language}/${normalized_kw}.java") if (!file.exists()) { // Haitian has two translations that only differ by case - Sipozeke and SipozeKe // Some file systems are unable to distiguish between them and overwrite the other one :-( @@ -56,7 +56,7 @@ GherkinDialectProvider.DIALECTS.keySet().each { language -> def locale = localeFor(dialect.language) def binding = [ "locale": locale, "normalized_language": normalized_language ] def html = engine.createTemplate(package_info_java).make(binding).toString() - def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/annotation/${normalized_language}/package-info.java") + def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/${normalized_language}/package-info.java") file.write(html, "UTF-8") } } \ No newline at end of file diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 3abbe3cdf5..68021664a1 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -4,9 +4,7 @@ import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.Glue; -import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.ResourceLoader; @@ -21,37 +19,28 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.function.Function; -import static io.cucumber.core.io.MultiLoader.packageName; import static java.lang.Thread.currentThread; -public class JavaBackend implements Backend, LambdaGlueRegistry { +public class JavaBackend implements Backend { private final TypeRegistry typeRegistry; private final SnippetGenerator annotationSnippetGenerator; - private final SnippetGenerator lambdaSnippetGenerator; private final ObjectFactory objectFactory; - private final ClassFinder classFinder; private final MethodScanner methodScanner; private Glue glue; - private List> lambdaGlueClasses = new ArrayList<>(); JavaBackend(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { this(objectFactory, new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader()), typeRegistry); } JavaBackend(ObjectFactory objectFactory, ClassFinder classFinder, TypeRegistry typeRegistry) { - this.classFinder = classFinder; this.objectFactory = objectFactory; this.methodScanner = new MethodScanner(classFinder); this.annotationSnippetGenerator = new SnippetGenerator(new JavaSnippet(), typeRegistry.parameterTypeRegistry()); - this.lambdaSnippetGenerator = new SnippetGenerator(new Java8Snippet(), typeRegistry.parameterTypeRegistry()); this.typeRegistry = typeRegistry; } @@ -60,49 +49,11 @@ public void loadGlue(Glue glue, List gluePaths) { this.glue = glue; // Scan for Java7 style glue (annotated methods) methodScanner.scan(this, gluePaths); - - // Scan for Java8 style glue (lambdas) - for (final String gluePath : gluePaths) { - Collection> glueDefinerClasses = classFinder.getDescendants(LambdaGlue.class, packageName(gluePath)); - for (final Class glueClass : glueDefinerClasses) { - if (glueClass.isInterface()) { - continue; - } - - if (objectFactory.addClass(glueClass)) { - lambdaGlueClasses.add(glueClass); - } - } - } - } - - /** - * Convenience method for frameworks that wish to load glue from methods explicitly (possibly - * found with a different mechanism than Cucumber's built-in classpath scanning). - * - * @param glue where stepdefs and hooks will be added. - * @param method a candidate method. - * @param glueCodeClass the class implementing the method. Must not be a subclass of the class implementing the method. - */ - public void loadGlue(Glue glue, Method method, Class glueCodeClass) { - this.glue = glue; - methodScanner.scan(this, method, glueCodeClass); } @Override public void buildWorld() { objectFactory.start(); - - // Instantiate all the stepdef classes for java8 - the stepdef will be initialised - // in the constructor. - try { - INSTANCE.set(this); - for (Class lambdaGlueClass: lambdaGlueClasses) { - objectFactory.getInstance(lambdaGlueClass); - } - } finally { - INSTANCE.remove(); - } } @Override @@ -112,10 +63,7 @@ public void disposeWorld() { @Override public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { - List snippets = new ArrayList<>(); - snippets.addAll(annotationSnippetGenerator.getSnippet(step, keyword, functionNameGenerator)); - snippets.addAll(lambdaSnippetGenerator.getSnippet(step, keyword, functionNameGenerator)); - return snippets; + return annotationSnippetGenerator.getSnippet(step, keyword, functionNameGenerator); } void addStepDefinition(Annotation annotation, Method method) { @@ -135,54 +83,28 @@ void addStepDefinition(Annotation annotation, Method method) { } } - @Override - public void addStepDefinition(Function stepDefinitionFunction) { - glue.addStepDefinition(stepDefinitionFunction.apply(typeRegistry)); - } - void addHook(Annotation annotation, Method method) { if (objectFactory.addClass(method.getDeclaringClass())) { if (annotation.annotationType().equals(Before.class)) { String tagExpression = ((Before) annotation).value(); long timeout = ((Before) annotation).timeout(); - addBeforeHookDefinition(new JavaHookDefinition(method, tagExpression, ((Before) annotation).order(), timeout, objectFactory)); + glue.addBeforeHook(new JavaHookDefinition(method, tagExpression, ((Before) annotation).order(), timeout, objectFactory)); } else if (annotation.annotationType().equals(After.class)) { String tagExpression = ((After) annotation).value(); long timeout = ((After) annotation).timeout(); - addAfterHookDefinition(new JavaHookDefinition(method, tagExpression, ((After) annotation).order(), timeout, objectFactory)); + glue.addAfterHook(new JavaHookDefinition(method, tagExpression, ((After) annotation).order(), timeout, objectFactory)); } else if (annotation.annotationType().equals(BeforeStep.class)) { String tagExpression = ((BeforeStep) annotation).value(); long timeout = ((BeforeStep) annotation).timeout(); - addBeforeStepHookDefinition(new JavaHookDefinition(method, tagExpression, ((BeforeStep) annotation).order(), timeout, objectFactory)); + glue.addBeforeStepHook(new JavaHookDefinition(method, tagExpression, ((BeforeStep) annotation).order(), timeout, objectFactory)); } else if (annotation.annotationType().equals(AfterStep.class)) { String tagExpression = ((AfterStep) annotation).value(); long timeout = ((AfterStep) annotation).timeout(); - addAfterStepHookDefinition(new JavaHookDefinition(method, tagExpression, ((AfterStep) annotation).order(), timeout, objectFactory)); + glue.addAfterStepHook(new JavaHookDefinition(method, tagExpression, ((AfterStep) annotation).order(), timeout, objectFactory)); } } } - @Override - public void addBeforeHookDefinition(HookDefinition beforeHook) { - glue.addBeforeHook(beforeHook); - } - - @Override - public void addAfterHookDefinition(HookDefinition afterHook) { - glue.addAfterHook(afterHook); - } - - @Override - public void addAfterStepHookDefinition(HookDefinition afterStepHook) { - glue.addAfterStepHook(afterStepHook); - } - - @Override - public void addBeforeStepHookDefinition(HookDefinition beforeStepHook) { - glue.addBeforeStepHook(beforeStepHook); - - } - private String expression(Annotation annotation) throws Throwable { Method expressionMethod = annotation.getClass().getMethod("value"); return (String) Invoker.invoke(annotation, expressionMethod, 0); diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 467157ad29..6ee2083e8e 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -4,7 +4,7 @@ import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; diff --git a/java/src/test/java/io/cucumber/java/MethodScannerTest.java b/java/src/test/java/io/cucumber/java/MethodScannerTest.java index 62e96c1f06..1063bc6359 100644 --- a/java/src/test/java/io/cucumber/java/MethodScannerTest.java +++ b/java/src/test/java/io/cucumber/java/MethodScannerTest.java @@ -58,8 +58,9 @@ public void loadGlue_registers_the_methods_declaring_class_in_the_object_factory @Test public void loadGlue_fails_when_class_is_not_method_declaring_class() throws NoSuchMethodException { + MethodScanner methodScanner = new MethodScanner(classFinder); try { - backend.loadGlue(null, BaseStepDefs.class.getMethod("m"), Stepdefs2.class); + methodScanner.scan(backend, BaseStepDefs.class.getMethod("m"), Stepdefs2.class); fail(); } catch (CucumberException e) { assertEquals("You're not allowed to extend classes that define Step Definitions or hooks. class io.cucumber.java.MethodScannerTest$Stepdefs2 extends class io.cucumber.java.MethodScannerTest$BaseStepDefs", e.getMessage()); @@ -68,8 +69,9 @@ public void loadGlue_fails_when_class_is_not_method_declaring_class() throws NoS @Test public void loadGlue_fails_when_class_is_not_subclass_of_declaring_class() throws NoSuchMethodException { + MethodScanner methodScanner = new MethodScanner(classFinder); try { - backend.loadGlue(null, BaseStepDefs.class.getMethod("m"), String.class); + methodScanner.scan(backend, BaseStepDefs.class.getMethod("m"), String.class); fail(); } catch (CucumberException e) { assertEquals("class io.cucumber.java.MethodScannerTest$BaseStepDefs isn't assignable from class java.lang.String", e.getMessage()); diff --git a/java/src/test/java/io/cucumber/java/annotation/Authors.java b/java/src/test/java/io/cucumber/java/annotation/Authors.java index 1b3deea87f..7536ca0902 100644 --- a/java/src/test/java/io/cucumber/java/annotation/Authors.java +++ b/java/src/test/java/io/cucumber/java/annotation/Authors.java @@ -1,7 +1,7 @@ package io.cucumber.java.annotation; import io.cucumber.java.api.Transpose; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; import java.util.List; diff --git a/java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java b/java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java index d220be0d65..cc6ff5813c 100644 --- a/java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java @@ -2,9 +2,9 @@ import io.cucumber.core.api.Scenario; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import static org.junit.Assert.assertEquals; diff --git a/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java b/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java index aa0755404c..34b1c86487 100644 --- a/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.java.annotation; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; import java.util.List; diff --git a/java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java b/java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java index 3cd1ba5545..4f68da98c4 100644 --- a/java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.java.annotation; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import java.util.HashMap; import java.util.Map; diff --git a/java/src/test/java/io/cucumber/java/annotation/UnusedGlue.java b/java/src/test/java/io/cucumber/java/annotation/UnusedGlue.java index d198163468..907e5d46a8 100644 --- a/java/src/test/java/io/cucumber/java/annotation/UnusedGlue.java +++ b/java/src/test/java/io/cucumber/java/annotation/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.java.annotation; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; public class UnusedGlue { public UnusedGlue() { diff --git a/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java b/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java index 31a80d7234..488b26c675 100644 --- a/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.java.repeatable; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; public class Stepdefs { diff --git a/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java b/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java index 92808a31d9..f8503766b5 100644 --- a/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.java.stepdefs; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; public class Stepdefs { From 6be5ab46ead126a9fbad258d6e7ace23ff456067 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 22:37:50 +0100 Subject: [PATCH 059/155] [Java8] Separate lambdas and annotation into separate backends --- java8/pom.xml | 101 ++++++++++++++++ .../main/groovy/generate-interfaces.groovy | 2 +- .../src/main/groovy/lambda.java.gsp | 28 ++--- .../cucumber/java8/AbstractJavaSnippet.java | 53 +++++++++ .../java/io/cucumber/java8/Java8Backend.java | 110 ++++++++++++++++++ .../java8/Java8BackendProviderService.java | 16 +++ .../cucumber/java8}/Java8HookDefinition.java | 6 +- .../java/io/cucumber/java8}/Java8Snippet.java | 4 +- .../cucumber/java8}/Java8StepDefinition.java | 6 +- .../java/io/cucumber/java8}/LambdaGlue.java | 86 +++++++------- .../cucumber/java8}/LambdaGlueRegistry.java | 2 +- .../java/io/cucumber/java8}/api/HookBody.java | 2 +- .../cucumber/java8}/api/HookNoArgsBody.java | 2 +- .../cucumber/java8/api/PendingException.java | 15 +++ .../io/cucumber/java8}/api/StepdefBody.java | 2 +- ...cumber.core.backend.BackendProviderService | 1 + ...Java8AnonInnerClassStepDefinitionTest.java | 5 +- .../io/cucumber/java8/Java8BackendTest.java | 72 ++++++++++++ ...efinitionMarksCorrectStackElementTest.java | 4 +- .../java8}/Java8LambdaStepDefinitionTest.java | 4 +- .../io/cucumber/java8}/Java8SnippetTest.java | 4 +- .../io/cucumber/java8/SingletonFactory.java | 40 +++++++ .../java8}/lambda/AnonInnerClassStepdefs.java | 12 +- .../java8}/lambda/LambdaStepdefs.java | 5 +- .../cucumber/java8}/lambda/RunCukesTest.java | 2 +- .../lambda/TypeRegistryConfiguration.java | 2 +- .../io/cucumber/java8/stepdefs/Stepdefs.java | 15 +++ .../anon-inner-class-step-definitions.feature | 0 .../lambda/lambda-step-definitions.feature | 0 29 files changed, 511 insertions(+), 90 deletions(-) create mode 100644 java8/pom.xml rename {java => java8}/src/main/groovy/generate-interfaces.groovy (95%) rename {java => java8}/src/main/groovy/lambda.java.gsp (87%) create mode 100644 java8/src/main/java/io/cucumber/java8/AbstractJavaSnippet.java create mode 100644 java8/src/main/java/io/cucumber/java8/Java8Backend.java create mode 100644 java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java rename {java/src/main/java/io/cucumber/java => java8/src/main/java/io/cucumber/java8}/Java8HookDefinition.java (94%) rename {java/src/main/java/io/cucumber/java => java8/src/main/java/io/cucumber/java8}/Java8Snippet.java (68%) rename {java/src/main/java/io/cucumber/java => java8/src/main/java/io/cucumber/java8}/Java8StepDefinition.java (97%) rename {java/src/main/java/io/cucumber/java => java8/src/main/java/io/cucumber/java8}/LambdaGlue.java (72%) rename {java/src/main/java/io/cucumber/java => java8/src/main/java/io/cucumber/java8}/LambdaGlueRegistry.java (95%) rename {java/src/main/java/io/cucumber/java => java8/src/main/java/io/cucumber/java8}/api/HookBody.java (82%) rename {java/src/main/java/io/cucumber/java => java8/src/main/java/io/cucumber/java8}/api/HookNoArgsBody.java (75%) create mode 100644 java8/src/main/java/io/cucumber/java8/api/PendingException.java rename {java/src/main/java/io/cucumber/java => java8/src/main/java/io/cucumber/java8}/api/StepdefBody.java (97%) create mode 100644 java8/src/main/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService rename {java/src/test/java/io/cucumber/java => java8/src/test/java/io/cucumber/java8}/Java8AnonInnerClassStepDefinitionTest.java (94%) create mode 100644 java8/src/test/java/io/cucumber/java8/Java8BackendTest.java rename {java/src/test/java/io/cucumber/java => java8/src/test/java/io/cucumber/java8}/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java (97%) rename {java/src/test/java/io/cucumber/java => java8/src/test/java/io/cucumber/java8}/Java8LambdaStepDefinitionTest.java (98%) rename {java/src/test/java/io/cucumber/java => java8/src/test/java/io/cucumber/java8}/Java8SnippetTest.java (92%) create mode 100644 java8/src/test/java/io/cucumber/java8/SingletonFactory.java rename {java/src/test/java/io/cucumber/java => java8/src/test/java/io/cucumber/java8}/lambda/AnonInnerClassStepdefs.java (75%) rename {java/src/test/java/io/cucumber/java => java8/src/test/java/io/cucumber/java8}/lambda/LambdaStepdefs.java (97%) rename {java/src/test/java/io/cucumber/java => java8/src/test/java/io/cucumber/java8}/lambda/RunCukesTest.java (79%) rename {java/src/test/java/io/cucumber/java => java8/src/test/java/io/cucumber/java8}/lambda/TypeRegistryConfiguration.java (96%) create mode 100644 java8/src/test/java/io/cucumber/java8/stepdefs/Stepdefs.java rename {java/src/test/resources/io/cucumber/java => java8/src/test/resources/io/cucumber/java8}/lambda/anon-inner-class-step-definitions.feature (100%) rename {java/src/test/resources/io/cucumber/java => java8/src/test/resources/io/cucumber/java8}/lambda/lambda-step-definitions.feature (100%) diff --git a/java8/pom.xml b/java8/pom.xml new file mode 100644 index 0000000000..ed47ce0af6 --- /dev/null +++ b/java8/pom.xml @@ -0,0 +1,101 @@ + + 4.0.0 + + + io.cucumber + cucumber-jvm + 5.0.0-SNAPSHOT + + + cucumber-java8 + jar + Cucumber-JVM: Java 8 + + + io.cucumber.java8 + + + + + io.cucumber + cucumber-core + + + net.jodah + typetools + + + + io.cucumber + cucumber-junit + test + + + + org.hamcrest + hamcrest-library + test + + + + org.junit.jupiter + junit-jupiter-api + test + + + + org.junit.vintage + junit-vintage-engine + test + + + + org.mockito + mockito-core + test + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + + + generate-i18n-sources + + run + + generate-sources + + + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source + generate-sources + + add-source + + + + ${basedir}/target/generated-sources/i18n/java + + + + + + + + + diff --git a/java/src/main/groovy/generate-interfaces.groovy b/java8/src/main/groovy/generate-interfaces.groovy similarity index 95% rename from java/src/main/groovy/generate-interfaces.groovy rename to java8/src/main/groovy/generate-interfaces.groovy index 88d592c9ea..5163ca55aa 100644 --- a/java/src/main/groovy/generate-interfaces.groovy +++ b/java8/src/main/groovy/generate-interfaces.groovy @@ -24,7 +24,7 @@ GherkinDialectProvider.DIALECTS.keySet().each { language -> def locale = localeFor(dialect.language) def binding = [ "i18n":dialect, "className":className, "locale": locale ] def template = engine.createTemplate(templateSource).make(binding) - def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/lambda/${className}.java") + def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java8/api/${className}.java") file.parentFile.mkdirs() file.write(template.toString(), "UTF-8") } diff --git a/java/src/main/groovy/lambda.java.gsp b/java8/src/main/groovy/lambda.java.gsp similarity index 87% rename from java/src/main/groovy/lambda.java.gsp rename to java8/src/main/groovy/lambda.java.gsp index 96387664f1..61feadc3c7 100644 --- a/java/src/main/groovy/lambda.java.gsp +++ b/java8/src/main/groovy/lambda.java.gsp @@ -1,19 +1,19 @@ -package io.cucumber.java.api.lambda; +package io.cucumber.java8.api; -import io.cucumber.java.api.StepdefBody.A0; -import io.cucumber.java.api.StepdefBody.A1; -import io.cucumber.java.api.StepdefBody.A2; -import io.cucumber.java.api.StepdefBody.A3; -import io.cucumber.java.api.StepdefBody.A4; -import io.cucumber.java.api.StepdefBody.A5; -import io.cucumber.java.api.StepdefBody.A6; -import io.cucumber.java.api.StepdefBody.A7; -import io.cucumber.java.api.StepdefBody.A8; -import io.cucumber.java.api.StepdefBody.A9; +import io.cucumber.java8.api.StepdefBody.A0; +import io.cucumber.java8.api.StepdefBody.A1; +import io.cucumber.java8.api.StepdefBody.A2; +import io.cucumber.java8.api.StepdefBody.A3; +import io.cucumber.java8.api.StepdefBody.A4; +import io.cucumber.java8.api.StepdefBody.A5; +import io.cucumber.java8.api.StepdefBody.A6; +import io.cucumber.java8.api.StepdefBody.A7; +import io.cucumber.java8.api.StepdefBody.A8; +import io.cucumber.java8.api.StepdefBody.A9; -import io.cucumber.java.LambdaGlueRegistry; -import io.cucumber.java.Java8StepDefinition; -import io.cucumber.java.LambdaGlue; +import io.cucumber.java8.LambdaGlueRegistry; +import io.cucumber.java8.Java8StepDefinition; +import io.cucumber.java8.LambdaGlue; /** * ${locale.getDisplayLanguage()} diff --git a/java8/src/main/java/io/cucumber/java8/AbstractJavaSnippet.java b/java8/src/main/java/io/cucumber/java8/AbstractJavaSnippet.java new file mode 100644 index 0000000000..f80a6d9696 --- /dev/null +++ b/java8/src/main/java/io/cucumber/java8/AbstractJavaSnippet.java @@ -0,0 +1,53 @@ +package io.cucumber.java8; + +import io.cucumber.core.snippets.Snippet; +import io.cucumber.datatable.DataTable; + +import java.lang.reflect.Type; +import java.util.Map; + +abstract class AbstractJavaSnippet implements Snippet { + @Override + public final String arguments(Map arguments) { + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (Map.Entry argType : arguments.entrySet()) { + if (first) { + first = false; + } else { + sb.append(", "); + } + sb.append(getArgType(argType.getValue())).append(" ").append(argType.getKey()); + } + return sb.toString(); + } + + private String getArgType(Type argType) { + if (argType instanceof Class) { + Class cType = (Class) argType; + if (cType.equals(DataTable.class)) { + return cType.getName(); + } + return cType.getSimpleName(); + } + + // Got a better idea? Send a PR. + return argType.toString(); + } + + @Override + public final String tableHint() { + return "" + + " // For automatic transformation, change DataTable to one of\n" + + " // E, List, List>, List>, Map or\n" + + " // Map>. E,K,V must be a String, Integer, Float,\n" + + " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + + " //\n" + + " // For other transformations you can register a DataTableType.\n"; //TODO: Add doc URL + } + + @Override + public final String escapePattern(String pattern) { + return pattern.replace("\\", "\\\\").replace("\"", "\\\""); + } +} diff --git a/java8/src/main/java/io/cucumber/java8/Java8Backend.java b/java8/src/main/java/io/cucumber/java8/Java8Backend.java new file mode 100644 index 0000000000..c12d03958c --- /dev/null +++ b/java8/src/main/java/io/cucumber/java8/Java8Backend.java @@ -0,0 +1,110 @@ +package io.cucumber.java8; + +import gherkin.pickles.PickleStep; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.snippets.SnippetGenerator; +import io.cucumber.core.stepexpression.TypeRegistry; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.function.Function; + +import static io.cucumber.core.io.MultiLoader.packageName; +import static java.lang.Thread.currentThread; + +public class Java8Backend implements Backend, LambdaGlueRegistry { + + private final TypeRegistry typeRegistry; + private final SnippetGenerator lambdaSnippetGenerator; + + private final ObjectFactory objectFactory; + private final ClassFinder classFinder; + + private Glue glue; + private List> lambdaGlueClasses = new ArrayList<>(); + + Java8Backend(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + this.classFinder = new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader()); + this.objectFactory = objectFactory; + this.lambdaSnippetGenerator = new SnippetGenerator(new Java8Snippet(), typeRegistry.parameterTypeRegistry()); + this.typeRegistry = typeRegistry; + } + + @Override + public void loadGlue(Glue glue, List gluePaths) { + this.glue = glue; + // Scan for Java8 style glue (lambdas) + for (final String gluePath : gluePaths) { + Collection> glueDefinerClasses = classFinder.getDescendants(LambdaGlue.class, packageName(gluePath)); + for (final Class glueClass : glueDefinerClasses) { + if (glueClass.isInterface()) { + continue; + } + + if (objectFactory.addClass(glueClass)) { + lambdaGlueClasses.add(glueClass); + } + } + } + } + + @Override + public void buildWorld() { + objectFactory.start(); + + // Instantiate all the stepdef classes for java8 - the stepdef will be initialised + // in the constructor. + try { + INSTANCE.set(this); + for (Class lambdaGlueClass: lambdaGlueClasses) { + objectFactory.getInstance(lambdaGlueClass); + } + } finally { + INSTANCE.remove(); + } + } + + @Override + public void disposeWorld() { + objectFactory.stop(); + } + + @Override + public List getSnippet(PickleStep step, String keyword, SnippetType.FunctionNameGenerator functionNameGenerator) { + return lambdaSnippetGenerator.getSnippet(step, keyword, functionNameGenerator); + } + + @Override + public void addStepDefinition(Function stepDefinitionFunction) { + glue.addStepDefinition(stepDefinitionFunction.apply(typeRegistry)); + } + + @Override + public void addBeforeHookDefinition(HookDefinition beforeHook) { + glue.addBeforeHook(beforeHook); + } + + @Override + public void addAfterHookDefinition(HookDefinition afterHook) { + glue.addAfterHook(afterHook); + } + + @Override + public void addAfterStepHookDefinition(HookDefinition afterStepHook) { + glue.addAfterStepHook(afterStepHook); + } + + @Override + public void addBeforeStepHookDefinition(HookDefinition beforeStepHook) { + glue.addBeforeStepHook(beforeStepHook); + + } +} diff --git a/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java b/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java new file mode 100644 index 0000000000..a13ab481b6 --- /dev/null +++ b/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java @@ -0,0 +1,16 @@ +package io.cucumber.java8; + +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.BackendProviderService; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.java8.Java8Backend; + +public class Java8BackendProviderService implements BackendProviderService { + + @Override + public Backend create(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + return new Java8Backend(objectFactory, resourceLoader, typeRegistry); + } +} diff --git a/java/src/main/java/io/cucumber/java/Java8HookDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java similarity index 94% rename from java/src/main/java/io/cucumber/java/Java8HookDefinition.java rename to java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java index 68e1a4fa73..36a343c682 100644 --- a/java/src/main/java/io/cucumber/java/Java8HookDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java @@ -1,12 +1,12 @@ -package io.cucumber.java; +package io.cucumber.java8; import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.filter.TagPredicate; import io.cucumber.core.runtime.Invoker; -import io.cucumber.java.api.HookBody; -import io.cucumber.java.api.HookNoArgsBody; +import io.cucumber.java8.api.HookBody; +import io.cucumber.java8.api.HookNoArgsBody; import java.util.Collection; diff --git a/java/src/main/java/io/cucumber/java/Java8Snippet.java b/java8/src/main/java/io/cucumber/java8/Java8Snippet.java similarity index 68% rename from java/src/main/java/io/cucumber/java/Java8Snippet.java rename to java8/src/main/java/io/cucumber/java8/Java8Snippet.java index b654dc3b86..60e69dd68f 100644 --- a/java/src/main/java/io/cucumber/java/Java8Snippet.java +++ b/java8/src/main/java/io/cucumber/java8/Java8Snippet.java @@ -1,4 +1,4 @@ -package io.cucumber.java; +package io.cucumber.java8; final class Java8Snippet extends AbstractJavaSnippet { @@ -7,7 +7,7 @@ public String template() { return "" + "{0}(\"{1}\", ({3}) -> '{'\n" + " // {4}\n" + - "{5} throw new io.cucumber.java.api.PendingException();\n" + + "{5} throw new io.cucumber.java8.api.PendingException();\n" + "'}');\n"; } } diff --git a/java/src/main/java/io/cucumber/java/Java8StepDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java similarity index 97% rename from java/src/main/java/io/cucumber/java/Java8StepDefinition.java rename to java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java index 24ade64c9c..367f731b71 100644 --- a/java/src/main/java/io/cucumber/java/Java8StepDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java @@ -1,4 +1,4 @@ -package io.cucumber.java; +package io.cucumber.java8; import gherkin.pickles.PickleStep; import io.cucumber.core.backend.StepDefinition; @@ -11,7 +11,7 @@ import io.cucumber.core.stepexpression.StepExpressionFactory; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.stepexpression.TypeResolver; -import io.cucumber.java.api.StepdefBody; +import io.cucumber.java8.api.StepdefBody; import net.jodah.typetools.TypeResolver.Unknown; import java.lang.reflect.Method; @@ -20,7 +20,7 @@ import java.util.List; import java.util.Map; -import static io.cucumber.java.Java8StepDefinition.ParameterInfo.fromTypes; +import static io.cucumber.java8.Java8StepDefinition.ParameterInfo.fromTypes; import static java.lang.String.format; import static net.jodah.typetools.TypeResolver.resolveRawArguments; diff --git a/java/src/main/java/io/cucumber/java/LambdaGlue.java b/java8/src/main/java/io/cucumber/java8/LambdaGlue.java similarity index 72% rename from java/src/main/java/io/cucumber/java/LambdaGlue.java rename to java8/src/main/java/io/cucumber/java8/LambdaGlue.java index efefce4fe0..9c6b5ab3cd 100644 --- a/java/src/main/java/io/cucumber/java/LambdaGlue.java +++ b/java8/src/main/java/io/cucumber/java8/LambdaGlue.java @@ -1,7 +1,7 @@ -package io.cucumber.java; +package io.cucumber.java8; -import io.cucumber.java.api.HookBody; -import io.cucumber.java.api.HookNoArgsBody; +import io.cucumber.java8.api.HookBody; +import io.cucumber.java8.api.HookNoArgsBody; public interface LambdaGlue { @@ -16,7 +16,7 @@ public interface LambdaGlue { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void Before(final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } /** @@ -26,7 +26,7 @@ default void Before(final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void Before(String tagExpression, final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } /** @@ -36,7 +36,7 @@ default void Before(String tagExpression, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void Before(long timeoutMillis, final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); } /** @@ -46,7 +46,7 @@ default void Before(long timeoutMillis, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void Before(int order, final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -58,7 +58,7 @@ default void Before(int order, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void Before(String tagExpression, long timeoutMillis, int order, final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -67,7 +67,7 @@ default void Before(String tagExpression, long timeoutMillis, int order, final H * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void Before(final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } /** @@ -77,7 +77,7 @@ default void Before(final HookNoArgsBody body) { * @param body lambda to execute */ default void Before(String tagExpression, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } /** @@ -87,7 +87,7 @@ default void Before(String tagExpression, final HookNoArgsBody body) { * @param body lambda to execute */ default void Before(long timeoutMillis, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); } /** @@ -97,7 +97,7 @@ default void Before(long timeoutMillis, final HookNoArgsBody body) { * @param body lambda to execute */ default void Before(int order, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -109,7 +109,7 @@ default void Before(int order, final HookNoArgsBody body) { * @param body lambda to execute */ default void Before(String tagExpression, long timeoutMillis, int order, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -118,7 +118,7 @@ default void Before(String tagExpression, long timeoutMillis, int order, final H * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void BeforeStep(final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } /** @@ -128,7 +128,7 @@ default void BeforeStep(final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void BeforeStep(String tagExpression, final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } /** @@ -138,7 +138,7 @@ default void BeforeStep(String tagExpression, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void BeforeStep(long timeoutMillis, final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); } /** @@ -148,7 +148,7 @@ default void BeforeStep(long timeoutMillis, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void BeforeStep(int order, final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -160,7 +160,7 @@ default void BeforeStep(int order, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void BeforeStep(String tagExpression, long timeoutMillis, int order, final HookBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -169,7 +169,7 @@ default void BeforeStep(String tagExpression, long timeoutMillis, int order, fin * @param body lambda to execute */ default void BeforeStep(final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } @@ -180,7 +180,7 @@ default void BeforeStep(final HookNoArgsBody body) { * @param body lambda to execute */ default void BeforeStep(String tagExpression, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } @@ -191,7 +191,7 @@ default void BeforeStep(String tagExpression, final HookNoArgsBody body) { * @param body lambda to execute */ default void BeforeStep(long timeoutMillis, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); } /** @@ -201,7 +201,7 @@ default void BeforeStep(long timeoutMillis, final HookNoArgsBody body) { * @param body lambda to execute */ default void BeforeStep(int order, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -213,7 +213,7 @@ default void BeforeStep(int order, final HookNoArgsBody body) { * @param body lambda to execute */ default void BeforeStep(String tagExpression, long timeoutMillis, int order, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -222,7 +222,7 @@ default void BeforeStep(String tagExpression, long timeoutMillis, int order, fin * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void After(final HookBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -232,7 +232,7 @@ default void After(final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void After(String tagExpression, final HookBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -242,7 +242,7 @@ default void After(String tagExpression, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void After(long timeoutMillis, final HookBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); } /** @@ -252,7 +252,7 @@ default void After(long timeoutMillis, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void After(int order, final HookBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -264,7 +264,7 @@ default void After(int order, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void After(String tagExpression, long timeoutMillis, int order, final HookBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -273,7 +273,7 @@ default void After(String tagExpression, long timeoutMillis, int order, final Ho * @param body lambda to execute */ default void After(final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -283,7 +283,7 @@ default void After(final HookNoArgsBody body) { * @param body lambda to execute */ default void After(String tagExpression, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -293,7 +293,7 @@ default void After(String tagExpression, final HookNoArgsBody body) { * @param body lambda to execute */ default void After(long timeoutMillis, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); } /** @@ -303,7 +303,7 @@ default void After(long timeoutMillis, final HookNoArgsBody body) { * @param body lambda to execute */ default void After(int order, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -315,7 +315,7 @@ default void After(int order, final HookNoArgsBody body) { * @param body lambda to execute */ default void After(String tagExpression, long timeoutMillis, int order, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -324,7 +324,7 @@ default void After(String tagExpression, long timeoutMillis, int order, final Ho * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void AfterStep(final HookBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -334,7 +334,7 @@ default void AfterStep(final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void AfterStep(String tagExpression, final HookBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -344,7 +344,7 @@ default void AfterStep(String tagExpression, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void AfterStep(long timeoutMillis, final HookBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); } /** @@ -354,7 +354,7 @@ default void AfterStep(long timeoutMillis, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void AfterStep(int order, final HookBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -366,7 +366,7 @@ default void AfterStep(int order, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void AfterStep(String tagExpression, long timeoutMillis, int order, final HookBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -375,7 +375,7 @@ default void AfterStep(String tagExpression, long timeoutMillis, int order, fina * @param body lambda to execute */ default void AfterStep(final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -385,7 +385,7 @@ default void AfterStep(final HookNoArgsBody body) { * @param body lambda to execute */ default void AfterStep(String tagExpression, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -395,7 +395,7 @@ default void AfterStep(String tagExpression, final HookNoArgsBody body) { * @param body lambda to execute */ default void AfterStep(long timeoutMillis, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); } /** @@ -405,7 +405,7 @@ default void AfterStep(long timeoutMillis, final HookNoArgsBody body) { * @param body lambda to execute */ default void AfterStep(int order, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -417,7 +417,7 @@ default void AfterStep(int order, final HookNoArgsBody body) { * @param body lambda to execute */ default void AfterStep(String tagExpression, long timeoutMillis, int order, final HookNoArgsBody body) { - JavaBackend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } } diff --git a/java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java b/java8/src/main/java/io/cucumber/java8/LambdaGlueRegistry.java similarity index 95% rename from java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java rename to java8/src/main/java/io/cucumber/java8/LambdaGlueRegistry.java index 5408491a50..7450d45e9b 100644 --- a/java/src/main/java/io/cucumber/java/LambdaGlueRegistry.java +++ b/java8/src/main/java/io/cucumber/java8/LambdaGlueRegistry.java @@ -1,4 +1,4 @@ -package io.cucumber.java; +package io.cucumber.java8; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.backend.HookDefinition; diff --git a/java/src/main/java/io/cucumber/java/api/HookBody.java b/java8/src/main/java/io/cucumber/java8/api/HookBody.java similarity index 82% rename from java/src/main/java/io/cucumber/java/api/HookBody.java rename to java8/src/main/java/io/cucumber/java8/api/HookBody.java index ad72ca6292..a15f0fc6c5 100644 --- a/java/src/main/java/io/cucumber/java/api/HookBody.java +++ b/java8/src/main/java/io/cucumber/java8/api/HookBody.java @@ -1,4 +1,4 @@ -package io.cucumber.java.api; +package io.cucumber.java8.api; import io.cucumber.core.api.Scenario; diff --git a/java/src/main/java/io/cucumber/java/api/HookNoArgsBody.java b/java8/src/main/java/io/cucumber/java8/api/HookNoArgsBody.java similarity index 75% rename from java/src/main/java/io/cucumber/java/api/HookNoArgsBody.java rename to java8/src/main/java/io/cucumber/java8/api/HookNoArgsBody.java index 1ce5344301..8c5e947506 100644 --- a/java/src/main/java/io/cucumber/java/api/HookNoArgsBody.java +++ b/java8/src/main/java/io/cucumber/java8/api/HookNoArgsBody.java @@ -1,4 +1,4 @@ -package io.cucumber.java.api; +package io.cucumber.java8.api; @FunctionalInterface public interface HookNoArgsBody { diff --git a/java8/src/main/java/io/cucumber/java8/api/PendingException.java b/java8/src/main/java/io/cucumber/java8/api/PendingException.java new file mode 100644 index 0000000000..e51afe5350 --- /dev/null +++ b/java8/src/main/java/io/cucumber/java8/api/PendingException.java @@ -0,0 +1,15 @@ +package io.cucumber.java8.api; + +import io.cucumber.core.backend.Pending; + +// We're deliberately not extending CucumberException (which is used to signal fatal errors) +@Pending +public final class PendingException extends RuntimeException { + public PendingException() { + this("TODO: implement me"); + } + + public PendingException(String message) { + super(message); + } +} diff --git a/java/src/main/java/io/cucumber/java/api/StepdefBody.java b/java8/src/main/java/io/cucumber/java8/api/StepdefBody.java similarity index 97% rename from java/src/main/java/io/cucumber/java/api/StepdefBody.java rename to java8/src/main/java/io/cucumber/java8/api/StepdefBody.java index ec37cb0c85..15f7f01b55 100644 --- a/java/src/main/java/io/cucumber/java/api/StepdefBody.java +++ b/java8/src/main/java/io/cucumber/java8/api/StepdefBody.java @@ -1,4 +1,4 @@ -package io.cucumber.java.api; +package io.cucumber.java8.api; public interface StepdefBody { public static interface A0 extends StepdefBody { diff --git a/java8/src/main/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService b/java8/src/main/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService new file mode 100644 index 0000000000..89144c1d84 --- /dev/null +++ b/java8/src/main/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService @@ -0,0 +1 @@ +io.cucumber.java8.Java8BackendProviderService \ No newline at end of file diff --git a/java/src/test/java/io/cucumber/java/Java8AnonInnerClassStepDefinitionTest.java b/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java similarity index 94% rename from java/src/test/java/io/cucumber/java/Java8AnonInnerClassStepDefinitionTest.java rename to java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java index ccfc82e89d..8741b60f13 100644 --- a/java/src/test/java/io/cucumber/java/Java8AnonInnerClassStepDefinitionTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java @@ -1,10 +1,9 @@ -package io.cucumber.java; +package io.cucumber.java8; import static org.junit.Assert.assertEquals; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.java.Java8StepDefinition; -import io.cucumber.java.api.StepdefBody; +import io.cucumber.java8.api.StepdefBody; import org.junit.Test; import java.util.List; diff --git a/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java b/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java new file mode 100644 index 0000000000..ded736a2d9 --- /dev/null +++ b/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java @@ -0,0 +1,72 @@ +package io.cucumber.java8; + +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.java8.stepdefs.Stepdefs; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.jupiter.api.function.Executable; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +import java.util.List; +import java.util.Locale; + +import static java.lang.Thread.currentThread; +import static java.util.Arrays.asList; +import static java.util.stream.Collectors.toList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class Java8BackendTest { + + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Captor + public ArgumentCaptor stepDefinition; + + @Mock + private Glue glue; + + @Mock + private ObjectFactory factory; + + private Java8Backend backend; + + @Before + public void createBackend() { + ClassLoader classLoader = currentThread().getContextClassLoader(); + ResourceLoader resourceLoader = new MultiLoader(classLoader); + TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); + this.backend = new Java8Backend(factory, resourceLoader, typeRegistry); + } + + @Test + public void finds_step_definitions_by_classpath_url() { + backend.loadGlue(glue, asList("classpath:io/cucumber/java8/stepdefs")); + backend.buildWorld(); + verify(factory).addClass(Stepdefs.class); + } + + @Test + public void finds_step_definitions_by_package_name() { + backend.loadGlue(glue, asList("io.cucumber.java8.stepdefs")); + backend.buildWorld(); + verify(factory).addClass(Stepdefs.class); + } + +} diff --git a/java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java similarity index 97% rename from java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java rename to java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java index 7d63622022..921ecf8e43 100644 --- a/java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java @@ -1,9 +1,9 @@ -package io.cucumber.java; +package io.cucumber.java8; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.java.api.lambda.En; +import io.cucumber.java8.api.En; import org.hamcrest.CustomTypeSafeMatcher; import org.junit.Rule; import org.junit.Test; diff --git a/java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionTest.java b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java similarity index 98% rename from java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionTest.java rename to java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java index b3bd0f59a4..c3208e83e8 100644 --- a/java/src/test/java/io/cucumber/java/Java8LambdaStepDefinitionTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java @@ -1,4 +1,4 @@ -package io.cucumber.java; +package io.cucumber.java8; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleRow; @@ -9,7 +9,7 @@ import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.datatable.DataTable; -import io.cucumber.java.api.StepdefBody; +import io.cucumber.java8.api.StepdefBody; import org.junit.Test; import java.util.List; diff --git a/java/src/test/java/io/cucumber/java/Java8SnippetTest.java b/java8/src/test/java/io/cucumber/java8/Java8SnippetTest.java similarity index 92% rename from java/src/test/java/io/cucumber/java/Java8SnippetTest.java rename to java8/src/test/java/io/cucumber/java8/Java8SnippetTest.java index 88cd2b65bf..36021214dc 100644 --- a/java/src/test/java/io/cucumber/java/Java8SnippetTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8SnippetTest.java @@ -1,4 +1,4 @@ -package io.cucumber.java; +package io.cucumber.java8; import gherkin.pickles.Argument; import gherkin.pickles.PickleLocation; @@ -20,7 +20,7 @@ public void generatesPlainSnippet() { String expected = "" + "Given(\"I have {int} cukes in my {string} belly\", (Integer int1, String string) -> {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java8.api.PendingException();\n" + "});\n"; System.out.println(expected); assertEquals(expected, snippetFor("I have 4 cukes in my \"big\" belly")); diff --git a/java8/src/test/java/io/cucumber/java8/SingletonFactory.java b/java8/src/test/java/io/cucumber/java8/SingletonFactory.java new file mode 100644 index 0000000000..bc7c152264 --- /dev/null +++ b/java8/src/test/java/io/cucumber/java8/SingletonFactory.java @@ -0,0 +1,40 @@ +package io.cucumber.java8; + +import io.cucumber.core.backend.ObjectFactory; + +class SingletonFactory implements ObjectFactory { + private Object singleton; + + public SingletonFactory() { + this(null); + } + + public SingletonFactory(Object singleton) { + this.singleton = singleton; + } + + @Override + public void start() { + } + + @Override + public void stop() { + } + + @Override + public boolean addClass(Class clazz) { + return true; + } + + @Override + public T getInstance(Class type) { + if (singleton == null) { + throw new IllegalStateException("No object is set"); + } + return type.cast(singleton); + } + + public void setInstance(Object o) { + singleton = o; + } +} diff --git a/java/src/test/java/io/cucumber/java/lambda/AnonInnerClassStepdefs.java b/java8/src/test/java/io/cucumber/java8/lambda/AnonInnerClassStepdefs.java similarity index 75% rename from java/src/test/java/io/cucumber/java/lambda/AnonInnerClassStepdefs.java rename to java8/src/test/java/io/cucumber/java8/lambda/AnonInnerClassStepdefs.java index d33ca8e2e0..630800d914 100644 --- a/java/src/test/java/io/cucumber/java/lambda/AnonInnerClassStepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/lambda/AnonInnerClassStepdefs.java @@ -1,12 +1,12 @@ -package io.cucumber.java.lambda; +package io.cucumber.java8.lambda; import static org.junit.Assert.assertEquals; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.java.Java8StepDefinition; -import io.cucumber.java.JavaBackend; -import io.cucumber.java.LambdaGlue; -import io.cucumber.java.api.StepdefBody; +import io.cucumber.java8.Java8StepDefinition; +import io.cucumber.java8.Java8Backend; +import io.cucumber.java8.LambdaGlue; +import io.cucumber.java8.api.StepdefBody; import io.cucumber.core.backend.StepDefinition; import java.util.function.Function; @@ -14,7 +14,7 @@ public class AnonInnerClassStepdefs implements LambdaGlue { public AnonInnerClassStepdefs() { - JavaBackend.INSTANCE.get().addStepDefinition(new Function() { + Java8Backend.INSTANCE.get().addStepDefinition(new Function() { @Override public StepDefinition apply(TypeRegistry typeRegistry) { return Java8StepDefinition.create( diff --git a/java/src/test/java/io/cucumber/java/lambda/LambdaStepdefs.java b/java8/src/test/java/io/cucumber/java8/lambda/LambdaStepdefs.java similarity index 97% rename from java/src/test/java/io/cucumber/java/lambda/LambdaStepdefs.java rename to java8/src/test/java/io/cucumber/java8/lambda/LambdaStepdefs.java index 879b5e7109..69075c8586 100644 --- a/java/src/test/java/io/cucumber/java/lambda/LambdaStepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/lambda/LambdaStepdefs.java @@ -1,4 +1,4 @@ -package io.cucumber.java.lambda; +package io.cucumber.java8.lambda; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; @@ -7,11 +7,10 @@ import io.cucumber.core.api.Scenario; import io.cucumber.datatable.DataTable; -import io.cucumber.java.api.lambda.En; import java.util.List; -public class LambdaStepdefs implements En { +public class LambdaStepdefs implements io.cucumber.java8.api.En{ private static LambdaStepdefs lastInstance; private final int outside = 41; diff --git a/java/src/test/java/io/cucumber/java/lambda/RunCukesTest.java b/java8/src/test/java/io/cucumber/java8/lambda/RunCukesTest.java similarity index 79% rename from java/src/test/java/io/cucumber/java/lambda/RunCukesTest.java rename to java8/src/test/java/io/cucumber/java8/lambda/RunCukesTest.java index 95e2984813..664b02f11b 100644 --- a/java/src/test/java/io/cucumber/java/lambda/RunCukesTest.java +++ b/java8/src/test/java/io/cucumber/java8/lambda/RunCukesTest.java @@ -1,4 +1,4 @@ -package io.cucumber.java.lambda; +package io.cucumber.java8.lambda; import io.cucumber.junit.api.Cucumber; import org.junit.runner.RunWith; diff --git a/java/src/test/java/io/cucumber/java/lambda/TypeRegistryConfiguration.java b/java8/src/test/java/io/cucumber/java8/lambda/TypeRegistryConfiguration.java similarity index 96% rename from java/src/test/java/io/cucumber/java/lambda/TypeRegistryConfiguration.java rename to java8/src/test/java/io/cucumber/java8/lambda/TypeRegistryConfiguration.java index b7a9e34b27..e4686d675b 100644 --- a/java/src/test/java/io/cucumber/java/lambda/TypeRegistryConfiguration.java +++ b/java8/src/test/java/io/cucumber/java8/lambda/TypeRegistryConfiguration.java @@ -1,4 +1,4 @@ -package io.cucumber.java.lambda; +package io.cucumber.java8.lambda; import io.cucumber.core.api.TypeRegistry; import io.cucumber.core.api.TypeRegistryConfigurer; diff --git a/java8/src/test/java/io/cucumber/java8/stepdefs/Stepdefs.java b/java8/src/test/java/io/cucumber/java8/stepdefs/Stepdefs.java new file mode 100644 index 0000000000..07b6ddfa4d --- /dev/null +++ b/java8/src/test/java/io/cucumber/java8/stepdefs/Stepdefs.java @@ -0,0 +1,15 @@ +package io.cucumber.java8.stepdefs; + +import io.cucumber.java8.api.En; + +public class Stepdefs implements En { + + public Stepdefs() { + + Given("test", () -> { + + }); + + } + +} diff --git a/java/src/test/resources/io/cucumber/java/lambda/anon-inner-class-step-definitions.feature b/java8/src/test/resources/io/cucumber/java8/lambda/anon-inner-class-step-definitions.feature similarity index 100% rename from java/src/test/resources/io/cucumber/java/lambda/anon-inner-class-step-definitions.feature rename to java8/src/test/resources/io/cucumber/java8/lambda/anon-inner-class-step-definitions.feature diff --git a/java/src/test/resources/io/cucumber/java/lambda/lambda-step-definitions.feature b/java8/src/test/resources/io/cucumber/java8/lambda/lambda-step-definitions.feature similarity index 100% rename from java/src/test/resources/io/cucumber/java/lambda/lambda-step-definitions.feature rename to java8/src/test/resources/io/cucumber/java8/lambda/lambda-step-definitions.feature From 8338cb4b4f9fa21d62b84d21bf27bb453c376668 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 22:38:02 +0100 Subject: [PATCH 060/155] [Guice] Separate lambdas and annotation into separate backends --- .../java/io/cucumber/guice/integration/HelloWorldSteps.java | 2 +- .../io/cucumber/guice/integration/ScenarioScopedSteps.java | 6 +++--- .../io/cucumber/guice/integration/SingletonScopedSteps.java | 6 +++--- .../java/io/cucumber/guice/integration/UnScopedSteps.java | 6 +++--- .../test/java/io/cucumber/guice/integration/UnusedGlue.java | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java index f701306bb5..a6fdd1707e 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java @@ -1,6 +1,6 @@ package io.cucumber.guice.integration; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; import io.cucumber.guice.api.ScenarioScoped; @ScenarioScoped diff --git a/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java index 062e3e8e05..f7d4977477 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java @@ -1,8 +1,8 @@ package io.cucumber.guice.integration; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import io.cucumber.guice.api.ScenarioScoped; import javax.inject.Inject; diff --git a/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java index 4329fb1303..67d9a22855 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java @@ -1,8 +1,8 @@ package io.cucumber.guice.integration; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import io.cucumber.guice.api.ScenarioScoped; import javax.inject.Inject; diff --git a/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java index bf7fc358e3..87b383aff1 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java @@ -1,8 +1,8 @@ package io.cucumber.guice.integration; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import javax.inject.Inject; import javax.inject.Provider; diff --git a/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java b/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java index d58052a783..5755f6d79c 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java +++ b/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.guice.integration; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; public class UnusedGlue { public UnusedGlue() { From 8896b6fab80711bdc7c8cddf8a556bd5bee04765 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 22:38:12 +0100 Subject: [PATCH 061/155] [JUnit] Separate lambdas and annotation into separate backends --- junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java | 2 +- .../resources/io/cucumber/{api/junit => junit/api}/OPTIONS.txt | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename junit/src/main/resources/io/cucumber/{api/junit => junit/api}/OPTIONS.txt (100%) diff --git a/junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java b/junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java index deac4e6a4e..3cc9baf7c2 100644 --- a/junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java +++ b/junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java @@ -9,7 +9,7 @@ import java.util.List; class JUnitOptions { - private static final String OPTIONS_RESOURCE = "/io/cucumber/api/junit/OPTIONS.txt"; + private static final String OPTIONS_RESOURCE = "/io/cucumber/junit/api/OPTIONS.txt"; private static String optionsText; private final boolean strict; diff --git a/junit/src/main/resources/io/cucumber/api/junit/OPTIONS.txt b/junit/src/main/resources/io/cucumber/junit/api/OPTIONS.txt similarity index 100% rename from junit/src/main/resources/io/cucumber/api/junit/OPTIONS.txt rename to junit/src/main/resources/io/cucumber/junit/api/OPTIONS.txt From 236a75fe0486f6f783d2d4b9708c778b8d037c55 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 22:38:22 +0100 Subject: [PATCH 062/155] [Core] Separate lambdas and annotation into separate backends --- pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7ce4a45ebd..a8b19ba8ea 100644 --- a/pom.xml +++ b/pom.xml @@ -125,6 +125,11 @@ cucumber-java ${project.version} + + io.cucumber + cucumber-java8 + ${project.version} + io.cucumber cucumber-spring @@ -485,6 +490,7 @@ core java + java8 kotlin-java8 testng picocontainer @@ -626,7 +632,7 @@ I18n - io.cucumber.java.api.lambda:io.cucumber.java.api.annotation.* + io.cucumber.java8.api.lambda:io.cucumber.java8.api.annotation.* Dependency Injection Providers From 0d549706dd24eaf636fecbd9f40e128cc8ed90cb Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 22:38:31 +0100 Subject: [PATCH 063/155] [Kotlin] Separate lambdas and annotation into separate backends --- kotlin-java8/pom.xml | 2 +- .../src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kotlin-java8/pom.xml b/kotlin-java8/pom.xml index 650fd8b7d9..35e0785f89 100644 --- a/kotlin-java8/pom.xml +++ b/kotlin-java8/pom.xml @@ -18,7 +18,7 @@ io.cucumber - cucumber-java + cucumber-java8 io.cucumber diff --git a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt index 364f947c83..a1bca8bc4e 100644 --- a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt @@ -2,7 +2,7 @@ package io.cucumber.kotlin; import io.cucumber.core.api.Scenario import io.cucumber.datatable.DataTable -import io.cucumber.java.api.lambda.En +import io.cucumber.java8.api.En import org.junit.Assert.* var lastInstance : LambdaStepdefs? = null From 06b7f65d62a3e9a1dd94695938ade5242b8761aa Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 22:38:39 +0100 Subject: [PATCH 064/155] [Needle] Separate lambdas and annotation into separate backends --- .../java/io/cucumber/needle/test/AtmWithdrawalSteps.java | 6 +++--- needle/src/test/java/io/cucumber/needle/test/MoreSteps.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java index b49c1d7850..8fef0dea14 100755 --- a/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java +++ b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java @@ -7,9 +7,9 @@ import static org.mockito.Mockito.when; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import io.cucumber.needle.api.InjectionProviderInstancesSupplier; import io.cucumber.needle.api.NeedleInjectionProvider; import io.cucumber.needle.DefaultInstanceInjectionProvider; diff --git a/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java b/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java index 627d8b8d62..9a74a19d50 100644 --- a/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java +++ b/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java @@ -3,7 +3,7 @@ import static org.junit.Assert.assertTrue; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; import io.cucumber.needle.api.NeedleInjectionProvider; import io.cucumber.needle.DefaultInstanceInjectionProvider; import de.akquinet.jbosscc.needle.injection.InjectionProvider; From f0ada953b2145e8b2eb0ab6fb1e2e0e965b1e3fe Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 22:38:52 +0100 Subject: [PATCH 065/155] [OpenEJB] Separate lambdas and annotation into separate backends --- openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java | 4 ++-- openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java b/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java index 3cfbc103f8..d87124f108 100644 --- a/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java +++ b/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java @@ -1,7 +1,7 @@ package io.cucumber.openejb; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; import javax.inject.Inject; diff --git a/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java b/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java index a1585d105c..678e2941c0 100644 --- a/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java +++ b/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.openejb; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; public class UnusedGlue { public UnusedGlue() { From 1e8ff943919623cde6b33d4d0fe4bc3171e792c7 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 22:38:59 +0100 Subject: [PATCH 066/155] [Pico] Separate lambdas and annotation into separate backends --- .../src/test/java/io/cucumber/picocontainer/StepDefs.java | 4 ++-- .../src/test/java/io/cucumber/picocontainer/UnusedGlue.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java b/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java index a3118a0c99..d2c6c56671 100644 --- a/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java @@ -4,8 +4,8 @@ import io.cucumber.core.api.Scenario; import io.cucumber.java.api.After; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; import java.util.Collections; import java.util.List; diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java b/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java index 6841a2cdb5..d8ae28ebc5 100644 --- a/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.picocontainer; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; public class UnusedGlue { From 544487d7b3c7fe51b46fc8e829062670639dcbec Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 22:39:08 +0100 Subject: [PATCH 067/155] [Spring] Separate lambdas and annotation into separate backends --- .../java/io/cucumber/spring/commonglue/AnotherStepDef.java | 2 +- .../test/java/io/cucumber/spring/commonglue/OneStepDef.java | 4 ++-- .../java/io/cucumber/spring/commonglue/ThirdStepDef.java | 2 +- .../io/cucumber/spring/commonglue/TransactionStepDefs.java | 4 ++-- .../test/java/io/cucumber/spring/commonglue/UnusedGlue.java | 2 +- .../io/cucumber/spring/contextconfig/BellyStepdefs.java | 2 +- .../dirtiescontextconfig/DirtiesContextBellyStepDefs.java | 4 ++-- .../metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java | 4 ++-- .../spring/metaconfig/general/BellyMetaStepdefs.java | 2 +- .../io/cucumber/spring/threading/ThreadingStepDefs.java | 6 +++--- .../spring/webappconfig/SpringInjectionStepDefs.java | 6 +++--- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java index 1932f06d37..5ad252d5f4 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java @@ -1,6 +1,6 @@ package io.cucumber.spring.commonglue; -import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.en.Then; import org.springframework.beans.factory.annotation.Autowired; import static org.junit.Assert.assertEquals; diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java index 00b577ecd8..b02e4a3305 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java @@ -2,8 +2,8 @@ import org.springframework.beans.factory.annotation.Autowired; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.When; public class OneStepDef { int cucumbers; diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java index 602a9a245a..c293b687d3 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java @@ -1,6 +1,6 @@ package io.cucumber.spring.commonglue; -import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.en.Then; import static org.junit.Assert.assertEquals; diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java b/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java index df731d2359..fb1df380a7 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/TransactionStepDefs.java @@ -2,8 +2,8 @@ import io.cucumber.java.api.After; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; import org.springframework.transaction.support.TransactionSynchronizationManager; import static org.junit.Assert.assertFalse; diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java b/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java index c0a070b209..fb7a657c30 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.spring.commonglue; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; public class UnusedGlue { public UnusedGlue() { diff --git a/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java b/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java index 09c513d185..371437a170 100644 --- a/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java +++ b/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.spring.contextconfig; -import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.en.Then; import io.cucumber.spring.beans.Belly; import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java index 43e1dea70b..0a67ddc56a 100644 --- a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java @@ -1,7 +1,7 @@ package io.cucumber.spring.dirtiescontextconfig; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; import io.cucumber.spring.beans.Belly; import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java index 9b28ce8298..563d100643 100644 --- a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java @@ -1,7 +1,7 @@ package io.cucumber.spring.metaconfig.dirties; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; import io.cucumber.spring.beans.Belly; import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java b/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java index bec45758df..1159383dad 100644 --- a/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.spring.metaconfig.general; -import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.en.Then; import io.cucumber.spring.beans.Belly; import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java b/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java index 30ea5b2a2c..c072feef9f 100644 --- a/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java @@ -5,9 +5,9 @@ import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; diff --git a/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java b/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java index e6866aac47..85dfa59506 100644 --- a/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java @@ -1,8 +1,8 @@ package io.cucumber.spring.webappconfig; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; From fa2fff4f658b53c8d1c191d326f42bfcb68bb640 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 22:39:17 +0100 Subject: [PATCH 068/155] [Weld] Separate lambdas and annotation into separate backends --- weld/src/test/java/io/cucumber/weld/BellyStepdefs.java | 4 ++-- weld/src/test/java/io/cucumber/weld/UnusedGlue.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java b/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java index 0c92a83881..b0adae2fdf 100644 --- a/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java +++ b/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java @@ -1,7 +1,7 @@ package io.cucumber.weld; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; import javax.inject.Inject; import javax.inject.Singleton; diff --git a/weld/src/test/java/io/cucumber/weld/UnusedGlue.java b/weld/src/test/java/io/cucumber/weld/UnusedGlue.java index 6bc5733b3e..fe16838c0a 100644 --- a/weld/src/test/java/io/cucumber/weld/UnusedGlue.java +++ b/weld/src/test/java/io/cucumber/weld/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.weld; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; public class UnusedGlue { public UnusedGlue() { From c56f81b2993f193eeed1df6f42868a75051d159d Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 1 Jan 2019 22:39:27 +0100 Subject: [PATCH 069/155] [Examples] Separate lambdas and annotation into separate backends --- .../io/cucumber/examples/java/calculator/DateStepdefs.java | 6 +++--- .../examples/java/calculator/RpnCalculatorStepdefs.java | 6 +++--- .../cucumber/examples/java/calculator/ShoppingStepdefs.java | 6 +++--- .../io/cucumber/examples/java/calculator/DateStepdefs.java | 6 +++--- .../examples/java/calculator/RpnCalculatorStepdefs.java | 6 +++--- .../cucumber/examples/java/calculator/ShoppingStepdefs.java | 6 +++--- .../cucumber/examples/java/wicket/steps/RentStepdefs.java | 6 +++--- examples/java8-calculator/pom.xml | 2 +- .../examples/java/calculator/RpnCalculatorStepdefs.java | 2 +- .../cucumber/examples/java/calculator/ShoppingStepdefs.java | 2 +- .../cucumber/examples/spring/txn/SeeMessagesStepdefs.java | 6 +++--- .../java/io/cucumber/examples/spring/txn/UserStepdefs.java | 2 +- 12 files changed, 28 insertions(+), 28 deletions(-) diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java index 5bbdff7b0a..b8ce1a1f4a 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.calculator; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import java.util.Date; diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index 241d923781..ad8155336b 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -3,9 +3,9 @@ import io.cucumber.core.api.Scenario; import io.cucumber.java.api.After; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import java.util.List; diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index 2abe7d5d80..ef6c95443d 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.calculator; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import java.util.List; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java index 9de5402a2a..606a6d5e8f 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.calculator; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import java.util.Date; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index 61e9bcb9cc..6601c238f8 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -3,9 +3,9 @@ import io.cucumber.core.api.Scenario; import io.cucumber.java.api.After; import io.cucumber.java.api.Before; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import java.util.List; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index 15afa25fb4..6f6c69879e 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.calculator; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import java.util.List; diff --git a/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java index fe214ba475..a6153f2770 100644 --- a/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java +++ b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.wicket.steps; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; diff --git a/examples/java8-calculator/pom.xml b/examples/java8-calculator/pom.xml index 6ccf834c4b..50083f5bc4 100644 --- a/examples/java8-calculator/pom.xml +++ b/examples/java8-calculator/pom.xml @@ -14,7 +14,7 @@ io.cucumber - cucumber-java + cucumber-java8 test diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index 5a6a3a6de3..41f6b2faba 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.Scenario; import io.cucumber.datatable.DataTable; -import io.cucumber.java.api.lambda.En; +import io.cucumber.java8.api.En; import java.util.List; diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index 4bc90dd7d0..d2624fa288 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,7 +1,7 @@ package io.cucumber.examples.java.calculator; import io.cucumber.datatable.DataTable; -import io.cucumber.java.api.lambda.En; +import io.cucumber.java8.api.En; import java.util.List; diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java index ca4a587efe..56614f6480 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.spring.txn; -import io.cucumber.java.api.annotation.en.Given; -import io.cucumber.java.api.annotation.en.Then; -import io.cucumber.java.api.annotation.en.When; +import io.cucumber.java.api.en.Given; +import io.cucumber.java.api.en.Then; +import io.cucumber.java.api.en.When; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java index 910efac2f5..83e14c5648 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.examples.spring.txn; -import io.cucumber.java.api.annotation.en.Given; +import io.cucumber.java.api.en.Given; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.support.TransactionSynchronizationManager; From c19f657be8889f165eab777b9f109d40f75b1395 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 18 Jan 2019 18:58:18 +0100 Subject: [PATCH 070/155] Update version to avoid merge conflicts --- core/pom.xml | 2 +- examples/java-calculator-testng/pom.xml | 2 +- examples/java-calculator/pom.xml | 2 +- examples/java-wicket/java-wicket-main/pom.xml | 2 +- examples/java-wicket/java-wicket-test/pom.xml | 2 +- examples/java-wicket/pom.xml | 2 +- examples/java8-calculator/pom.xml | 2 +- examples/pom.xml | 2 +- examples/spring-txn/pom.xml | 2 +- guice/pom.xml | 2 +- java/pom.xml | 2 +- java8/pom.xml | 2 +- junit/pom.xml | 2 +- kotlin-java8/pom.xml | 2 +- needle/pom.xml | 2 +- openejb/pom.xml | 2 +- picocontainer/pom.xml | 2 +- pom.xml | 2 +- spring/pom.xml | 2 +- testng/pom.xml | 2 +- weld/pom.xml | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 38c6605c08..0c123841df 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-core diff --git a/examples/java-calculator-testng/pom.xml b/examples/java-calculator-testng/pom.xml index 85040c9d62..7741afd599 100644 --- a/examples/java-calculator-testng/pom.xml +++ b/examples/java-calculator-testng/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT java-calculator-testng diff --git a/examples/java-calculator/pom.xml b/examples/java-calculator/pom.xml index 253c79523e..31f52f004f 100644 --- a/examples/java-calculator/pom.xml +++ b/examples/java-calculator/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT java-calculator diff --git a/examples/java-wicket/java-wicket-main/pom.xml b/examples/java-wicket/java-wicket-main/pom.xml index 7cb2916c06..d4111cd3da 100644 --- a/examples/java-wicket/java-wicket-main/pom.xml +++ b/examples/java-wicket/java-wicket-main/pom.xml @@ -3,7 +3,7 @@ io.cucumber java-wicket - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT java-wicket-main Examples: Wicket application diff --git a/examples/java-wicket/java-wicket-test/pom.xml b/examples/java-wicket/java-wicket-test/pom.xml index 415925b6c3..5c6fa0ab75 100644 --- a/examples/java-wicket/java-wicket-test/pom.xml +++ b/examples/java-wicket/java-wicket-test/pom.xml @@ -3,7 +3,7 @@ io.cucumber java-wicket - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT java-wicket-test Examples: Wicket application tested with Selenium diff --git a/examples/java-wicket/pom.xml b/examples/java-wicket/pom.xml index 202600c6a4..96c6359045 100644 --- a/examples/java-wicket/pom.xml +++ b/examples/java-wicket/pom.xml @@ -3,7 +3,7 @@ io.cucumber cucumber-examples - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT java-wicket pom diff --git a/examples/java8-calculator/pom.xml b/examples/java8-calculator/pom.xml index 50083f5bc4..06d5083902 100644 --- a/examples/java8-calculator/pom.xml +++ b/examples/java8-calculator/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT java8-calculator diff --git a/examples/pom.xml b/examples/pom.xml index 971b1bf0bb..858c9c9e15 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-examples diff --git a/examples/spring-txn/pom.xml b/examples/spring-txn/pom.xml index 88cb8fca33..bd5b6a056e 100644 --- a/examples/spring-txn/pom.xml +++ b/examples/spring-txn/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT spring-txn diff --git a/guice/pom.xml b/guice/pom.xml index 4f5aed4ee1..570b096c92 100644 --- a/guice/pom.xml +++ b/guice/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-guice diff --git a/java/pom.xml b/java/pom.xml index d80288ed25..c153a9d751 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-java diff --git a/java8/pom.xml b/java8/pom.xml index ed47ce0af6..6811dc50c3 100644 --- a/java8/pom.xml +++ b/java8/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-java8 diff --git a/junit/pom.xml b/junit/pom.xml index 65c070f696..5f9afd034f 100644 --- a/junit/pom.xml +++ b/junit/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-junit diff --git a/kotlin-java8/pom.xml b/kotlin-java8/pom.xml index 35e0785f89..f25a8b23f5 100644 --- a/kotlin-java8/pom.xml +++ b/kotlin-java8/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-kotlin-java8 diff --git a/needle/pom.xml b/needle/pom.xml index 077a9b5aed..b7424662b8 100644 --- a/needle/pom.xml +++ b/needle/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-needle diff --git a/openejb/pom.xml b/openejb/pom.xml index 7e7f17ad11..841ced352c 100644 --- a/openejb/pom.xml +++ b/openejb/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-openejb diff --git a/picocontainer/pom.xml b/picocontainer/pom.xml index 8609d8c50f..81a2131bee 100644 --- a/picocontainer/pom.xml +++ b/picocontainer/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-picocontainer diff --git a/pom.xml b/pom.xml index a8b19ba8ea..adb122d7a3 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 1.0.2 cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT pom Cucumber-JVM Cucumber for the JVM diff --git a/spring/pom.xml b/spring/pom.xml index 69475ccfba..2a8f16ef6a 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-spring diff --git a/testng/pom.xml b/testng/pom.xml index 59a05042c0..4c7ce3ba06 100644 --- a/testng/pom.xml +++ b/testng/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-testng diff --git a/weld/pom.xml b/weld/pom.xml index 16e449ebdd..ed0a1f7dab 100644 --- a/weld/pom.xml +++ b/weld/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 5.0.0-SNAPSHOT + 4.2.3-SNAPSHOT cucumber-weld From 107ecbf2f991fa5422f345897cd112fbf83d796a Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sat, 19 Jan 2019 17:11:31 +0100 Subject: [PATCH 071/155] [Core] Formalize feature path The feature path was poorly defined. It could either be a path or a path with a `classpath:` prefix. This ambiguity allowed room for various inconsistencies and misinterpretations. 1. Pickle URI's were not actually uniform. Depending on operating system different path seperators would be used. 2. Pickle URI's did not identify a resource. The `classpath:` prefix would be dropped after loading a feature file. This lead to a fairly complex try-catch-try-again-on-the-classpath mechanism when loading rerun file. By properly defining the feature identifier it becomes possible to parse it in `RuntimeOptions` and propagate a consistent URI to other parts of cucumber-jvm. This reduces the need for work arounds in various places. Features are identified by a URI. This URI can either be absolute: `scheme:/absolute/path/to.feature`, or relative to the current working directory:`scheme:relative/path/to.feature`. In either form, when the scheme is omitted `file` will be assumed: `path/to.feature`. On systems that use a `File.separatorChar` other then `/` `File.separatorChar` can be used as a path separator. When doing so when the scheme must be omitted: `path\to.feature`. It is recommended to use `/` as the path separator. --- .../main/java/cucumber/runner/TestCase.java | 3 +- .../java/cucumber/runtime/RuntimeOptions.java | 82 ++-- .../runtime/RuntimeOptionsFactory.java | 4 +- .../java/cucumber/runtime/filter/Filters.java | 4 +- .../runtime/filter/LinePredicate.java | 11 +- .../runtime/formatter/PrettyFormatter.java | 4 +- .../runtime/formatter/RerunFormatter.java | 78 ++-- .../runtime/io/ClasspathResourceIterable.java | 18 +- .../runtime/io/ClasspathResourceLoader.java | 4 +- .../io/DelegatingResourceIteratorFactory.java | 6 +- .../cucumber/runtime/io/FileResource.java | 31 +- .../runtime/io/FileResourceIterator.java | 4 +- .../io/FileResourceIteratorFactory.java | 14 +- .../runtime/io/FileResourceLoader.java | 20 +- .../java/cucumber/runtime/io/Helpers.java | 28 +- .../java/cucumber/runtime/io/MultiLoader.java | 28 +- .../java/cucumber/runtime/io/Resource.java | 3 +- .../runtime/io/ResourceIteratorFactory.java | 6 +- .../cucumber/runtime/io/ResourceLoader.java | 4 +- .../runtime/io/ResourceLoaderClassFinder.java | 7 +- .../java/cucumber/runtime/io/ZipResource.java | 7 +- .../runtime/io/ZipResourceIterator.java | 6 +- .../io/ZipResourceIteratorFactory.java | 12 +- .../ZipThenFileResourceIteratorFactory.java | 5 +- .../runtime/model/CucumberFeature.java | 9 +- .../cucumber/runtime/model/FeatureLoader.java | 11 +- .../cucumber/runtime/model/FeatureParser.java | 5 +- .../cucumber/runtime/model/PathWithLines.java | 48 --- .../core/model/FeatureIdentifier.java | 76 ++++ .../cucumber/core/model/FeatureWithLines.java | 122 ++++++ .../cucumber/core/options/FeatureOptions.java | 3 +- .../cucumber/core/options/FilterOptions.java | 4 +- .../test/java/cucumber/runner/TestHelper.java | 8 +- .../runtime/RuntimeOptionsFactoryTest.java | 15 +- .../cucumber/runtime/RuntimeOptionsTest.java | 389 +++++++++--------- .../java/cucumber/runtime/RuntimeTest.java | 6 +- .../runtime/UndefinedStepsTrackerTest.java | 10 +- .../runtime/filter/LinePredicateTest.java | 9 +- .../runtime/formatter/HTMLFormatterTest.java | 10 +- .../runtime/formatter/JSONFormatterTest.java | 38 +- .../runtime/formatter/JUnitFormatterTest.java | 8 +- .../runtime/formatter/RerunFormatterTest.java | 16 +- .../formatter/TimelineFormatterTest.java | 6 +- ...DelegatingResourceIteratorFactoryTest.java | 4 +- .../cucumber/runtime/io/FileResourceTest.java | 11 +- .../java/cucumber/runtime/io/HelpersTest.java | 35 +- .../runtime/io/ResourceLoaderTest.java | 21 +- .../io/TestResourceIteratorFactory.java | 9 +- .../io/ZipResourceIteratorFactoryTest.java | 18 +- .../runtime/model/CucumberFeatureTest.java | 33 +- .../runtime/model/FeatureBuilderTest.java | 7 +- .../runtime/model/PathWithLinesTest.java | 30 -- .../core/model/FeatureIdentifierTest.java | 76 ++++ .../core/model/FeatureWithLinesTest.java | 33 ++ .../formatter/JSONPrettyFormatterTest.json | 2 +- .../cucumber/runtime/junit/FeatureRunner.java | 5 +- .../PickleRunnerWithStepDescriptionsTest.java | 2 +- .../runtime/junit/TestPickleBuilder.java | 9 +- 58 files changed, 875 insertions(+), 602 deletions(-) delete mode 100644 core/src/main/java/cucumber/runtime/model/PathWithLines.java create mode 100644 core/src/main/java/io/cucumber/core/model/FeatureIdentifier.java create mode 100644 core/src/main/java/io/cucumber/core/model/FeatureWithLines.java delete mode 100644 core/src/test/java/cucumber/runtime/model/PathWithLinesTest.java create mode 100644 core/src/test/java/io/cucumber/core/model/FeatureIdentifierTest.java create mode 100644 core/src/test/java/io/cucumber/core/model/FeatureWithLinesTest.java diff --git a/core/src/main/java/cucumber/runner/TestCase.java b/core/src/main/java/cucumber/runner/TestCase.java index 124146edc9..9b2592d158 100644 --- a/core/src/main/java/cucumber/runner/TestCase.java +++ b/core/src/main/java/cucumber/runner/TestCase.java @@ -8,6 +8,7 @@ import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleTag; +import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -93,7 +94,7 @@ public List getLines() { } private String fileColonLine(PickleLocation location) { - return pickleEvent.uri + ":" + location.getLine(); + return URI.create(pickleEvent.uri).getSchemeSpecificPart() + ":" + location.getLine(); } @Override diff --git a/core/src/main/java/cucumber/runtime/RuntimeOptions.java b/core/src/main/java/cucumber/runtime/RuntimeOptions.java index 9a2495e554..2871b8b38a 100644 --- a/core/src/main/java/cucumber/runtime/RuntimeOptions.java +++ b/core/src/main/java/cucumber/runtime/RuntimeOptions.java @@ -5,8 +5,7 @@ import cucumber.runtime.io.MultiLoader; import cucumber.runtime.io.Resource; import cucumber.runtime.io.ResourceLoader; -import cucumber.runtime.model.PathWithLines; -import cucumber.util.Encoding; +import io.cucumber.core.model.FeatureWithLines; import cucumber.util.FixJava; import cucumber.util.Mapper; import gherkin.GherkinDialect; @@ -22,12 +21,14 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; +import java.net.URI; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ResourceBundle; +import java.util.Set; +import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -58,8 +59,8 @@ public String map(String keyword) { private final List glue = new ArrayList(); private final List tagFilters = new ArrayList(); private final List nameFilters = new ArrayList(); - private final Map> lineFilters = new HashMap>(); - private final List featurePaths = new ArrayList(); + private final Map> lineFilters = new HashMap<>(); + private final List featurePaths = new ArrayList<>(); private final List junitOptions = new ArrayList(); private final ResourceLoader resourceLoader; @@ -137,8 +138,8 @@ public RuntimeOptions noSummaryPrinter() { private void parse(List args) { List parsedTagFilters = new ArrayList(); List parsedNameFilters = new ArrayList(); - Map> parsedLineFilters = new HashMap>(); - List parsedFeaturePaths = new ArrayList(); + Map> parsedLineFilters = new HashMap<>(); + List parsedFeaturePaths = new ArrayList<>(); List parsedGlue = new ArrayList(); ParsedPluginData parsedPluginData = new ParsedPluginData(); List parsedJunitOptions = new ArrayList(); @@ -188,29 +189,21 @@ private void parse(List args) { } else if (arg.startsWith("-")) { printUsage(); throw new CucumberException("Unknown option: " + arg); - } else { - List paths; - if (arg.startsWith("@")) { - paths = loadRerunFile(arg.substring(1)); - } else { - paths = parsePathWithLines(arg); - } - for (PathWithLines pathWithLines : paths) { - parsedFeaturePaths.add(pathWithLines.path); - if (!pathWithLines.lines.isEmpty()) { - String key = pathWithLines.path.replace("classpath:", ""); - addLineFilters(parsedLineFilters, key, pathWithLines.lines); - } - } + } else if (arg.startsWith("@")) { + FeatureWithLines featureWithLines = parseFeatureWithLines(arg.substring(1)); + processPathWitheLinesFromRerunFile(parsedLineFilters, parsedFeaturePaths, featureWithLines.uri()); + } else if (!arg.isEmpty()){ + FeatureWithLines featureWithLines = parseFeatureWithLines(arg); + processFeatureWithLines(parsedLineFilters, parsedFeaturePaths, featureWithLines); } } - if (!parsedTagFilters.isEmpty() || !parsedNameFilters.isEmpty() || !parsedLineFilters.isEmpty() || haveLineFilters(parsedFeaturePaths)) { + if (!parsedTagFilters.isEmpty() || !parsedNameFilters.isEmpty() || !parsedLineFilters.isEmpty()) { tagFilters.clear(); tagFilters.addAll(parsedTagFilters); nameFilters.clear(); nameFilters.addAll(parsedNameFilters); lineFilters.clear(); - for (String path : parsedLineFilters.keySet()) { + for (URI path : parsedLineFilters.keySet()) { lineFilters.put(path, parsedLineFilters.get(path)); } } @@ -233,47 +226,50 @@ private void parse(List args) { parsedPluginData.updatePluginSummaryPrinterNames(pluginSummaryPrinterNames); } - private void addLineFilters(Map> parsedLineFilters, String key, List lines) { + private FeatureWithLines parseFeatureWithLines(String pathWithLines) { + return FeatureWithLines.parse(pathWithLines); + } + + private void addLineFilters(Map> parsedLineFilters, URI key, Set lines) { + if(lines.isEmpty()){ + return; + } if (parsedLineFilters.containsKey(key)) { parsedLineFilters.get(key).addAll(lines); } else { - parsedLineFilters.put(key, lines); + parsedLineFilters.put(key, new TreeSet<>(lines)); } } - private boolean haveLineFilters(List parsedFeaturePaths) { - for (String pathName : parsedFeaturePaths) { - if (PathWithLines.hasLineFilters(pathName)) { - return true; - } + private void processFeatureWithLines(Map> parsedLineFilters, List parsedFeaturePaths, FeatureWithLines featureWithLines) { + parsedFeaturePaths.add(featureWithLines.uri()); + addLineFilters(parsedLineFilters, featureWithLines.uri(), featureWithLines.lines()); + } + + private void processPathWitheLinesFromRerunFile(Map> parsedLineFilters, List parsedFeaturePaths, URI rerunPath) { + for (FeatureWithLines featureWithLines : loadRerunFile(rerunPath)) { + processFeatureWithLines(parsedLineFilters, parsedFeaturePaths, featureWithLines); } - return false; } - private List loadRerunFile(String rerunPath) { - List featurePaths = new ArrayList<>(); + private List loadRerunFile(URI rerunPath) { + List featurePaths = new ArrayList<>(); Iterable resources = resourceLoader.resources(rerunPath, null); for (Resource resource : resources) { String source = read(resource); if (!source.isEmpty()) { Matcher matcher = RERUN_PATH_SPECIFICATION.matcher(source); while (matcher.find()) { - featurePaths.addAll(parsePathWithLines(matcher.group(1))); + featurePaths.add(parseFeatureWithLines(matcher.group(1))); } } } return featurePaths; } - private List parsePathWithLines(String pathWithLineFilter) { - String normalizedPath = convertFileSeparatorToForwardSlash(pathWithLineFilter); - PathWithLines pathWithLines = new PathWithLines(normalizedPath); - return Collections.singletonList(pathWithLines); - } - private static String read(Resource resource) { try { - return Encoding.readFile(resource); + return FixJava.readReader(new InputStreamReader(resource.getInputStream())); } catch (IOException e) { throw new CucumberException("Failed to read resource:" + resource.getPath(), e); } @@ -380,7 +376,7 @@ public boolean isWip() { } @Override - public List getFeaturePaths() { + public List getFeaturePaths() { return featurePaths; } @@ -395,7 +391,7 @@ public List getTagFilters() { } @Override - public Map> getLineFilters() { + public Map> getLineFilters() { return lineFilters; } diff --git a/core/src/main/java/cucumber/runtime/RuntimeOptionsFactory.java b/core/src/main/java/cucumber/runtime/RuntimeOptionsFactory.java index d4e2ec1795..6e1dce4de3 100644 --- a/core/src/main/java/cucumber/runtime/RuntimeOptionsFactory.java +++ b/core/src/main/java/cucumber/runtime/RuntimeOptionsFactory.java @@ -95,7 +95,7 @@ private void addFeatures(CucumberOptions options, List args) { private void addDefaultFeaturePathIfNoFeaturePathIsSpecified(List args, Class clazz) { if (!featuresSpecified) { - args.add(MultiLoader.CLASSPATH_SCHEME + packagePath(clazz)); + args.add(MultiLoader.CLASSPATH_SCHEME_PREFIX + packagePath(clazz)); } } @@ -125,7 +125,7 @@ private void addGlue(CucumberOptions options, List args) { private void addDefaultGlueIfNoOverridingGlueIsSpecified(List args, Class clazz) { if (!overridingGlueSpecified) { args.add("--glue"); - args.add(MultiLoader.CLASSPATH_SCHEME + packagePath(clazz)); + args.add(MultiLoader.CLASSPATH_SCHEME_PREFIX + packagePath(clazz)); } } diff --git a/core/src/main/java/cucumber/runtime/filter/Filters.java b/core/src/main/java/cucumber/runtime/filter/Filters.java index 997f7fc049..83aa63e445 100644 --- a/core/src/main/java/cucumber/runtime/filter/Filters.java +++ b/core/src/main/java/cucumber/runtime/filter/Filters.java @@ -3,7 +3,9 @@ import gherkin.events.PickleEvent; import io.cucumber.core.options.FilterOptions; +import java.net.URI; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.regex.Pattern; @@ -23,7 +25,7 @@ public Filters(FilterOptions filterOPtions) { if (!nameFilters.isEmpty()) { this.filters.add(new NamePredicate(nameFilters)); } - Map> lineFilters = filterOPtions.getLineFilters(); + Map> lineFilters = filterOPtions.getLineFilters(); if (!lineFilters.isEmpty()) { this.filters.add(new LinePredicate(lineFilters)); } diff --git a/core/src/main/java/cucumber/runtime/filter/LinePredicate.java b/core/src/main/java/cucumber/runtime/filter/LinePredicate.java index 44f57d4b5b..36560a607b 100644 --- a/core/src/main/java/cucumber/runtime/filter/LinePredicate.java +++ b/core/src/main/java/cucumber/runtime/filter/LinePredicate.java @@ -3,23 +3,24 @@ import gherkin.events.PickleEvent; import gherkin.pickles.PickleLocation; -import java.util.List; +import java.net.URI; +import java.util.Collection; import java.util.Map; class LinePredicate implements PicklePredicate { - private Map> lineFilters; + private Map> lineFilters; - LinePredicate(Map> lineFilters) { + LinePredicate(Map> lineFilters) { this.lineFilters = lineFilters; } @Override public boolean apply(PickleEvent pickleEvent) { - String picklePath = pickleEvent.uri; + URI picklePath = URI.create(pickleEvent.uri); if (!lineFilters.containsKey(picklePath)) { return true; } - for (Long line : lineFilters.get(picklePath)) { + for (Integer line : lineFilters.get(picklePath)) { for (PickleLocation location : pickleEvent.pickle.getLocations()) { if (line == location.getLine()) { return true; diff --git a/core/src/main/java/cucumber/runtime/formatter/PrettyFormatter.java b/core/src/main/java/cucumber/runtime/formatter/PrettyFormatter.java index f81add8d29..61c8ca2247 100644 --- a/core/src/main/java/cucumber/runtime/formatter/PrettyFormatter.java +++ b/core/src/main/java/cucumber/runtime/formatter/PrettyFormatter.java @@ -28,6 +28,7 @@ import gherkin.ast.Tag; import gherkin.pickles.PickleTag; +import java.net.URI; import java.util.List; final class PrettyFormatter implements EventListener, ColorAware { @@ -243,7 +244,8 @@ private String getScenarioDefinitionText(ScenarioDefinition definition) { } private String getLocationText(String file, int line) { - return getLocationText(file + ":" + line); + String path = URI.create(file).getSchemeSpecificPart(); + return getLocationText(path + ":" + line); } private String getLocationText(String location) { diff --git a/core/src/main/java/cucumber/runtime/formatter/RerunFormatter.java b/core/src/main/java/cucumber/runtime/formatter/RerunFormatter.java index 415dfe9eee..8af11aba4d 100644 --- a/core/src/main/java/cucumber/runtime/formatter/RerunFormatter.java +++ b/core/src/main/java/cucumber/runtime/formatter/RerunFormatter.java @@ -8,11 +8,12 @@ import cucumber.api.event.TestRunFinished; import cucumber.api.formatter.NiceAppendable; import cucumber.api.formatter.StrictAware; +import io.cucumber.core.model.FeatureWithLines; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.Map; -import java.util.Set; /** @@ -21,19 +22,42 @@ */ final class RerunFormatter implements EventListener, StrictAware { private final NiceAppendable out; - private Map> featureAndFailedLinesMapping = new HashMap>(); - private boolean isStrict = false; + private final Map> featureAndFailedLinesMapping = new HashMap<>(); + private final EventHandler runFinishHandler = new EventHandler() { - private EventHandler testCaseFinishedHandler = new EventHandler() { @Override - public void receive(TestCaseFinished event) { - handleTestCaseFinished(event); + public void receive(TestRunFinished event) { + for (Map.Entry> entry : featureAndFailedLinesMapping.entrySet()) { + FeatureWithLines featureWithLines = FeatureWithLines.parse(entry.getKey(), entry.getValue()); + out.println(featureWithLines.toString()); + } + + out.close(); } }; - private EventHandler runFinishHandler = new EventHandler() { + private boolean isStrict = false; + private final EventHandler testCaseFinishedHandler = new EventHandler() { + @Override - public void receive(TestRunFinished event) { - handleTestRunFinished(); + public void receive(TestCaseFinished event) { + if (!event.result.isOk(isStrict)) { + recordTestFailed(event.testCase); + } + } + + private void recordTestFailed(TestCase testCase) { + String uri = testCase.getUri(); + Collection failedTestCaseLines = getFailedTestCaseLines(uri); + failedTestCaseLines.add(testCase.getLine()); + } + + private Collection getFailedTestCaseLines(String uri) { + Collection failedTestCases = featureAndFailedLinesMapping.get(uri); + if (failedTestCases == null) { + failedTestCases = new ArrayList<>(); + featureAndFailedLinesMapping.put(uri, failedTestCases); + } + return failedTestCases; } }; @@ -52,39 +76,5 @@ public void setEventPublisher(EventPublisher publisher) { public void setStrict(boolean strict) { isStrict = strict; } - - private void handleTestCaseFinished(TestCaseFinished event) { - if (!event.result.isOk(isStrict)) { - recordTestFailed(event.testCase); - } - } - - private void handleTestRunFinished() { - reportFailedTestCases(); - out.close(); - } - - private void recordTestFailed(TestCase testCase) { - String path = testCase.getUri(); - ArrayList failedTestCases = this.featureAndFailedLinesMapping.get(path); - if (failedTestCases == null) { - failedTestCases = new ArrayList(); - this.featureAndFailedLinesMapping.put(path, failedTestCases); - } - - failedTestCases.add(testCase.getLine()); - } - - private void reportFailedTestCases() { - Set>> entries = featureAndFailedLinesMapping.entrySet(); - for (Map.Entry> entry : entries) { - if (!entry.getValue().isEmpty()) { - out.append(entry.getKey()); - for (Integer line : entry.getValue()) { - out.append(":").append(line.toString()); - } - out.println(); - } - } - } } + diff --git a/core/src/main/java/cucumber/runtime/io/ClasspathResourceIterable.java b/core/src/main/java/cucumber/runtime/io/ClasspathResourceIterable.java index ab1ac301b6..f87ea169bc 100644 --- a/core/src/main/java/cucumber/runtime/io/ClasspathResourceIterable.java +++ b/core/src/main/java/cucumber/runtime/io/ClasspathResourceIterable.java @@ -3,10 +3,14 @@ import cucumber.runtime.CucumberException; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.util.Enumeration; import java.util.Iterator; +import static cucumber.runtime.io.MultiLoader.CLASSPATH_SCHEME; + class ClasspathResourceIterable implements Iterable { private final ResourceIteratorFactory resourceIteratorFactory = new DelegatingResourceIteratorFactory(new ZipThenFileResourceIteratorFactory()); @@ -15,9 +19,15 @@ class ClasspathResourceIterable implements Iterable { private final String path; private final String suffix; - ClasspathResourceIterable(ClassLoader classLoader, String path, String suffix) { + ClasspathResourceIterable(ClassLoader classLoader, URI path, String suffix) { this.classLoader = classLoader; - this.path = path; + + + if(!CLASSPATH_SCHEME.equals(path.getScheme())){ + throw new IllegalArgumentException("path must have classpath scheme " + path); + } + + this.path = path.getSchemeSpecificPart(); this.suffix = suffix; } @@ -28,11 +38,11 @@ public Iterator iterator() { Enumeration resources = classLoader.getResources(path); while (resources.hasMoreElements()) { URL url = resources.nextElement(); - Iterator resourceIterator = resourceIteratorFactory.createIterator(url, path, suffix); + Iterator resourceIterator = resourceIteratorFactory.createIterator(url.toURI(), path, suffix); iterator.push(resourceIterator); } return iterator; - } catch (IOException e) { + } catch (IOException | URISyntaxException e) { throw new CucumberException(e); } } diff --git a/core/src/main/java/cucumber/runtime/io/ClasspathResourceLoader.java b/core/src/main/java/cucumber/runtime/io/ClasspathResourceLoader.java index a6843e4b00..6ce22d94f6 100644 --- a/core/src/main/java/cucumber/runtime/io/ClasspathResourceLoader.java +++ b/core/src/main/java/cucumber/runtime/io/ClasspathResourceLoader.java @@ -1,5 +1,7 @@ package cucumber.runtime.io; +import java.net.URI; + public class ClasspathResourceLoader implements ResourceLoader { private final ClassLoader classLoader; @@ -8,7 +10,7 @@ public ClasspathResourceLoader(ClassLoader classLoader) { } @Override - public Iterable resources(String path, String suffix) { + public Iterable resources(URI path, String suffix) { return new ClasspathResourceIterable(classLoader, path, suffix); } } diff --git a/core/src/main/java/cucumber/runtime/io/DelegatingResourceIteratorFactory.java b/core/src/main/java/cucumber/runtime/io/DelegatingResourceIteratorFactory.java index 2bb454c5f8..17704ac982 100644 --- a/core/src/main/java/cucumber/runtime/io/DelegatingResourceIteratorFactory.java +++ b/core/src/main/java/cucumber/runtime/io/DelegatingResourceIteratorFactory.java @@ -2,7 +2,7 @@ import cucumber.runtime.CucumberException; -import java.net.URL; +import java.net.URI; import java.util.Iterator; import java.util.ServiceLoader; @@ -29,7 +29,7 @@ class DelegatingResourceIteratorFactory implements ResourceIteratorFactory { } @Override - public boolean isFactoryFor(URL url) { + public boolean isFactoryFor(URI url) { for (ResourceIteratorFactory delegate : delegates) { if (delegate.isFactoryFor(url)) { return true; @@ -39,7 +39,7 @@ public boolean isFactoryFor(URL url) { } @Override - public Iterator createIterator(URL url, String path, String suffix) { + public Iterator createIterator(URI url, String path, String suffix) { for (ResourceIteratorFactory delegate : delegates) { if (delegate.isFactoryFor(url)) { return delegate.createIterator(url, path, suffix); diff --git a/core/src/main/java/cucumber/runtime/io/FileResource.java b/core/src/main/java/cucumber/runtime/io/FileResource.java index 94149afd1a..de0ed3e80b 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResource.java +++ b/core/src/main/java/cucumber/runtime/io/FileResource.java @@ -4,6 +4,11 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; + +import static cucumber.runtime.io.MultiLoader.CLASSPATH_SCHEME; +import static cucumber.runtime.io.MultiLoader.FILE_SCHEME; class FileResource implements Resource { private final File root; @@ -14,8 +19,8 @@ static FileResource createFileResource(File root, File file) { return new FileResource(root, file, false); } - static FileResource createClasspathFileResource(File root, File file) { - return new FileResource(root, file, true); + static FileResource createClasspathFileResource(File classpathRoot, File file) { + return new FileResource(classpathRoot, file, true); } private FileResource(File root, File file, boolean classpathFileResource) { @@ -28,15 +33,29 @@ private FileResource(File root, File file, boolean classpathFileResource) { } @Override - public String getPath() { + public URI getPath() { if (classpathFileResource) { - String relativePath = file.getAbsolutePath().substring(root.getAbsolutePath().length() + 1); - return relativePath.replace(File.separatorChar, '/'); + return createURI(CLASSPATH_SCHEME, getRelativePath()); + } else if (root.equals(file)) { + return file.toURI(); } else { - return file.getPath(); + return createURI(FILE_SCHEME, getRelativePath()); + } + } + + private static URI createURI(String classpathScheme, String ssp) { + try { + return new URI(classpathScheme, ssp, null); + } catch (URISyntaxException e) { + throw new IllegalArgumentException(e); } } + private String getRelativePath() { + URI relativeUri = root.toURI().relativize(file.toURI()); + return relativeUri.getSchemeSpecificPart(); + } + @Override public InputStream getInputStream() throws IOException { return new FileInputStream(file); diff --git a/core/src/main/java/cucumber/runtime/io/FileResourceIterator.java b/core/src/main/java/cucumber/runtime/io/FileResourceIterator.java index fad4d4e2e0..320819343c 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResourceIterator.java +++ b/core/src/main/java/cucumber/runtime/io/FileResourceIterator.java @@ -14,8 +14,8 @@ static FileResourceIterator createFileResourceIterator(File root, File file, fin return new FileResourceIterator(root, file, suffix, false); } - static FileResourceIterator createClasspathFileResourceIterator(File root, File file, final String suffix) { - return new FileResourceIterator(root, file, suffix, true); + static FileResourceIterator createClasspathFileResourceIterator(File classpathRoot, File file, final String suffix) { + return new FileResourceIterator(classpathRoot, file, suffix, true); } private FileResourceIterator(File root, File file, final String suffix, boolean classpathFileResourceIterator) { diff --git a/core/src/main/java/cucumber/runtime/io/FileResourceIteratorFactory.java b/core/src/main/java/cucumber/runtime/io/FileResourceIteratorFactory.java index 198a8d2efa..64cc457c07 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResourceIteratorFactory.java +++ b/core/src/main/java/cucumber/runtime/io/FileResourceIteratorFactory.java @@ -1,16 +1,14 @@ package cucumber.runtime.io; import java.io.File; -import java.net.URL; +import java.net.URI; import java.util.Iterator; -import static cucumber.runtime.io.Helpers.filePath; - /** * Factory which creates {@link FileResourceIterator}s. *

      *

      {@link FileResourceIterator}s should be created for any cases where a - * URL's protocol isn't otherwise handled. Thus, {@link #isFactoryFor(URL)} + * URL's protocol isn't otherwise handled. Thus, {@link #isFactoryFor(URI)} * will always return true. Because of this behavior, the * FileResourceIteratorFactory should never be registered as a * service implementation for {@link ResourceIteratorFactory} as it could @@ -19,13 +17,15 @@ class FileResourceIteratorFactory implements ResourceIteratorFactory { @Override - public boolean isFactoryFor(URL url) { + public boolean isFactoryFor(URI url) { return true; } @Override - public Iterator createIterator(URL url, String path, String suffix) { - File file = new File(filePath(url)); + public Iterator createIterator(URI url, String path, String suffix) { + + + File file = new File(url); File rootDir = new File(file.getAbsolutePath().substring(0, file.getAbsolutePath().length() - path.length())); return FileResourceIterator.createClasspathFileResourceIterator(rootDir, file, suffix); } diff --git a/core/src/main/java/cucumber/runtime/io/FileResourceLoader.java b/core/src/main/java/cucumber/runtime/io/FileResourceLoader.java index 05ae3b4f3f..e2f8579301 100644 --- a/core/src/main/java/cucumber/runtime/io/FileResourceLoader.java +++ b/core/src/main/java/cucumber/runtime/io/FileResourceLoader.java @@ -1,11 +1,25 @@ package cucumber.runtime.io; import java.io.File; +import java.net.URI; + +import static cucumber.runtime.io.MultiLoader.CLASSPATH_SCHEME; +import static cucumber.runtime.io.MultiLoader.FILE_SCHEME; +import static cucumber.runtime.io.MultiLoader.FILE_SCHEME_PREFIX; class FileResourceLoader implements ResourceLoader { @Override - public Iterable resources(String path, String suffix) { - File root = new File(path); - return new FileResourceIterable(root, root, suffix); + public Iterable resources(URI path, String suffix) { + if(!FILE_SCHEME.equals(path.getScheme())){ + throw new IllegalArgumentException("path must have file scheme " + path); + } + + File file = new File(path.getSchemeSpecificPart()); + if (file.isAbsolute()) { + return new FileResourceIterable(file, file, suffix); + } else { + File root = new File(""); + return new FileResourceIterable(root, file, suffix); + } } } diff --git a/core/src/main/java/cucumber/runtime/io/Helpers.java b/core/src/main/java/cucumber/runtime/io/Helpers.java index c3d88f1028..2e722c3239 100644 --- a/core/src/main/java/cucumber/runtime/io/Helpers.java +++ b/core/src/main/java/cucumber/runtime/io/Helpers.java @@ -2,9 +2,7 @@ import cucumber.runtime.CucumberException; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; +import java.net.URI; class Helpers { private Helpers() { @@ -14,29 +12,13 @@ static boolean hasSuffix(String suffix, String name) { return suffix == null || name.endsWith(suffix); } - static String filePath(URL fileUrl) { - if (!"file".equals(fileUrl.getProtocol())) { - throw new CucumberException("Expected a file URL:" + fileUrl.toExternalForm()); - } - try { - return fileUrl.toURI().getSchemeSpecificPart(); - } catch (URISyntaxException e) { - throw new CucumberException(e); - } - } - - static String jarFilePath(URL jarUrl) { - String urlFile = jarUrl.getFile(); + static URI jarFilePath(URI jarUrl) { + String urlFile = jarUrl.getRawSchemeSpecificPart(); int separatorIndex = urlFile.indexOf("!/"); if (separatorIndex == -1) { - throw new CucumberException("Expected a jar URL: " + jarUrl.toExternalForm()); - } - try { - URL fileUrl = new URL(urlFile.substring(0, separatorIndex)); - return filePath(fileUrl); - } catch (MalformedURLException e) { - throw new CucumberException(e); + throw new CucumberException("Expected a jar URL: " + jarUrl); } + return URI.create(urlFile.substring(0, separatorIndex)); } } diff --git a/core/src/main/java/cucumber/runtime/io/MultiLoader.java b/core/src/main/java/cucumber/runtime/io/MultiLoader.java index f4856b471d..98928c82dc 100644 --- a/core/src/main/java/cucumber/runtime/io/MultiLoader.java +++ b/core/src/main/java/cucumber/runtime/io/MultiLoader.java @@ -1,10 +1,14 @@ package cucumber.runtime.io; +import java.net.URI; import java.util.ArrayList; import java.util.List; public class MultiLoader implements ResourceLoader { - public static final String CLASSPATH_SCHEME = "classpath:"; + static final String CLASSPATH_SCHEME = "classpath"; + public static final String CLASSPATH_SCHEME_PREFIX = CLASSPATH_SCHEME + ":"; + static final String FILE_SCHEME = "file"; + public static final String FILE_SCHEME_PREFIX = FILE_SCHEME + ":"; private final ClasspathResourceLoader classpath; private final FileResourceLoader fs; @@ -15,14 +19,17 @@ public MultiLoader(ClassLoader classLoader) { } @Override - public Iterable resources(String path, String suffix) { - if (isClasspathPath(path)) { - return classpath.resources(stripClasspathPrefix(path), suffix); - } else { + public Iterable resources(URI path, String suffix) { + if (CLASSPATH_SCHEME.equals(path.getScheme())) { + return classpath.resources(path, suffix); + } else if (FILE_SCHEME.equals(path.getScheme())){ return fs.resources(path, suffix); + } else { + throw new IllegalArgumentException("Unsupported scheme: " + path); } } + //TODO: Move this? public static List packageName(List glue) { List packageNames = new ArrayList(glue.size()); for (String gluePath : glue) { @@ -35,15 +42,20 @@ public static String packageName(String gluePath) { if (isClasspathPath(gluePath)) { gluePath = stripClasspathPrefix(gluePath); } - return gluePath.replace('/', '.').replace('\\', '.'); + + if(gluePath.startsWith("/")){ + gluePath = gluePath.substring(1); + } + + return gluePath.replace('/', '.'); } private static boolean isClasspathPath(String path) { - return path.startsWith(CLASSPATH_SCHEME); + return path.startsWith(CLASSPATH_SCHEME_PREFIX); } private static String stripClasspathPrefix(String path) { - return path.substring(CLASSPATH_SCHEME.length()); + return path.substring(CLASSPATH_SCHEME_PREFIX.length()); } } diff --git a/core/src/main/java/cucumber/runtime/io/Resource.java b/core/src/main/java/cucumber/runtime/io/Resource.java index 828678635c..e8b393f36a 100644 --- a/core/src/main/java/cucumber/runtime/io/Resource.java +++ b/core/src/main/java/cucumber/runtime/io/Resource.java @@ -2,9 +2,10 @@ import java.io.IOException; import java.io.InputStream; +import java.net.URI; public interface Resource { - String getPath(); + URI getPath(); InputStream getInputStream() throws IOException; diff --git a/core/src/main/java/cucumber/runtime/io/ResourceIteratorFactory.java b/core/src/main/java/cucumber/runtime/io/ResourceIteratorFactory.java index 912bfd1aee..26533f00e2 100644 --- a/core/src/main/java/cucumber/runtime/io/ResourceIteratorFactory.java +++ b/core/src/main/java/cucumber/runtime/io/ResourceIteratorFactory.java @@ -1,6 +1,6 @@ package cucumber.runtime.io; -import java.net.URL; +import java.net.URI; import java.util.Iterator; /** @@ -15,7 +15,7 @@ public interface ResourceIteratorFactory { * @param url The URL to check. * @return True if the factory can create an iterator for the given URL. */ - boolean isFactoryFor(URL url); + boolean isFactoryFor(URI url); /** * Creates an iterator for the given URL with the path and suffix. @@ -26,5 +26,5 @@ public interface ResourceIteratorFactory { * @return The iterator over the resources designated by the URL, path, and * suffix. */ - Iterator createIterator(URL url, String path, String suffix); + Iterator createIterator(URI url, String path, String suffix); } diff --git a/core/src/main/java/cucumber/runtime/io/ResourceLoader.java b/core/src/main/java/cucumber/runtime/io/ResourceLoader.java index 8920da4e43..27d7d6081d 100644 --- a/core/src/main/java/cucumber/runtime/io/ResourceLoader.java +++ b/core/src/main/java/cucumber/runtime/io/ResourceLoader.java @@ -1,5 +1,7 @@ package cucumber.runtime.io; +import java.net.URI; + public interface ResourceLoader { - Iterable resources(String path, String suffix); + Iterable resources(URI path, String suffix); } diff --git a/core/src/main/java/cucumber/runtime/io/ResourceLoaderClassFinder.java b/core/src/main/java/cucumber/runtime/io/ResourceLoaderClassFinder.java index c69983e55e..8e72725e80 100644 --- a/core/src/main/java/cucumber/runtime/io/ResourceLoaderClassFinder.java +++ b/core/src/main/java/cucumber/runtime/io/ResourceLoaderClassFinder.java @@ -2,6 +2,7 @@ import cucumber.runtime.ClassFinder; +import java.net.URI; import java.util.Collection; import java.util.HashSet; @@ -22,7 +23,7 @@ public ResourceLoaderClassFinder(ResourceLoader resourceLoader, ClassLoader clas public Collection> getDescendants(Class parentType, String packageName) { Collection> result = new HashSet<>(); for (Resource classResource : resourceLoader.resources(packagePath(packageName), CLASS_SUFFIX)) { - String className = getClassName(classResource.getPath()); + String className = getClassName(classResource.getPath().getSchemeSpecificPart()); try { Class clazz = loadClass(className); @@ -35,8 +36,8 @@ public Collection> getDescendants(Class parentType, St return result; } - private String packagePath(String packageName) { - return CLASSPATH_PREFIX + packageName.replace(DOT, PACKAGE_PATH_SEPARATOR); + private URI packagePath(String packageName) { + return URI.create(CLASSPATH_PREFIX + packageName.replace(DOT, PACKAGE_PATH_SEPARATOR)); } private String getClassName(String path) { diff --git a/core/src/main/java/cucumber/runtime/io/ZipResource.java b/core/src/main/java/cucumber/runtime/io/ZipResource.java index 9959ce8988..5c74a1b377 100644 --- a/core/src/main/java/cucumber/runtime/io/ZipResource.java +++ b/core/src/main/java/cucumber/runtime/io/ZipResource.java @@ -2,9 +2,12 @@ import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import static cucumber.runtime.io.MultiLoader.CLASSPATH_SCHEME_PREFIX; + class ZipResource implements Resource { private final ZipFile jarFile; private final ZipEntry jarEntry; @@ -15,8 +18,8 @@ class ZipResource implements Resource { } @Override - public String getPath() { - return jarEntry.getName(); + public URI getPath() { + return URI.create(CLASSPATH_SCHEME_PREFIX + "/" + jarEntry.getName()); } @Override diff --git a/core/src/main/java/cucumber/runtime/io/ZipResourceIterator.java b/core/src/main/java/cucumber/runtime/io/ZipResourceIterator.java index 1f408db740..74beca7789 100644 --- a/core/src/main/java/cucumber/runtime/io/ZipResourceIterator.java +++ b/core/src/main/java/cucumber/runtime/io/ZipResourceIterator.java @@ -1,6 +1,8 @@ package cucumber.runtime.io; +import java.io.File; import java.io.IOException; +import java.net.URI; import java.util.Enumeration; import java.util.Iterator; import java.util.NoSuchElementException; @@ -14,10 +16,10 @@ class ZipResourceIterator implements Iterator { private final Enumeration entries; private Resource next; - ZipResourceIterator(String zipPath, String path, String suffix) throws IOException { + ZipResourceIterator(URI zipPath, String path, String suffix) throws IOException { this.path = path; this.suffix = suffix; - jarFile = new ZipFile(zipPath); + jarFile = new ZipFile(new File(zipPath)); entries = jarFile.entries(); moveToNext(); diff --git a/core/src/main/java/cucumber/runtime/io/ZipResourceIteratorFactory.java b/core/src/main/java/cucumber/runtime/io/ZipResourceIteratorFactory.java index b602a35594..886d01ed99 100644 --- a/core/src/main/java/cucumber/runtime/io/ZipResourceIteratorFactory.java +++ b/core/src/main/java/cucumber/runtime/io/ZipResourceIteratorFactory.java @@ -1,7 +1,7 @@ package cucumber.runtime.io; import java.io.IOException; -import java.net.URL; +import java.net.URI; import java.util.Iterator; import cucumber.runtime.CucumberException; @@ -13,15 +13,15 @@ class ZipResourceIteratorFactory implements ResourceIteratorFactory { @Override - public boolean isFactoryFor(URL url) { - return url.getFile().contains("!/"); + public boolean isFactoryFor(URI url) { + return url.getSchemeSpecificPart().contains("!/"); } @Override - public Iterator createIterator(URL url, String path, String suffix) { + public Iterator createIterator(URI url, String path, String suffix) { try { - String jarPath = Helpers.jarFilePath(url); - return new ZipResourceIterator(jarPath, path, suffix); + URI fileUri = Helpers.jarFilePath(url); + return new ZipResourceIterator(fileUri, path, suffix); } catch (IOException e) { throw new CucumberException(e); } diff --git a/core/src/main/java/cucumber/runtime/io/ZipThenFileResourceIteratorFactory.java b/core/src/main/java/cucumber/runtime/io/ZipThenFileResourceIteratorFactory.java index 0fadcf5816..9d1404645a 100644 --- a/core/src/main/java/cucumber/runtime/io/ZipThenFileResourceIteratorFactory.java +++ b/core/src/main/java/cucumber/runtime/io/ZipThenFileResourceIteratorFactory.java @@ -1,5 +1,6 @@ package cucumber.runtime.io; +import java.net.URI; import java.net.URL; import java.util.Iterator; @@ -11,12 +12,12 @@ class ZipThenFileResourceIteratorFactory implements ResourceIteratorFactory { private final ResourceIteratorFactory fileResourceIteratorFactory = new FileResourceIteratorFactory(); @Override - public boolean isFactoryFor(URL url) { + public boolean isFactoryFor(URI url) { return zipResourceIteratorFactory.isFactoryFor(url) || fileResourceIteratorFactory.isFactoryFor(url); } @Override - public Iterator createIterator(URL url, String path, String suffix) { + public Iterator createIterator(URI url, String path, String suffix) { if (zipResourceIteratorFactory.isFactoryFor(url)) { return zipResourceIteratorFactory.createIterator(url, path, suffix); } else { diff --git a/core/src/main/java/cucumber/runtime/model/CucumberFeature.java b/core/src/main/java/cucumber/runtime/model/CucumberFeature.java index 9fe16ecb80..4f04ff78d2 100644 --- a/core/src/main/java/cucumber/runtime/model/CucumberFeature.java +++ b/core/src/main/java/cucumber/runtime/model/CucumberFeature.java @@ -5,18 +5,19 @@ import gherkin.ast.GherkinDocument; import gherkin.events.PickleEvent; +import java.net.URI; import java.util.Comparator; import java.util.List; import java.util.Objects; public class CucumberFeature { - private final String uri; + private final URI uri; private final List pickles; private GherkinDocument gherkinDocument; private String gherkinSource; - public CucumberFeature(GherkinDocument gherkinDocument, String uri, String gherkinSource, List pickles) { + public CucumberFeature(GherkinDocument gherkinDocument, URI uri, String gherkinSource, List pickles) { this.gherkinDocument = gherkinDocument; this.uri = uri; this.gherkinSource = gherkinSource; @@ -35,12 +36,12 @@ public GherkinDocument getGherkinFeature() { return gherkinDocument; } - public String getUri() { + public URI getUri() { return uri; } public void sendTestSourceRead(EventBus bus) { - bus.send(new TestSourceRead(bus.getTime(), getUri(), gherkinSource)); + bus.send(new TestSourceRead(bus.getTime(), getUri().toString(), gherkinSource)); } String getSource() { diff --git a/core/src/main/java/cucumber/runtime/model/FeatureLoader.java b/core/src/main/java/cucumber/runtime/model/FeatureLoader.java index ffd09b4780..2195059bc7 100644 --- a/core/src/main/java/cucumber/runtime/model/FeatureLoader.java +++ b/core/src/main/java/cucumber/runtime/model/FeatureLoader.java @@ -4,6 +4,7 @@ import cucumber.runtime.io.ResourceLoader; import java.io.PrintStream; +import java.net.URI; import java.util.Iterator; import java.util.List; @@ -16,7 +17,7 @@ public FeatureLoader(ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; } - public List load(List featurePaths, PrintStream out) { + public List load(List featurePaths, PrintStream out) { final List cucumberFeatures = load(featurePaths); if (cucumberFeatures.isEmpty()) { if (featurePaths.isEmpty()) { @@ -28,19 +29,19 @@ public List load(List featurePaths, PrintStream out) { return cucumberFeatures; } - public List load(List featurePaths) { + public List load(List featurePaths) { final FeatureBuilder builder = new FeatureBuilder(); - for (String featurePath : featurePaths) { + for (URI featurePath : featurePaths) { loadFromFeaturePath(builder, featurePath); } return builder.build(); } - private void loadFromFeaturePath(FeatureBuilder builder, String featurePath) { + private void loadFromFeaturePath(FeatureBuilder builder, URI featurePath) { Iterable resources = resourceLoader.resources(featurePath, FEATURE_SUFFIX); Iterator iterator = resources.iterator(); - if (featurePath.endsWith(FEATURE_SUFFIX) && !iterator.hasNext()) { + if (featurePath.getSchemeSpecificPart().endsWith(FEATURE_SUFFIX) && !iterator.hasNext()) { throw new IllegalArgumentException("Feature not found: " + featurePath); } while (iterator.hasNext()) { diff --git a/core/src/main/java/cucumber/runtime/model/FeatureParser.java b/core/src/main/java/cucumber/runtime/model/FeatureParser.java index f48b3decb7..d473e7e6ef 100644 --- a/core/src/main/java/cucumber/runtime/model/FeatureParser.java +++ b/core/src/main/java/cucumber/runtime/model/FeatureParser.java @@ -13,6 +13,7 @@ import gherkin.pickles.Pickle; import java.io.IOException; +import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -26,7 +27,7 @@ private FeatureParser() { public static CucumberFeature parseResource(Resource resource) { requireNonNull(resource); - String path = resource.getPath(); + URI path = resource.getPath(); String source = read(resource); try { @@ -55,7 +56,7 @@ private static List compilePickles(GherkinDocument gherkinDocument, } List pickleEvents = new ArrayList<>(); for (Pickle pickle : new Compiler().compile(gherkinDocument)) { - pickleEvents.add(new PickleEvent(resource.getPath(), pickle)); + pickleEvents.add(new PickleEvent(resource.getPath().toString(), pickle)); } return pickleEvents; } diff --git a/core/src/main/java/cucumber/runtime/model/PathWithLines.java b/core/src/main/java/cucumber/runtime/model/PathWithLines.java deleted file mode 100644 index 4a1e06297b..0000000000 --- a/core/src/main/java/cucumber/runtime/model/PathWithLines.java +++ /dev/null @@ -1,48 +0,0 @@ -package cucumber.runtime.model; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class PathWithLines { - private static final Pattern FILE_COLON_LINE_PATTERN = Pattern.compile("^([\\w\\W]*?):([\\d:]+)$"); - - public final String path; - public final List lines = new ArrayList(); - - public static boolean hasLineFilters(String pathName) { - return FILE_COLON_LINE_PATTERN.matcher(pathName).matches(); - } - - public static String stripLineFilters(String pathName) { - Matcher matcher = FILE_COLON_LINE_PATTERN.matcher(pathName); - if (matcher.matches()) { - return matcher.group(1); - } else { - return pathName; - } - } - - public PathWithLines(String pathName) { - Matcher matcher = FILE_COLON_LINE_PATTERN.matcher(pathName); - if (matcher.matches()) { - path = matcher.group(1); - lines.addAll(toLongs(matcher.group(2).split(":"))); - } else { - path = pathName; - } - } - - private static List toLongs(String[] strings) { - List result = new ArrayList(); - for (String string : strings) { - result.add(Long.parseLong(string)); - } - return result; - } - - public String toString() { - return path + ":" + lines; - } -} diff --git a/core/src/main/java/io/cucumber/core/model/FeatureIdentifier.java b/core/src/main/java/io/cucumber/core/model/FeatureIdentifier.java new file mode 100644 index 0000000000..9dfd3306af --- /dev/null +++ b/core/src/main/java/io/cucumber/core/model/FeatureIdentifier.java @@ -0,0 +1,76 @@ +package io.cucumber.core.model; + +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; + +/** + * Identifies a feature. + *

      + * Features are identified by a URI. This URI can either be absolute: + * {@code scheme:/absolute/path/to.feature}, or relative to the + * current working directory: {@code scheme:relative/path/to.feature}. + *

      + * In either form, when the scheme is omitted {@code file} will be + * assumed: {@code path/to.feature}. + *

      + *

      + * On systems that use a {@code File.separatorChar} other then `{@code /}` + * {@code File.separatorChar} can be used as a path separator. When + * doing so when the scheme must be omitted: {@code path\to.feature}. + * It is recommended to use `{@code /}` as the path separator. + * + * @see FeatureWithLines + */ +public class FeatureIdentifier { + + private FeatureIdentifier() { + + } + + public static URI parse(String featureIdentifier) { + if (nonStandardPathSeparatorInUse(featureIdentifier)) { + String standardized = replaceNonStandardPathSeparator(featureIdentifier); + return parseAssumeFileScheme(standardized); + } + + if (probablyURI(featureIdentifier)) { + return parseProbableURI(featureIdentifier); + } + + return parseAssumeFileScheme(featureIdentifier); + } + + private static URI parseProbableURI(String featureIdentifier) { + return URI.create(featureIdentifier); + } + + private static boolean probablyURI(String featureIdentifier) { + return featureIdentifier.matches("^\\w+:.*$"); + } + + + private static String replaceNonStandardPathSeparator(String featureIdentifier) { + return featureIdentifier.replace(File.separatorChar, '/'); + } + + private static boolean nonStandardPathSeparatorInUse(String featureIdentifier) { + return File.separatorChar != '/' && featureIdentifier.contains(File.separator); + } + + private static URI parseAssumeFileScheme(String featureIdentifier) { + File featureFile = new File(featureIdentifier); + if (featureFile.isAbsolute()) { + return featureFile.toURI(); + } + + try { + URI root = new File("").toURI(); + URI relative = root.relativize(featureFile.toURI()); + // Scheme is lost by relativize + return new URI("file", relative.getSchemeSpecificPart(), relative.getFragment()); + } catch (URISyntaxException e) { + throw new IllegalArgumentException(e.getMessage(), e); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/io/cucumber/core/model/FeatureWithLines.java b/core/src/main/java/io/cucumber/core/model/FeatureWithLines.java new file mode 100644 index 0000000000..fddb2b0933 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/model/FeatureWithLines.java @@ -0,0 +1,122 @@ +package io.cucumber.core.model; + +import java.io.Serializable; +import java.net.URI; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static java.util.Arrays.asList; + +/** + * Identifies scenarios and examples (pickles) in a feature. + *

      + * The structure {@code URI[:LINE]*} is a URI as defined by + * {@link FeatureIdentifier} followed by a sequence of line + * numbers each preceded by a colon. + * + * @see FeatureIdentifier + */ +public class FeatureWithLines implements Serializable { + private static final long serialVersionUID = 20190126L; + private static final Pattern FEATURE_COLON_LINE_PATTERN = Pattern.compile("^(.*?):([\\d:]+)$"); + private static final String INVALID_PATH_MESSAGE = " is not valid. Try URI[:LINE]*"; + + private final URI uri; + private final SortedSet lines; + + private FeatureWithLines(URI uri, Collection lines) { + this.uri = uri; + this.lines = Collections.unmodifiableSortedSet(new TreeSet<>(lines)); + } + + public static FeatureWithLines create(URI uri, Collection lines) { + return new FeatureWithLines(uri, lines); + } + + public static FeatureWithLines parse(String uri, Collection lines) { + return new FeatureWithLines(FeatureIdentifier.parse(uri), lines); + } + + public static FeatureWithLines parse(String uri, Integer... lines) { + return new FeatureWithLines(FeatureIdentifier.parse(uri), asList(lines)); + } + + public static FeatureWithLines parse(String featurePath) { + Matcher matcher = FEATURE_COLON_LINE_PATTERN.matcher(featurePath); + + try { + if (!matcher.matches()) { + return parseFeatureIdentifier(featurePath); + } + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException(featurePath + INVALID_PATH_MESSAGE, e); + } + + String uriGroup = matcher.group(1); + if (uriGroup.isEmpty()) { + throw new IllegalArgumentException(featurePath + INVALID_PATH_MESSAGE); + } + + try { + return parseFeatureIdentifierAndLines(uriGroup, matcher.group(2)); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException(featurePath + INVALID_PATH_MESSAGE, e); + } + } + + private static FeatureWithLines parseFeatureIdentifierAndLines(String uriGroup, String linesGroup) { + URI uri = FeatureIdentifier.parse(uriGroup); + List lines = toInts(linesGroup.split(":")); + return new FeatureWithLines(uri, lines); + } + + private static FeatureWithLines parseFeatureIdentifier(String pathName) { + URI uri = FeatureIdentifier.parse(pathName); + return new FeatureWithLines(uri, Collections.emptyList()); + } + + private static List toInts(String[] strings) { + List result = new ArrayList<>(); + for (String string : strings) { + result.add(Integer.parseInt(string)); + } + return result; + } + + public String toString() { + StringBuilder builder = new StringBuilder(uri.toString()); + for (Integer line : lines) { + builder.append(':'); + builder.append(line); + } + return builder.toString(); + } + + public SortedSet lines() { + return lines; + } + + public URI uri() { + return uri; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FeatureWithLines that = (FeatureWithLines) o; + return uri.equals(that.uri) && lines.equals(that.lines); + } + + @Override + public int hashCode() { + return Objects.hash(uri, lines); + } +} diff --git a/core/src/main/java/io/cucumber/core/options/FeatureOptions.java b/core/src/main/java/io/cucumber/core/options/FeatureOptions.java index 0352a5ee85..47450f625c 100644 --- a/core/src/main/java/io/cucumber/core/options/FeatureOptions.java +++ b/core/src/main/java/io/cucumber/core/options/FeatureOptions.java @@ -1,7 +1,8 @@ package io.cucumber.core.options; +import java.net.URI; import java.util.List; public interface FeatureOptions { - List getFeaturePaths(); + List getFeaturePaths(); } diff --git a/core/src/main/java/io/cucumber/core/options/FilterOptions.java b/core/src/main/java/io/cucumber/core/options/FilterOptions.java index fd51b1ef67..e0315183fe 100644 --- a/core/src/main/java/io/cucumber/core/options/FilterOptions.java +++ b/core/src/main/java/io/cucumber/core/options/FilterOptions.java @@ -1,7 +1,9 @@ package io.cucumber.core.options; +import java.net.URI; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.regex.Pattern; public interface FilterOptions { @@ -9,5 +11,5 @@ public interface FilterOptions { List getTagFilters(); - Map> getLineFilters(); + Map> getLineFilters(); } diff --git a/core/src/test/java/cucumber/runner/TestHelper.java b/core/src/test/java/cucumber/runner/TestHelper.java index 34c2b04e7c..9e021e3b24 100644 --- a/core/src/test/java/cucumber/runner/TestHelper.java +++ b/core/src/test/java/cucumber/runner/TestHelper.java @@ -23,6 +23,7 @@ import gherkin.pickles.PickleString; import gherkin.pickles.PickleTable; import gherkin.pickles.PickleTag; +import io.cucumber.core.model.FeatureIdentifier; import io.cucumber.datatable.DataTable; import io.cucumber.stepexpression.TypeRegistry; import junit.framework.AssertionFailedError; @@ -34,6 +35,7 @@ import java.io.InputStream; import java.io.PrintWriter; import java.lang.reflect.Type; +import java.net.URI; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Arrays; @@ -407,9 +409,13 @@ public TestHelper build() { } public static CucumberFeature feature(final String uri, final String source) { + return feature(FeatureIdentifier.parse(uri), source); + } + + public static CucumberFeature feature(final URI uri, final String source) { return FeatureParser.parseResource(new Resource() { @Override - public String getPath() { + public URI getPath() { return uri; } diff --git a/core/src/test/java/cucumber/runtime/RuntimeOptionsFactoryTest.java b/core/src/test/java/cucumber/runtime/RuntimeOptionsFactoryTest.java index b198485398..185866e025 100644 --- a/core/src/test/java/cucumber/runtime/RuntimeOptionsFactoryTest.java +++ b/core/src/test/java/cucumber/runtime/RuntimeOptionsFactoryTest.java @@ -9,6 +9,8 @@ import cucumber.runtime.formatter.Plugins; import org.junit.Test; +import java.net.URI; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; @@ -16,6 +18,7 @@ import static cucumber.runtime.RuntimeOptionsFactory.packageName; import static cucumber.runtime.RuntimeOptionsFactory.packagePath; import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -42,8 +45,8 @@ public void create_without_options() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(WithoutOptions.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); assertFalse(runtimeOptions.isStrict()); - assertEquals(asList("classpath:cucumber/runtime"), runtimeOptions.getFeaturePaths()); - assertEquals(asList("classpath:cucumber/runtime"), runtimeOptions.getGlue()); + assertEquals(uris("classpath:cucumber/runtime"), runtimeOptions.getFeaturePaths()); + assertEquals(singletonList("classpath:cucumber/runtime"), runtimeOptions.getGlue()); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); assertThat(plugins.getPlugins(), hasSize(2)); @@ -51,13 +54,17 @@ public void create_without_options() { assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); } + public List uris(String str) { + return singletonList(URI.create(str)); + } + @Test public void create_without_options_with_base_class_without_options() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(WithoutOptionsWithBaseClassWithoutOptions.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); - assertEquals(asList("classpath:cucumber/runtime"), runtimeOptions.getFeaturePaths()); - assertEquals(asList("classpath:cucumber/runtime"), runtimeOptions.getGlue()); + assertEquals(uris("classpath:cucumber/runtime"), runtimeOptions.getFeaturePaths()); + assertEquals(singletonList("classpath:cucumber/runtime"), runtimeOptions.getGlue()); assertThat(plugins.getPlugins(), hasSize(2)); assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.ProgressFormatter"); diff --git a/core/src/test/java/cucumber/runtime/RuntimeOptionsTest.java b/core/src/test/java/cucumber/runtime/RuntimeOptionsTest.java index cfdbd4f72e..321c3eb13a 100644 --- a/core/src/test/java/cucumber/runtime/RuntimeOptionsTest.java +++ b/core/src/test/java/cucumber/runtime/RuntimeOptionsTest.java @@ -12,6 +12,9 @@ import cucumber.runtime.formatter.Plugins; import cucumber.runtime.io.Resource; import cucumber.runtime.io.ResourceLoader; +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeDiagnosingMatcher; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -21,37 +24,62 @@ import java.io.ByteArrayInputStream; import java.io.IOException; +import java.net.URI; import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.util.Properties; import java.util.regex.Pattern; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; -import static java.util.Collections.emptyList; +import static java.util.Collections.singleton; import static java.util.Collections.singletonList; -import static java.util.Collections.singletonMap; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.collection.IsEmptyCollection.emptyCollectionOf; +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; +import static org.hamcrest.collection.IsMapContaining.hasEntry; +import static org.hamcrest.core.IsCollectionContaining.hasItem; +import static org.hamcrest.core.StringStartsWith.startsWith; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class RuntimeOptionsTest { + private final Properties properties = new Properties(); @Rule public ExpectedException expectedException = ExpectedException.none(); - @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); - @Mock private ResourceLoader resourceLoader; - private final Properties properties = new Properties(); + public static URI uri(String s) { + return URI.create(s); + } + + private static Matcher plugin(final String pluginName) { + return new TypeSafeDiagnosingMatcher() { + @Override + protected boolean matchesSafely(Plugin plugin, Description description) { + description.appendValue(plugin.getClass().getName()); + return plugin.getClass().getName().equals(pluginName); + } + + @Override + public void describeTo(Description description) { + description.appendValue(pluginName); + } + }; + } + + private static void mockFileResource(ResourceLoader resourceLoader, String path, String feature) + throws IOException { + Resource resource = mock(Resource.class); + when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(feature.getBytes(UTF_8))); + when(resourceLoader.resources(URI.create(path), null)).thenReturn(singletonList(resource)); + } @Test public void has_version_from_properties_file() { @@ -61,76 +89,75 @@ public void has_version_from_properties_file() { @Test public void has_usage() { RuntimeOptions.loadUsageTextIfNeeded(); - assertTrue(RuntimeOptions.usageText.startsWith("Usage")); + assertThat(RuntimeOptions.usageText, startsWith("Usage")); } @Test public void assigns_feature_paths() { RuntimeOptions options = new RuntimeOptions("--glue somewhere somewhere_else"); - assertEquals(asList("somewhere_else"), options.getFeaturePaths()); + assertThat(options.getFeaturePaths(), contains(uri("file:somewhere_else"))); } @Test public void strips_line_filters_from_feature_paths_and_put_them_among_line_filters() { RuntimeOptions options = new RuntimeOptions("--glue somewhere somewhere_else:3"); - assertEquals(asList("somewhere_else"), options.getFeaturePaths()); - Map> expectedLineFilters = new HashMap<>(singletonMap("somewhere_else", asList(3L))); - assertEquals(expectedLineFilters, options.getLineFilters()); + assertThat(options.getFeaturePaths(), contains(uri("file:somewhere_else"))); + assertThat(options.getLineFilters(), hasEntry(uri("file:somewhere_else"), singleton(3))); } @Test public void assigns_filters_from_tags() { RuntimeOptions options = new RuntimeOptions("--tags @keep_this somewhere_else"); - assertEquals(asList("somewhere_else"), options.getFeaturePaths()); - assertEquals(asList("@keep_this"), options.getTagFilters()); + assertThat(options.getFeaturePaths(), contains(uri("file:somewhere_else"))); + assertThat(options.getTagFilters(), contains("@keep_this")); } @Test public void strips_options() { RuntimeOptions options = new RuntimeOptions(" --glue somewhere somewhere_else"); - assertEquals(asList("somewhere_else"), options.getFeaturePaths()); + assertThat(options.getFeaturePaths(), is(singletonList(uri("file:somewhere_else")))); } @Test public void assigns_glue() { RuntimeOptions options = new RuntimeOptions("--glue somewhere"); - assertEquals(asList("somewhere"), options.getGlue()); + assertThat(options.getGlue(), contains("somewhere")); } @Test public void creates_html_formatter() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "html:some/dir", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertEquals("cucumber.runtime.formatter.HTMLFormatter", plugins.getPlugins().get(0).getClass().getName()); + assertThat(plugins.getPlugins().get(0).getClass().getName(), is("cucumber.runtime.formatter.HTMLFormatter")); } @Test public void creates_progress_formatter_as_default() { RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertEquals("cucumber.runtime.formatter.ProgressFormatter", plugins.getPlugins().get(0).getClass().getName()); + assertThat(plugins.getPlugins().get(0).getClass().getName(), is("cucumber.runtime.formatter.ProgressFormatter")); } @Test public void creates_progress_formatter_when_no_formatter_plugin_is_specified() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "cucumber.runtime.formatter.AnyStepDefinitionReporter", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.ProgressFormatter"); + assertThat(plugins.getPlugins(), hasItem(plugin("cucumber.runtime.formatter.ProgressFormatter"))); } @Test public void creates_default_summary_printer_when_no_summary_printer_plugin_is_specified() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "pretty", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + assertThat(plugins.getPlugins(), hasItem(plugin("cucumber.runtime.formatter.DefaultSummaryPrinter"))); } @Test public void creates_null_summary_printer() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "null_summary", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.NullSummaryPrinter"); - assertPluginNotExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + assertThat(plugins.getPlugins(), hasItem(plugin("cucumber.runtime.formatter.NullSummaryPrinter"))); + assertThat(plugins.getPlugins(), not(hasItem(plugin("cucumber.runtime.formatter.DefaultSummaryPrinter")))); } @Test @@ -148,39 +175,39 @@ public void assigns_strict_short() { @Test public void default_strict() { RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere")); - assertFalse(options.isStrict()); + assertThat(options.isStrict(), is(false)); } @Test public void assigns_wip() { RuntimeOptions options = new RuntimeOptions(asList("--wip", "--glue", "somewhere")); - assertTrue(options.isWip()); + assertThat(options.isWip(), is(true)); } @Test public void assigns_wip_short() { RuntimeOptions options = new RuntimeOptions(asList("-w", "--glue", "somewhere")); - assertTrue(options.isWip()); + assertThat(options.isWip(), is(true)); } @Test public void default_wip() { RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere")); - assertFalse(options.isWip()); + assertThat(options.isWip(), is(false)); } @Test public void name_without_spaces_is_preserved() { RuntimeOptions options = new RuntimeOptions(asList("--name", "someName")); Pattern actualPattern = options.getNameFilters().iterator().next(); - assertEquals("someName", actualPattern.pattern()); + assertThat(actualPattern.pattern(), is("someName")); } @Test public void name_with_spaces_is_preserved() { RuntimeOptions options = new RuntimeOptions(asList("--name", "some Name")); Pattern actualPattern = options.getNameFilters().iterator().next(); - assertEquals("some Name", actualPattern.pattern()); + assertThat(actualPattern.pattern(), is("some Name")); } @Test @@ -188,107 +215,108 @@ public void ensure_name_with_spaces_works_with_cucumber_options() { properties.setProperty("cucumber.options", "--name 'some Name'"); RuntimeOptions options = new RuntimeOptions(new Env(properties), Collections.emptyList()); Pattern actualPattern = options.getNameFilters().iterator().next(); - assertEquals("some Name", actualPattern.pattern()); + assertThat(actualPattern.pattern(), is("some Name")); } @Test public void ensure_name_with_spaces_works_with_args() { RuntimeOptions options = new RuntimeOptions("--name 'some Name'"); Pattern actualPattern = options.getNameFilters().iterator().next(); - assertEquals("some Name", actualPattern.pattern()); + assertThat(actualPattern.pattern(), is("some Name")); } @Test public void assigns_single_junit_option() { - RuntimeOptions options = new RuntimeOptions(asList("--junit,option")); - assertEquals(asList("option"), options.getJunitOptions()); + RuntimeOptions options = new RuntimeOptions("--junit,option"); + assertThat(options.getJunitOptions(), contains("option")); } @Test public void assigns_multiple_junit_options() { - RuntimeOptions options = new RuntimeOptions(asList("--junit,option1,option2=value")); - assertEquals(asList("option1", "option2=value"), options.getJunitOptions()); + RuntimeOptions options = new RuntimeOptions("--junit,option1,option2=value"); + assertThat(options.getJunitOptions(), contains("option1", "option2=value")); } @Test public void clobbers_junit_options_from_cli_if_junit_options_specified_in_cucumber_options_property() { properties.setProperty("cucumber.options", "--junit,option_from_property"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--junit,option_to_be_clobbered")); - assertEquals(asList("option_from_property"), runtimeOptions.getJunitOptions()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--junit,option_to_be_clobbered")); + assertThat(options.getJunitOptions(), contains("option_from_property")); } @Test public void overrides_options_with_system_properties_without_clobbering_non_overridden_ones() { properties.setProperty("cucumber.options", "--glue lookatme this_clobbers_feature_paths"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--strict", "--glue", "somewhere", "somewhere_else")); - assertEquals(asList("this_clobbers_feature_paths"), options.getFeaturePaths()); - assertEquals(asList("lookatme"), options.getGlue()); + assertThat(options.getFeaturePaths(), contains(uri("file:this_clobbers_feature_paths"))); + assertThat(options.getGlue(), contains("lookatme")); assertTrue(options.isStrict()); } @Test public void ensure_cli_glue_is_preserved_when_cucumber_options_property_defined() { properties.setProperty("cucumber.options", "--tags @foo"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--glue", "somewhere")); - assertEquals(asList("somewhere"), runtimeOptions.getGlue()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--glue", "somewhere")); + assertThat(options.getGlue(), contains("somewhere")); } @Test public void clobbers_filters_from_cli_if_filters_specified_in_cucumber_options_property() { properties.setProperty("cucumber.options", "--tags @clobber_with_this"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@should_be_clobbered")); - assertEquals(asList("@clobber_with_this"), runtimeOptions.getTagFilters()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--tags", "@should_be_clobbered")); + assertThat(options.getTagFilters(), contains("@clobber_with_this")); } @Test public void clobbers_tag_and_name_filters_from_cli_if_line_filters_specified_in_cucumber_options_property() { properties.setProperty("cucumber.options", "path/file.feature:3"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@should_be_clobbered", "--name", "should_be_clobbered")); - assertEquals(Collections.emptyList(), runtimeOptions.getTagFilters()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--tags", "@should_be_clobbered", "--name", "should_be_clobbered")); + assertThat(options.getTagFilters(), emptyCollectionOf(String.class)); } @Test public void clobbers_tag_and_name_filters_from_cli_if_rerun_file_specified_in_cucumber_options_property() { properties.setProperty("cucumber.options", "@src/test/resources/cucumber/runtime/runtime-options-rerun.txt"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@should_be_clobbered", "--name", "should_be_clobbered")); - assertEquals(Collections.emptyList(), runtimeOptions.getTagFilters()); - assertEquals(singletonMap("this/should/be/rerun.feature", singletonList(12L)), runtimeOptions.getLineFilters()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--tags", "@should_be_clobbered", "--name", "should_be_clobbered")); + assertThat(options.getTagFilters(), emptyCollectionOf(String.class)); + assertThat(options.getLineFilters(), hasEntry(uri("file:this/should/be/rerun.feature"), singleton(12))); } @Test public void preserves_filters_from_cli_if_filters_not_specified_in_cucumber_options_property() { properties.setProperty("cucumber.options", "--strict"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@keep_this")); - assertEquals(asList("@keep_this"), runtimeOptions.getTagFilters()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--tags", "@keep_this")); + assertThat(options.getTagFilters(), contains("@keep_this")); } @Test public void clobbers_features_from_cli_if_features_specified_in_cucumber_options_property() { properties.setProperty("cucumber.options", "new newer"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("old", "older")); - assertEquals(asList("new", "newer"), runtimeOptions.getFeaturePaths()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("old", "older")); + assertThat(options.getFeaturePaths(), contains(uri("file:new"), uri("file:newer"))); } @Test public void strips_lines_from_features_from_cli_if_filters_are_specified_in_cucumber_options_property() { properties.setProperty("cucumber.options", "--tags @Tag"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("path/file.feature:3")); - assertEquals(asList("path/file.feature"), runtimeOptions.getFeaturePaths()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("path/file.feature:3")); + assertThat(options.getFeaturePaths(), contains(uri("file:path/file.feature"))); } @Test public void preserves_features_from_cli_if_features_not_specified_in_cucumber_options_property() { properties.setProperty("cucumber.options", "--plugin pretty"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("old", "older")); - assertEquals(asList("old", "older"), runtimeOptions.getFeaturePaths()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("old", "older")); + assertThat(options.getFeaturePaths(), contains(uri("file:old"), uri("file:older"))); + } @Test public void clobbers_line_filters_from_cli_if_features_specified_in_cucumber_options_property() { properties.setProperty("cucumber.options", "new newer"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--tags", "@keep_this", "path/file1.feature:1")); - assertEquals(asList("new", "newer"), runtimeOptions.getFeaturePaths()); - assertEquals(asList("@keep_this"), runtimeOptions.getTagFilters()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--tags", "@keep_this", "path/file1.feature:1")); + assertThat(options.getFeaturePaths(), contains(uri("file:new"), uri("file:newer"))); + assertThat(options.getTagFilters(), contains("@keep_this")); } @Test @@ -296,8 +324,8 @@ public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucum properties.setProperty("cucumber.options", "--plugin pretty"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:some/dir", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.PrettyFormatter"); - assertPluginNotExists(plugins.getPlugins(), "cucumber.runtime.formatter.HTMLFormatter"); + assertThat(plugins.getPlugins(), hasItem(plugin("cucumber.runtime.formatter.PrettyFormatter"))); + assertThat(plugins.getPlugins(), not(hasItem(plugin("cucumber.runtime.formatter.HTMLFormatter")))); } @Test @@ -305,8 +333,8 @@ public void adds_to_formatter_plugins_with_add_plugin_option() { properties.setProperty("cucumber.options", "--add-plugin pretty"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:some/dir", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.HTMLFormatter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.PrettyFormatter"); + assertThat(plugins.getPlugins(), hasItem(plugin("cucumber.runtime.formatter.HTMLFormatter"))); + assertThat(plugins.getPlugins(), hasItem(plugin("cucumber.runtime.formatter.PrettyFormatter"))); } @Test @@ -314,8 +342,8 @@ public void clobbers_summary_plugins_from_cli_if_summary_printer_specified_in_cu properties.setProperty("cucumber.options", "--plugin default_summary"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "null_summary", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); - assertPluginNotExists(plugins.getPlugins(), "cucumber.runtime.formatter.NullSummaryPrinter"); + assertThat(plugins.getPlugins(), hasItem(plugin("cucumber.runtime.formatter.DefaultSummaryPrinter"))); + assertThat(plugins.getPlugins(), not(hasItem(plugin("cucumber.runtime.formatter.NullSummaryPrinter")))); } @Test @@ -323,8 +351,8 @@ public void adds_to_summary_plugins_with_add_plugin_option() { properties.setProperty("cucumber.options", "--add-plugin default_summary"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "null_summary", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.NullSummaryPrinter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + assertThat(plugins.getPlugins(), hasItem(plugin("cucumber.runtime.formatter.NullSummaryPrinter"))); + assertThat(plugins.getPlugins(), hasItem(plugin("cucumber.runtime.formatter.DefaultSummaryPrinter"))); } @Test @@ -332,37 +360,33 @@ public void does_not_clobber_plugins_of_different_type_when_specifying_plugins_i properties.setProperty("cucumber.options", "--plugin default_summary"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "pretty", "--glue", "somewhere")); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); -// assertPluginExists(options.getPlugins(), "cucumber.runtime.formatter.CucumberPrettyFormatter"); - assertPluginExists(plugins.getPlugins(), "cucumber.runtime.formatter.DefaultSummaryPrinter"); + assertThat(plugins.getPlugins(), hasItem(plugin("cucumber.runtime.formatter.PrettyFormatter"))); + assertThat(plugins.getPlugins(), hasItem(plugin("cucumber.runtime.formatter.DefaultSummaryPrinter"))); } @Test public void allows_removal_of_strict_in_cucumber_options_property() { properties.setProperty("cucumber.options", "--no-strict"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), asList("--strict")); - assertFalse(runtimeOptions.isStrict()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--strict")); + assertThat(options.isStrict(), is(false)); } @Test public void fail_on_unsupported_options() { - try { - new RuntimeOptions(asList("-concreteUnsupportedOption", "somewhere", "somewhere_else")); - fail(); - } catch (CucumberException e) { - assertEquals("Unknown option: -concreteUnsupportedOption", e.getMessage()); - } + expectedException.expectMessage("Unknown option: -concreteUnsupportedOption"); + new RuntimeOptions(asList("-concreteUnsupportedOption", "somewhere", "somewhere_else")); } @Test public void threads_default_1() { RuntimeOptions options = new RuntimeOptions(Collections.emptyList()); - assertEquals(1, options.getThreads()); + assertThat(options.getThreads(), is(1)); } @Test public void ensure_threads_param_is_used() { RuntimeOptions options = new RuntimeOptions(asList("--threads", "10")); - assertEquals(10, options.getThreads()); + assertThat(options.getThreads(), is(10)); } @Test @@ -372,217 +396,180 @@ public void ensure_less_than_1_thread_is_not_allowed() { new RuntimeOptions(asList("--threads", "0")); } - public static final class AwareFormatter implements StrictAware, ColorAware, EventListener { - - private boolean strict; - private boolean monochrome; - - @Override - public void setStrict(boolean strict) { - this.strict = strict; - } - - private boolean isStrict() { - return strict; - } - - @Override - public void setMonochrome(boolean monochrome) { - this.monochrome = monochrome; - } - - boolean isMonochrome() { - return monochrome; - } - - @Override - public void setEventPublisher(EventPublisher publisher) { - - } - } - @Test - public void set_monochrome_on_color_aware_formatters() throws Exception { + public void set_monochrome_on_color_aware_formatters() { RuntimeOptions options = new RuntimeOptions(new Env(), asList("--monochrome", "--plugin", AwareFormatter.class.getName())); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); - plugins.getPlugins(); AwareFormatter formatter = (AwareFormatter) plugins.getPlugins().get(0); - assertTrue(formatter.isMonochrome()); + assertThat(formatter.isMonochrome(), is(true)); } @Test - public void set_strict_on_strict_aware_formatters() throws Exception { + public void set_strict_on_strict_aware_formatters() { RuntimeOptions options = new RuntimeOptions(new Env(), asList("--strict", "--plugin", AwareFormatter.class.getName())); Plugins plugins = new Plugins(getClass().getClassLoader(), new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); AwareFormatter formatter = (AwareFormatter) plugins.getPlugins().get(0); - assertTrue(formatter.isStrict()); + assertThat(formatter.isStrict(), is(true)); + } @Test public void ensure_default_snippet_type_is_underscore() { - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), Collections.emptyList()); - assertEquals(SnippetType.UNDERSCORE, runtimeOptions.getSnippetType()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), Collections.emptyList()); + assertThat(options.getSnippetType(), is(SnippetType.UNDERSCORE)); } @Test public void set_snippet_type() { properties.setProperty("cucumber.options", "--snippets camelcase"); - RuntimeOptions runtimeOptions = new RuntimeOptions(new Env(properties), Collections.emptyList()); - assertEquals(SnippetType.CAMELCASE, runtimeOptions.getSnippetType()); + RuntimeOptions options = new RuntimeOptions(new Env(properties), Collections.emptyList()); + assertThat(options.getSnippetType(), is(SnippetType.CAMELCASE)); } @Test public void loads_no_features_when_rerun_file_contains_carriage_return() throws Exception { - String rerunPath = "path/rerun.txt"; + String rerunPath = "file:path/rerun.txt"; String rerunFile = "\r"; - mockFileResource(resourceLoader, rerunPath, null, rerunFile); - RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); - assertEquals(emptyList(), runtimeOptions.getFeaturePaths()); + mockFileResource(resourceLoader, rerunPath, rerunFile); + RuntimeOptions options = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); + assertThat(options.getFeaturePaths(), emptyCollectionOf(URI.class)); } @Test public void loads_features_specified_in_rerun_file() throws Exception { - String featurePath1 = "path/bar.feature"; - String rerunPath = "path/rerun.txt"; - String rerunFile = featurePath1 + ":2\n"; - mockFileResource(resourceLoader, rerunPath, null, rerunFile); + String rerunPath = "file:path/rerun.txt"; + String rerunFile = "file:path/bar.feature:2\n"; + mockFileResource(resourceLoader, rerunPath, rerunFile); - RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); + RuntimeOptions options = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); - assertEquals(singletonList(featurePath1), runtimeOptions.getFeaturePaths()); - assertEquals(singletonMap(featurePath1, singletonList(2L)), runtimeOptions.getLineFilters()); + assertThat(options.getFeaturePaths(), contains(uri("file:path/bar.feature"))); + assertThat(options.getLineFilters(), hasEntry(uri("file:path/bar.feature"), singleton(2))); } @Test public void loads_no_features_when_rerun_file_is_empty() throws Exception { - String rerunPath = "path/rerun.txt"; + String rerunPath = "file:path/rerun.txt"; String rerunFile = ""; - mockFileResource(resourceLoader, rerunPath, null, rerunFile); + mockFileResource(resourceLoader, rerunPath, rerunFile); - RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); + RuntimeOptions options = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); - assertEquals(emptyList(), runtimeOptions.getFeaturePaths()); + assertThat(options.getFeaturePaths(), emptyCollectionOf(URI.class)); } @Test public void loads_no_features_when_rerun_file_contains_new_line() throws Exception { - String rerunPath = "path/rerun.txt"; + String rerunPath = "file:path/rerun.txt"; String rerunFile = "\n"; - mockFileResource(resourceLoader, rerunPath, null, rerunFile); + mockFileResource(resourceLoader, rerunPath, rerunFile); - RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); + RuntimeOptions options = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); - assertEquals(emptyList(), runtimeOptions.getFeaturePaths()); + assertThat(options.getFeaturePaths(), emptyCollectionOf(URI.class)); } @Test public void loads_no_features_when_rerun_file_contains_new_line_and_carriage_return() throws Exception { - String rerunPath = "path/rerun.txt"; + String rerunPath = "file:path/rerun.txt"; String rerunFile = "\r\n"; - mockFileResource(resourceLoader, rerunPath, null, rerunFile); + mockFileResource(resourceLoader, rerunPath, rerunFile); - RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); + RuntimeOptions options = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); - assertEquals(emptyList(), runtimeOptions.getFeaturePaths()); + assertThat(options.getFeaturePaths(), emptyCollectionOf(URI.class)); } @Test public void last_new_line_is_optinal() throws Exception { - String featurePath1 = "path/bar.feature"; - String rerunPath = "path/rerun.txt"; - String rerunFile = featurePath1 + ":2"; - mockFileResource(resourceLoader, rerunPath, null, rerunFile); - - RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); + String rerunPath = "file:path/rerun.txt"; + String rerunFile = "file:path/bar.feature" + ":2"; + mockFileResource(resourceLoader, rerunPath, rerunFile); - assertEquals(singletonList(featurePath1), runtimeOptions.getFeaturePaths()); - assertEquals(singletonMap(featurePath1, singletonList(2L)), runtimeOptions.getLineFilters()); + RuntimeOptions options = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); + assertThat(options.getFeaturePaths(), contains(uri("file:path/bar.feature"))); + assertThat(options.getLineFilters(), hasEntry(uri("file:path/bar.feature"), singleton(2))); } @Test public void loads_features_specified_in_rerun_file_from_classpath_when_not_in_file_system() throws Exception { String featurePath = "classpath:path/bar.feature"; - String rerunPath = "path/rerun.txt"; + URI featureUri = uri(featurePath); + String rerunPath = "file:path/rerun.txt"; String rerunFile = featurePath + ":2"; - mockFileResource(resourceLoader, rerunPath, null, rerunFile); + mockFileResource(resourceLoader, rerunPath, rerunFile); - RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); + RuntimeOptions options = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); - assertEquals(singletonList(featurePath), runtimeOptions.getFeaturePaths()); - assertEquals(singletonMap("path/bar.feature", singletonList(2L)), runtimeOptions.getLineFilters()); + assertThat(options.getFeaturePaths(), contains(featureUri)); + assertThat(options.getLineFilters(), hasEntry(featureUri, singleton(2))); } @Test public void understands_whitespace_in_rerun_filepath() throws Exception { String featurePath1 = "/home/users/mp/My Documents/tests/bar.feature"; - String rerunPath = "rerun.txt"; + String rerunPath = "file:rerun.txt"; String rerunFile = featurePath1 + ":2\n"; - mockFileResource(resourceLoader, rerunPath, null, rerunFile); + mockFileResource(resourceLoader, rerunPath, rerunFile); - RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); - assertEquals(singletonList(featurePath1), runtimeOptions.getFeaturePaths()); - assertEquals(singletonMap(featurePath1, singletonList(2L)), runtimeOptions.getLineFilters()); + RuntimeOptions options = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); + assertThat(options.getFeaturePaths(), contains(uri("file:/home/users/mp/My%20Documents/tests/bar.feature"))); + assertThat(options.getLineFilters(), hasEntry(uri("file:/home/users/mp/My%20Documents/tests/bar.feature"), singleton(2))); } - @Test public void understands_rerun_files_separated_by_with_whitespace() throws Exception { - String featurePath1 = "/home/users/mp/My Documents/tests/bar.feature"; - String featurePath2 = "/home/users/mp/My Documents/tests/foo.feature"; - String rerunPath = "path/rerun.txt"; + String featurePath1 = "file:/home/users/mp/My%20Documents/tests/bar.feature"; + String featurePath2 = "file:/home/users/mp/My%20Documents/tests/foo.feature"; + String rerunPath = "file:path/rerun.txt"; String rerunFile = featurePath1 + ":2 " + featurePath2 + ":4"; - mockFileResource(resourceLoader, rerunPath, null, rerunFile); + mockFileResource(resourceLoader, rerunPath, rerunFile); + + RuntimeOptions options = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); - RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); + assertThat(options.getFeaturePaths(), is(asList(uri(featurePath1), uri(featurePath2)))); - assertEquals(asList(featurePath1, featurePath2), runtimeOptions.getFeaturePaths()); } @Test public void understands_rerun_files_without_separation_in_rerun_filepath() throws Exception { - String featurePath1 = "/home/users/mp/My Documents/tests/bar.feature"; - String featurePath2 = "/home/users/mp/My Documents/tests/foo.feature"; - String rerunPath = "path/rerun.txt"; + String featurePath1 = "file:/home/users/mp/My%20Documents/tests/bar.feature"; + String featurePath2 = "file:/home/users/mp/My%20Documents/tests/foo.feature"; + String rerunPath = "file:path/rerun.txt"; String rerunFile = featurePath1 + ":2" + featurePath2 + ":4"; - mockFileResource(resourceLoader, rerunPath, null, rerunFile); - - RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); + mockFileResource(resourceLoader, rerunPath, rerunFile); - assertEquals(asList(featurePath1, featurePath2), runtimeOptions.getFeaturePaths()); + RuntimeOptions options = new RuntimeOptions(resourceLoader, new Env(properties), singletonList("@" + rerunPath)); + assertThat(options.getFeaturePaths(), contains(uri(featurePath1), uri(featurePath2))); } - @Test - public void converts_windows_path_to_forward_slash() throws IOException { - String featurePath = "path" + '\\' + "foo.feature"; + public static final class AwareFormatter implements StrictAware, ColorAware, EventListener { - RuntimeOptions runtimeOptions = new RuntimeOptions('\\', resourceLoader, new Env(properties), singletonList(featurePath)); + private boolean strict; + private boolean monochrome; - assertEquals(singletonList("path/foo.feature"), runtimeOptions.getFeaturePaths()); - } + private boolean isStrict() { + return strict; + } - private void mockFileResource(ResourceLoader resourceLoader, String featurePath, String extension, String feature) - throws IOException { - Resource resource = mock(Resource.class); - when(resource.getPath()).thenReturn(featurePath); - when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(feature.getBytes(UTF_8))); - when(resourceLoader.resources(featurePath, extension)).thenReturn(singletonList(resource)); - } + @Override + public void setStrict(boolean strict) { + this.strict = strict; + } - private void assertPluginExists(List plugins, String pluginName) { - assertTrue(pluginName + " not found among the plugins", pluginExists(plugins, pluginName)); - } + boolean isMonochrome() { + return monochrome; + } - private void assertPluginNotExists(List plugins, String pluginName) { - assertFalse(pluginName + " found among the plugins", pluginExists(plugins, pluginName)); - } + @Override + public void setMonochrome(boolean monochrome) { + this.monochrome = monochrome; + } + + @Override + public void setEventPublisher(EventPublisher publisher) { - private boolean pluginExists(List plugins, String pluginName) { - boolean found = false; - for (Plugin plugin : plugins) { - if (plugin.getClass().getName().equals(pluginName)) { - found = true; - } } - return found; } + } diff --git a/core/src/test/java/cucumber/runtime/RuntimeTest.java b/core/src/test/java/cucumber/runtime/RuntimeTest.java index 0083c7ad67..2e7911cc3f 100644 --- a/core/src/test/java/cucumber/runtime/RuntimeTest.java +++ b/core/src/test/java/cucumber/runtime/RuntimeTest.java @@ -28,6 +28,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; +import java.net.URI; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -41,6 +42,7 @@ import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; @@ -134,7 +136,7 @@ public List get() { " \"description\": \"\",\n" + " \"id\": \"feature-name\",\n" + " \"keyword\": \"Feature\",\n" + - " \"uri\": \"test.feature\",\n" + + " \"uri\": \"file:test.feature\",\n" + " \"tags\": []\n" + " }\n" + "]"; @@ -458,7 +460,7 @@ private String runFeatureWithFormatterSpy(CucumberFeature feature, MapemptyList()); + when(resourceLoader.resources(any(URI.class), eq(".feature"))).thenReturn(Collections.emptyList()); return resourceLoader; } diff --git a/core/src/test/java/cucumber/runtime/UndefinedStepsTrackerTest.java b/core/src/test/java/cucumber/runtime/UndefinedStepsTrackerTest.java index 67b72b4e6b..b37492d282 100644 --- a/core/src/test/java/cucumber/runtime/UndefinedStepsTrackerTest.java +++ b/core/src/test/java/cucumber/runtime/UndefinedStepsTrackerTest.java @@ -51,7 +51,7 @@ public void uses_given_when_then_keywords() throws IOException { " Given A\n" + " Then B\n"); feature.sendTestSourceRead(bus); - tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(4)), asList("**KEYWORD** ^B$")); + tracker.handleSnippetsSuggested(uri("file:path/test.feature"), locations(line(4)), asList("**KEYWORD** ^B$")); assertEquals("[Then ^B$]", tracker.getSnippets().toString()); } @@ -67,7 +67,7 @@ public void converts_and_to_previous_step_keyword() throws IOException { " And B\n" + " But C\n"); feature.sendTestSourceRead(bus); - tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(5)), asList("**KEYWORD** ^C$")); + tracker.handleSnippetsSuggested(uri("file:path/test.feature"), locations(line(5)), asList("**KEYWORD** ^C$")); assertEquals("[When ^C$]", tracker.getSnippets().toString()); } @@ -84,7 +84,7 @@ public void backtrack_into_background_to_find_step_keyword() throws IOException " And B\n" + " But C\n"); feature.sendTestSourceRead(bus); - tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(5)), asList("**KEYWORD** ^C$")); + tracker.handleSnippetsSuggested(uri("file:path/test.feature"), locations(line(5)), asList("**KEYWORD** ^C$")); assertEquals("[When ^C$]", tracker.getSnippets().toString()); } @@ -100,7 +100,7 @@ public void doesnt_try_to_use_star_keyword() throws IOException { " And B\n" + " * C\n"); feature.sendTestSourceRead(bus); - tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(5)), asList("**KEYWORD** ^C$")); + tracker.handleSnippetsSuggested(uri("file:path/test.feature"), locations(line(5)), asList("**KEYWORD** ^C$")); assertEquals("[When ^C$]", tracker.getSnippets().toString()); } @@ -129,7 +129,7 @@ public void snippets_are_generated_for_correct_locale() throws Exception { " Сценарий: \n" + " * Б\n"); feature.sendTestSourceRead(bus); - tracker.handleSnippetsSuggested(uri("path/test.feature"), locations(line(4)), asList("**KEYWORD** ^Б$")); + tracker.handleSnippetsSuggested(uri("file:path/test.feature"), locations(line(4)), asList("**KEYWORD** ^Б$")); assertEquals("[ДопуÑтим ^Б$]", tracker.getSnippets().toString()); } diff --git a/core/src/test/java/cucumber/runtime/filter/LinePredicateTest.java b/core/src/test/java/cucumber/runtime/filter/LinePredicateTest.java index b989b2e73e..a57bb1117f 100644 --- a/core/src/test/java/cucumber/runtime/filter/LinePredicateTest.java +++ b/core/src/test/java/cucumber/runtime/filter/LinePredicateTest.java @@ -7,6 +7,7 @@ import gherkin.pickles.PickleTag; import org.junit.Test; +import java.net.URI; import java.util.Collections; import java.util.List; @@ -27,7 +28,7 @@ public void matches_pickles_from_files_not_in_the_predicate_map() { // results in only line predicates only for another_path/file.feature, // but all pickles from path/file.feature shall also be executed. PickleEvent pickleEvent = createPickleEventWithLocations("path/file.feature", asList(pickleLocation(4))); - LinePredicate predicate = new LinePredicate(singletonMap("another_path/file.feature", asList(8L))); + LinePredicate predicate = new LinePredicate(singletonMap(URI.create("another_path/file.feature"), asList(8))); assertTrue(predicate.apply(pickleEvent)); } @@ -35,7 +36,7 @@ public void matches_pickles_from_files_not_in_the_predicate_map() { @Test public void matches_pickles_for_any_line_in_predicate() { PickleEvent pickleEvent = createPickleEventWithLocations("path/file.feature", asList(pickleLocation(8))); - LinePredicate predicate = new LinePredicate(singletonMap("path/file.feature", asList(4L, 8L))); + LinePredicate predicate = new LinePredicate(singletonMap(URI.create("path/file.feature"), asList(4, 8))); assertTrue(predicate.apply(pickleEvent)); } @@ -43,7 +44,7 @@ public void matches_pickles_for_any_line_in_predicate() { @Test public void matches_pickles_on_any_location_of_the_pickle() { PickleEvent pickleEvent = createPickleEventWithLocations("path/file.feature", asList(pickleLocation(4), pickleLocation(8))); - LinePredicate predicate = new LinePredicate(singletonMap("path/file.feature", asList(8L))); + LinePredicate predicate = new LinePredicate(singletonMap(URI.create("path/file.feature"), asList(8))); assertTrue(predicate.apply(pickleEvent)); } @@ -51,7 +52,7 @@ public void matches_pickles_on_any_location_of_the_pickle() { @Test public void does_not_matches_pickles_not_on_any_line_of_the_predicate() { PickleEvent pickleEvent = createPickleEventWithLocations("path/file.feature", asList(pickleLocation(4), pickleLocation(8))); - LinePredicate predicate = new LinePredicate(singletonMap("path/file.feature", asList(10L))); + LinePredicate predicate = new LinePredicate(singletonMap(URI.create("path/file.feature"), asList(10))); assertFalse(predicate.apply(pickleEvent)); } diff --git a/core/src/test/java/cucumber/runtime/formatter/HTMLFormatterTest.java b/core/src/test/java/cucumber/runtime/formatter/HTMLFormatterTest.java index 175f211edf..a9ba50901d 100644 --- a/core/src/test/java/cucumber/runtime/formatter/HTMLFormatterTest.java +++ b/core/src/test/java/cucumber/runtime/formatter/HTMLFormatterTest.java @@ -67,7 +67,7 @@ public void writes_valid_report_js() throws Throwable { writeReport(); String reportJs = FixJava.readReader(new InputStreamReader(new URL(outputDir, "report.js").openStream(), "UTF-8")); assertJsFunctionCallSequence(asList("" + - "formatter.uri(\"some\\\\windows\\\\path\\\\some.feature\");\n", + "formatter.uri(\"file:some/path/some.feature\");\n", "formatter.feature({\n" + " \"name\": \"\",\n" + " \"description\": \"\",\n" + @@ -103,7 +103,7 @@ public void writes_valid_report_js() throws Throwable { public void includes_uri() throws Throwable { writeReport(); String reportJs = FixJava.readReader(new InputStreamReader(new URL(outputDir, "report.js").openStream(), "UTF-8")); - assertContains("formatter.uri(\"some\\\\windows\\\\path\\\\some.feature\");", reportJs); + assertContains("formatter.uri(\"file:some/path/some.feature\");", reportJs); } @Test @@ -131,7 +131,7 @@ public void should_handle_a_single_scenario() throws Throwable { String formatterOutput = runFeaturesWithFormatter(); assertJsFunctionCallSequence(asList("" + - "formatter.uri(\"path/test.feature\");\n", "" + + "formatter.uri(\"file:path/test.feature\");\n", "" + "formatter.feature({\n" + " \"description\": \"\",\n" + " \"name\": \"feature name\",\n" + @@ -273,7 +273,7 @@ public void should_handle_scenario_outline() throws Throwable { String formatterOutput = runFeaturesWithFormatter(); assertJsFunctionCallSequence(asList("" + - "formatter.uri(\"path/test.feature\");\n", "" + + "formatter.uri(\"file:path/test.feature\");\n", "" + "formatter.feature({\n" + " \"description\": \"\",\n" + " \"name\": \"feature name\",\n" + @@ -728,7 +728,7 @@ private void assertContains(String substring, String string) { private void runFeaturesWithFormatter(URL outputDir) throws Throwable { final HTMLFormatter f = new HTMLFormatter(outputDir); - CucumberFeature feature = feature("some\\windows\\path\\some.feature", "" + + CucumberFeature feature = feature("some/path/some.feature", "" + "Feature:\n" + " Scenario: some cukes\n" + " Given first step\n"); diff --git a/core/src/test/java/cucumber/runtime/formatter/JSONFormatterTest.java b/core/src/test/java/cucumber/runtime/formatter/JSONFormatterTest.java index 338930b938..832170f30f 100755 --- a/core/src/test/java/cucumber/runtime/formatter/JSONFormatterTest.java +++ b/core/src/test/java/cucumber/runtime/formatter/JSONFormatterTest.java @@ -49,7 +49,7 @@ public class JSONFormatterTest { @Test public void featureWithOutlineTest() { - String actual = runFeaturesWithFormatter(asList("cucumber/runtime/formatter/JSONPrettyFormatterTest.feature")); + String actual = runFeaturesWithFormatter(asList("classpath:cucumber/runtime/formatter/JSONPrettyFormatterTest.feature")); String expected = new Scanner(getClass().getResourceAsStream("JSONPrettyFormatterTest.json"), "UTF-8").useDelimiter("\\A").next(); assertThat(actual, sameJSONAs(expected)); @@ -58,7 +58,7 @@ public void featureWithOutlineTest() { @Test public void featureWithOutlineTestParallel() throws Exception { - String actual = runFeaturesWithFormatterInParallel(asList("cucumber/runtime/formatter/JSONPrettyFormatterTest.feature")); + String actual = runFeaturesWithFormatterInParallel(asList("classpath:cucumber/runtime/formatter/JSONPrettyFormatterTest.feature")); String expected = new Scanner(getClass().getResourceAsStream("JSONPrettyFormatterTest.json"), "UTF-8").useDelimiter("\\A").next(); assertThat(actual, sameJSONAs(expected)); @@ -80,7 +80,7 @@ public void should_format_scenario_with_an_undefined_step() { "[\n" + " {\n" + " \"id\": \"banana-party\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Banana party\",\n" + " \"line\": 1,\n" + @@ -130,7 +130,7 @@ public void should_format_scenario_with_a_passed_step() { "[\n" + " {\n" + " \"id\": \"banana-party\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Banana party\",\n" + " \"line\": 1,\n" + @@ -183,7 +183,7 @@ public void should_format_scenario_with_a_failed_step() { "[\n" + " {\n" + " \"id\": \"banana-party\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Banana party\",\n" + " \"line\": 1,\n" + @@ -240,7 +240,7 @@ public void should_format_scenario_outline_with_one_example() { "[\n" + " {\n" + " \"id\": \"fruit-party\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Fruit party\",\n" + " \"line\": 1,\n" + @@ -303,7 +303,7 @@ public void should_format_feature_with_background() { "[\n" + " {\n" + " \"id\": \"banana-party\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Banana party\",\n" + " \"line\": 1,\n" + @@ -460,7 +460,7 @@ public void should_format_feature_and_scenario_with_tags() { " \"description\": \"\",\n" + " \"id\": \"banana-party\",\n" + " \"keyword\": \"Feature\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"tags\": [\n" + " {\n" + " \"name\": \"@Party\",\n" + @@ -506,7 +506,7 @@ public void should_format_scenario_with_hooks() { "[\n" + " {\n" + " \"id\": \"banana-party\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Banana party\",\n" + " \"line\": 1,\n" + @@ -565,7 +565,7 @@ public void should_format_scenario_with_hooks() { @Test public void should_add_step_hooks_to_step() { - CucumberFeature feature = TestHelper.feature("path/test.feature", "" + + CucumberFeature feature = TestHelper.feature("file:path/test.feature", "" + "Feature: Banana party\n" + "\n" + " Scenario: Monkey eats bananas\n" + @@ -692,7 +692,7 @@ public void should_add_step_hooks_to_step() { " \"description\": \"\",\n" + " \"id\": \"banana-party\",\n" + " \"keyword\": \"Feature\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"tags\": []\n" + " }\n" + "]"; @@ -720,7 +720,7 @@ public void should_handle_write_from_a_hook() { "[\n" + " {\n" + " \"id\": \"banana-party\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Banana party\",\n" + " \"line\": 1,\n" + @@ -790,7 +790,7 @@ public void should_handle_embed_from_a_hook() { "[\n" + " {\n" + " \"id\": \"banana-party\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Banana party\",\n" + " \"line\": 1,\n" + @@ -863,7 +863,7 @@ public void should_format_scenario_with_a_step_with_a_doc_string() { "[\n" + " {\n" + " \"id\": \"banana-party\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Banana party\",\n" + " \"line\": 1,\n" + @@ -923,7 +923,7 @@ public void should_format_scenario_with_a_step_with_a_doc_string_and_content_typ "[\n" + " {\n" + " \"id\": \"banana-party\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Banana party\",\n" + " \"line\": 1,\n" + @@ -983,7 +983,7 @@ public void should_format_scenario_with_a_step_with_a_data_table() { "[\n" + " {\n" + " \"id\": \"banana-party\",\n" + - " \"uri\": \"path/test.feature\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Banana party\",\n" + " \"line\": 1,\n" + @@ -1034,7 +1034,7 @@ public void should_format_scenario_with_a_step_with_a_data_table() { @Test public void should_handle_several_features() { - CucumberFeature feature1 = TestHelper.feature("path/test1.feature", "" + + CucumberFeature feature1 = TestHelper.feature("file:path/test1.feature", "" + "Feature: Banana party\n" + "\n" + " Scenario: Monkey eats bananas\n" + @@ -1058,7 +1058,7 @@ public void should_handle_several_features() { "[\n" + " {\n" + " \"id\": \"banana-party\",\n" + - " \"uri\": \"path/test1.feature\",\n" + + " \"uri\": \"file:path/test1.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Banana party\",\n" + " \"line\": 1,\n" + @@ -1091,7 +1091,7 @@ public void should_handle_several_features() { " },\n" + " {\n" + " \"id\": \"orange-party\",\n" + - " \"uri\": \"path/test2.feature\",\n" + + " \"uri\": \"file:path/test2.feature\",\n" + " \"keyword\": \"Feature\",\n" + " \"name\": \"Orange party\",\n" + " \"line\": 1,\n" + diff --git a/core/src/test/java/cucumber/runtime/formatter/JUnitFormatterTest.java b/core/src/test/java/cucumber/runtime/formatter/JUnitFormatterTest.java index 7892e5c0ce..429bb97f3d 100644 --- a/core/src/test/java/cucumber/runtime/formatter/JUnitFormatterTest.java +++ b/core/src/test/java/cucumber/runtime/formatter/JUnitFormatterTest.java @@ -48,26 +48,26 @@ public class JUnitFormatterTest { @Test public void featureSimpleTest() throws Exception { - File report = runFeaturesWithJunitFormatter(asList("cucumber/runtime/formatter/JUnitFormatterTest_1.feature")); + File report = runFeaturesWithJunitFormatter(asList("classpath:cucumber/runtime/formatter/JUnitFormatterTest_1.feature")); assertXmlEqual("cucumber/runtime/formatter/JUnitFormatterTest_1.report.xml", report); } @Test public void featureWithBackgroundTest() throws Exception { - File report = runFeaturesWithJunitFormatter(asList("cucumber/runtime/formatter/JUnitFormatterTest_2.feature")); + File report = runFeaturesWithJunitFormatter(asList("classpath:cucumber/runtime/formatter/JUnitFormatterTest_2.feature")); assertXmlEqual("cucumber/runtime/formatter/JUnitFormatterTest_2.report.xml", report); } @Test public void featureWithOutlineTest() throws Exception { - File report = runFeaturesWithJunitFormatter(asList("cucumber/runtime/formatter/JUnitFormatterTest_3.feature")); + File report = runFeaturesWithJunitFormatter(asList("classpath:cucumber/runtime/formatter/JUnitFormatterTest_3.feature")); assertXmlEqual("cucumber/runtime/formatter/JUnitFormatterTest_3.report.xml", report); } @Test public void featureSimpleStrictTest() throws Exception { boolean strict = true; - File report = runFeaturesWithJunitFormatter(asList("cucumber/runtime/formatter/JUnitFormatterTest_1.feature"), strict); + File report = runFeaturesWithJunitFormatter(asList("classpath:cucumber/runtime/formatter/JUnitFormatterTest_1.feature"), strict); assertXmlEqual("cucumber/runtime/formatter/JUnitFormatterTest_1_strict.report.xml", report); } diff --git a/core/src/test/java/cucumber/runtime/formatter/RerunFormatterTest.java b/core/src/test/java/cucumber/runtime/formatter/RerunFormatterTest.java index 7894986da7..e6749f39fd 100755 --- a/core/src/test/java/cucumber/runtime/formatter/RerunFormatterTest.java +++ b/core/src/test/java/cucumber/runtime/formatter/RerunFormatterTest.java @@ -57,7 +57,7 @@ public void should_put_data_in_report_when_exit_code_is_non_zero() throws Throwa String formatterOutput = runFeaturesWithFormatter(true); - assertEquals("path/test.feature:2:4:6\n", formatterOutput); + assertEquals("file:path/test.feature:2:4:6\n", formatterOutput); } @Test @@ -75,7 +75,7 @@ public void should_use_scenario_location_when_scenario_step_fails() throws Throw String formatterOutput = runFeaturesWithFormatter(false); - assertEquals("path/test.feature:2\n", formatterOutput); + assertEquals("file:path/test.feature:2\n", formatterOutput); } @Test @@ -94,7 +94,7 @@ public void should_use_scenario_location_when_background_step_fails() throws Thr String formatterOutput = runFeaturesWithFormatter(false); - assertEquals("path/test.feature:4\n", formatterOutput); + assertEquals("file:path/test.feature:4\n", formatterOutput); } @Test @@ -115,7 +115,7 @@ public void should_use_example_row_location_when_scenario_outline_fails() throws String formatterOutput = runFeaturesWithFormatter(false); - assertEquals("path/test.feature:8\n", formatterOutput); + assertEquals("file:path/test.feature:8\n", formatterOutput); } @Test @@ -134,7 +134,7 @@ public void should_use_scenario_location_when_before_hook_fails() throws Throwab String formatterOutput = runFeaturesWithFormatter(false); - assertEquals("path/test.feature:2\n", formatterOutput); + assertEquals("file:path/test.feature:2\n", formatterOutput); } @Test @@ -153,7 +153,7 @@ public void should_use_scenario_location_when_after_hook_fails() throws Throwabl String formatterOutput = runFeaturesWithFormatter(false); - assertEquals("path/test.feature:2\n", formatterOutput); + assertEquals("file:path/test.feature:2\n", formatterOutput); } @Test @@ -174,7 +174,7 @@ public void should_one_entry_for_feature_with_many_failing_scenarios() throws Th String formatterOutput = runFeaturesWithFormatter(false); - assertEquals("path/test.feature:2:5\n", formatterOutput); + assertEquals("file:path/test.feature:2:5\n", formatterOutput); } @Test @@ -198,7 +198,7 @@ public void should_one_entry_for_each_failing_feature() throws Throwable { String formatterOutput = runFeaturesWithFormatter(false); - assertEquals("path/second.feature:2\npath/first.feature:2\n", formatterOutput); + assertEquals("file:path/first.feature:2\nfile:path/second.feature:2\n", formatterOutput); } private String runFeaturesWithFormatter(boolean isStrict) { diff --git a/core/src/test/java/cucumber/runtime/formatter/TimelineFormatterTest.java b/core/src/test/java/cucumber/runtime/formatter/TimelineFormatterTest.java index 2d2bc836b1..5ac0885bc7 100644 --- a/core/src/test/java/cucumber/runtime/formatter/TimelineFormatterTest.java +++ b/core/src/test/java/cucumber/runtime/formatter/TimelineFormatterTest.java @@ -44,7 +44,7 @@ public int compare(TimelineFormatter.TestData o1, TimelineFormatter.TestData o2) private final Map stepsToResult = new HashMap<>(); private final Map stepsToLocation = new HashMap<>(); - private final CucumberFeature failingFeature = feature("some\\windows\\path\\failing.feature", "" + + private final CucumberFeature failingFeature = feature("some/path/failing.feature", "" + "Feature: Failing Feature\n" + " Background:\n" + " Given bg_1\n" + @@ -60,7 +60,7 @@ public int compare(TimelineFormatter.TestData o1, TimelineFormatter.TestData o2) " When step_02\n" + " Then step_03"); - private final CucumberFeature successfulFeature = feature("some\\windows\\path\\successful.feature", "" + + private final CucumberFeature successfulFeature = feature("some/path/successful.feature", "" + "Feature: Successful Feature\n" + " Background:\n" + " Given bg_1\n" + @@ -72,7 +72,7 @@ public int compare(TimelineFormatter.TestData o1, TimelineFormatter.TestData o2) " When step_20\n" + " Then step_30"); - private final CucumberFeature pendingFeature = feature("some\\windows\\path\\pending.feature", "" + + private final CucumberFeature pendingFeature = feature("some/path/pending.feature", "" + "Feature: Pending Feature\n" + " Background:\n" + " Given bg_1\n" + diff --git a/core/src/test/java/cucumber/runtime/io/DelegatingResourceIteratorFactoryTest.java b/core/src/test/java/cucumber/runtime/io/DelegatingResourceIteratorFactoryTest.java index 72eb9e47c4..ad089e39d1 100644 --- a/core/src/test/java/cucumber/runtime/io/DelegatingResourceIteratorFactoryTest.java +++ b/core/src/test/java/cucumber/runtime/io/DelegatingResourceIteratorFactoryTest.java @@ -3,7 +3,7 @@ import org.junit.Test; import java.net.MalformedURLException; -import java.net.URL; +import java.net.URI; import java.util.Iterator; import static org.junit.Assert.assertTrue; @@ -14,7 +14,7 @@ public class DelegatingResourceIteratorFactoryTest { public void should_load_test_resource_iterator() throws MalformedURLException { ResourceIteratorFactory factory = new DelegatingResourceIteratorFactory(new ZipThenFileResourceIteratorFactory()); - URL url = new URL(TestResourceIteratorFactory.TEST_URL); + URI url = URI.create(TestResourceIteratorFactory.TEST_URL); assertTrue(factory.isFactoryFor(url)); diff --git a/core/src/test/java/cucumber/runtime/io/FileResourceTest.java b/core/src/test/java/cucumber/runtime/io/FileResourceTest.java index b5d1e8cf35..d8db20d070 100644 --- a/core/src/test/java/cucumber/runtime/io/FileResourceTest.java +++ b/core/src/test/java/cucumber/runtime/io/FileResourceTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import java.io.File; +import java.net.URI; import static org.junit.Assert.assertEquals; @@ -10,13 +11,11 @@ public class FileResourceTest { @Test public void for_classpath_files_get_path_should_return_relative_path_from_classpath_root() { - // setup FileResource toTest1 = FileResource.createClasspathFileResource(new File("/testPath"), new File("/testPath/test1/test.feature")); FileResource toTest2 = FileResource.createClasspathFileResource(new File("testPath"), new File("testPath/test1/test.feature")); - // test - assertEquals("test1" + File.separator + "test.feature", toTest1.getPath()); - assertEquals("test1" + File.separator + "test.feature", toTest2.getPath()); + assertEquals(URI.create("classpath:test1/test.feature"), toTest1.getPath()); + assertEquals(URI.create("classpath:test1/test.feature"), toTest2.getPath()); } @Test @@ -26,7 +25,7 @@ public void for_filesystem_files_get_path_should_return_the_path() { FileResource toTest2 = FileResource.createFileResource(new File("test1/test.feature"), new File("test1/test.feature")); // test - assertEquals("test1" + File.separator + "test.feature", toTest1.getPath()); - assertEquals("test1" + File.separator + "test.feature", toTest2.getPath()); + assertEquals(URI.create("file:test.feature"), toTest1.getPath()); + assertEquals(new File("test1/test.feature").toURI(), toTest2.getPath()); } } diff --git a/core/src/test/java/cucumber/runtime/io/HelpersTest.java b/core/src/test/java/cucumber/runtime/io/HelpersTest.java index ab482d2356..e643ae6709 100644 --- a/core/src/test/java/cucumber/runtime/io/HelpersTest.java +++ b/core/src/test/java/cucumber/runtime/io/HelpersTest.java @@ -2,41 +2,20 @@ import org.junit.Test; -import java.io.File; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLStreamHandler; +import java.net.URI; -import static cucumber.runtime.io.Helpers.filePath; import static cucumber.runtime.io.Helpers.jarFilePath; import static org.junit.Assert.assertEquals; public class HelpersTest { - private static final URLStreamHandler NULL_URL_STREAM_HANDLER = new URLStreamHandler() { - @Override - protected URLConnection openConnection(URL u) throws IOException { - throw new UnsupportedOperationException(); - } - }; - - @Test - public void computes_file_path_for_file_url() throws UnsupportedEncodingException, MalformedURLException { - URL url = new URL("file:/Users/First%20Last/.m2/repository/info/cukes/cucumber-java/1.2.2/cucumber-java-1.2.2.jar"); - File fileFromFilePath = new File(filePath(url)); - File expectedFile = new File("/Users/First Last/.m2/repository/info/cukes/cucumber-java/1.2.2/cucumber-java-1.2.2.jar"); - assertEquals(expectedFile, fileFromFilePath); - } @Test public void computes_file_path_for_jar_protocols() throws Exception { - assertEquals("foo bar+zap/cucumber-core.jar", jarFilePath(new URL("jar:file:foo%20bar+zap/cucumber-core.jar!/cucumber/runtime/io"))); - assertEquals("foo bar+zap/cucumber-core.jar", jarFilePath(new URL(null, "zip:file:foo%20bar+zap/cucumber-core.jar!/cucumber/runtime/io", NULL_URL_STREAM_HANDLER))); - assertEquals("foo bar+zap/cucumber-core.jar", jarFilePath(new URL(null, "wsjar:file:foo%20bar+zap/cucumber-core.jar!/cucumber/runtime/io", NULL_URL_STREAM_HANDLER))); - assertEquals("foo bar+zap/cucumber-core.jar", jarFilePath(new URL("jar:file:foo%20bar+zap/cucumber-core.jar!/"))); - assertEquals("foo bar+zap/cucumber-core.jar", jarFilePath(new URL(null, "zip:file:foo%20bar+zap/cucumber-core.jar!/", NULL_URL_STREAM_HANDLER))); - assertEquals("foo bar+zap/cucumber-core.jar", jarFilePath(new URL(null, "wsjar:file:foo%20bar+zap/cucumber-core.jar!/", NULL_URL_STREAM_HANDLER))); + assertEquals("foo bar+zap/cucumber-core.jar", jarFilePath(URI.create("jar:file:foo%20bar+zap/cucumber-core.jar!/cucumber/runtime/io")).getSchemeSpecificPart()); + assertEquals("foo bar+zap/cucumber-core.jar", jarFilePath(URI.create("zip:file:foo%20bar+zap/cucumber-core.jar!/cucumber/runtime/io")).getSchemeSpecificPart()); + assertEquals("foo bar+zap/cucumber-core.jar", jarFilePath(URI.create("wsjar:file:foo%20bar+zap/cucumber-core.jar!/cucumber/runtime/io")).getSchemeSpecificPart()); + assertEquals("foo bar+zap/cucumber-core.jar", jarFilePath(URI.create("jar:file:foo%20bar+zap/cucumber-core.jar!/")).getSchemeSpecificPart()); + assertEquals("foo bar+zap/cucumber-core.jar", jarFilePath(URI.create("zip:file:foo%20bar+zap/cucumber-core.jar!/")).getSchemeSpecificPart()); + assertEquals("foo bar+zap/cucumber-core.jar", jarFilePath(URI.create("wsjar:file:foo%20bar+zap/cucumber-core.jar!/")).getSchemeSpecificPart()); } } diff --git a/core/src/test/java/cucumber/runtime/io/ResourceLoaderTest.java b/core/src/test/java/cucumber/runtime/io/ResourceLoaderTest.java index 79dcf26509..7a48aeea43 100644 --- a/core/src/test/java/cucumber/runtime/io/ResourceLoaderTest.java +++ b/core/src/test/java/cucumber/runtime/io/ResourceLoaderTest.java @@ -1,10 +1,12 @@ package cucumber.runtime.io; +import io.cucumber.core.model.FeatureIdentifier; import org.junit.Test; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.net.URI; import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; @@ -12,28 +14,25 @@ import static org.junit.Assert.assertEquals; public class ResourceLoaderTest { - private final File dir; - - public ResourceLoaderTest() throws UnsupportedEncodingException { - dir = new File(URLDecoder.decode(getClass().getProtectionDomain().getCodeSource().getLocation().getFile(), "UTF-8")); - } @Test public void loads_resources_from_filesystem_dir() { - Iterable files = new FileResourceLoader().resources(dir.getAbsolutePath(), ".properties"); - assertEquals(4, toList(files).size()); + URI uri = FeatureIdentifier.parse("src/test/resources/cucumber/runtime"); + Iterable files = new FileResourceLoader().resources(uri, ".properties"); + assertEquals(3, toList(files).size()); } @Test public void loads_resource_from_filesystem_file() { - File file = new File(dir, "cucumber/runtime/bar.properties"); - Iterable files = new FileResourceLoader().resources(file.getPath(), ".doesntmatter"); + URI uri = FeatureIdentifier.parse("src/test/resources/cucumber/runtime/bar.properties"); + Iterable files = new FileResourceLoader().resources(uri, ".doesntmatter"); assertEquals(1, toList(files).size()); } @Test - public void loads_resources_from_jar_on_classpath() throws IOException { - Iterable files = new ClasspathResourceLoader(Thread.currentThread().getContextClassLoader()).resources("cucumber", ".properties"); + public void loads_resources_from_jar_on_classpath() { + URI uri = FeatureIdentifier.parse("classpath:cucumber"); + Iterable files = new ClasspathResourceLoader(Thread.currentThread().getContextClassLoader()).resources(uri, ".properties"); assertEquals(4, toList(files).size()); } diff --git a/core/src/test/java/cucumber/runtime/io/TestResourceIteratorFactory.java b/core/src/test/java/cucumber/runtime/io/TestResourceIteratorFactory.java index 327005e683..599a362c83 100644 --- a/core/src/test/java/cucumber/runtime/io/TestResourceIteratorFactory.java +++ b/core/src/test/java/cucumber/runtime/io/TestResourceIteratorFactory.java @@ -1,18 +1,19 @@ package cucumber.runtime.io; +import java.net.URI; import java.net.URL; import java.util.Iterator; public class TestResourceIteratorFactory implements ResourceIteratorFactory { - public static final String TEST_URL = "file:/this/is/only/a/test"; + static final String TEST_URL = "file:/this/is/only/a/test"; @Override - public boolean isFactoryFor(URL url) { - return url.toExternalForm().equals(TEST_URL); + public boolean isFactoryFor(URI url) { + return TEST_URL.equals(url.toString()); } @Override - public Iterator createIterator(URL url, String path, String suffix) { + public Iterator createIterator(URI url, String path, String suffix) { return new TestResourceIterator(); } diff --git a/core/src/test/java/cucumber/runtime/io/ZipResourceIteratorFactoryTest.java b/core/src/test/java/cucumber/runtime/io/ZipResourceIteratorFactoryTest.java index 34649647d8..bb923a9eee 100644 --- a/core/src/test/java/cucumber/runtime/io/ZipResourceIteratorFactoryTest.java +++ b/core/src/test/java/cucumber/runtime/io/ZipResourceIteratorFactoryTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import java.io.IOException; +import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; @@ -13,21 +14,14 @@ // https://github.com/cucumber/cucumber-jvm/issues/808 public class ZipResourceIteratorFactoryTest { - private static final URLStreamHandler NULL_URL_STREAM_HANDLER = new URLStreamHandler() { - @Override - protected URLConnection openConnection(URL u) throws IOException { - throw new UnsupportedOperationException(); - } - }; - @Test public void is_factory_for_jar_protocols() throws IOException { ZipResourceIteratorFactory factory = new ZipResourceIteratorFactory(); - assertTrue(factory.isFactoryFor(new URL("jar:file:cucumber-core.jar!/cucumber/runtime/io"))); - assertTrue(factory.isFactoryFor(new URL(null, "zip:file:cucumber-core.jar!/cucumber/runtime/io", NULL_URL_STREAM_HANDLER))); - assertTrue(factory.isFactoryFor(new URL(null, "wsjar:file:cucumber-core.jar!/cucumber/runtime/io", NULL_URL_STREAM_HANDLER))); - assertFalse(factory.isFactoryFor(new URL("file:cucumber-core"))); - assertFalse(factory.isFactoryFor(new URL("http://http://cukes.info/cucumber-core.jar"))); + assertTrue(factory.isFactoryFor(URI.create("jar:file:cucumber-core.jar!/cucumber/runtime/io"))); + assertTrue(factory.isFactoryFor(URI.create("zip:file:cucumber-core.jar!/cucumber/runtime/io"))); + assertTrue(factory.isFactoryFor(URI.create("wsjar:file:cucumber-core.jar!/cucumber/runtime/io"))); + assertFalse(factory.isFactoryFor(URI.create("file:cucumber-core"))); + assertFalse(factory.isFactoryFor(URI.create("http://http://cukes.info/cucumber-core.jar"))); } } diff --git a/core/src/test/java/cucumber/runtime/model/CucumberFeatureTest.java b/core/src/test/java/cucumber/runtime/model/CucumberFeatureTest.java index 5437ea55d2..42d723c04e 100644 --- a/core/src/test/java/cucumber/runtime/model/CucumberFeatureTest.java +++ b/core/src/test/java/cucumber/runtime/model/CucumberFeatureTest.java @@ -6,8 +6,10 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.net.URI; import java.util.ArrayList; import java.util.Collections; +import java.util.List; import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; @@ -16,21 +18,29 @@ import static org.mockito.Mockito.when; public class CucumberFeatureTest { + + private static final String DOES_NOT_EXIST = "does/not/exist"; + @Test public void succeeds_if_no_features_are_found() { ResourceLoader resourceLoader = mock(ResourceLoader.class); - when(resourceLoader.resources("does/not/exist", ".feature")).thenReturn(Collections.emptyList()); + mockNonExistingResource(resourceLoader); + + PrintStream baos = new PrintStream(new ByteArrayOutputStream()); + new FeatureLoader(resourceLoader).load(feature("does/not/exist"), baos); + } - new FeatureLoader(resourceLoader).load(singletonList("does/not/exist"), new PrintStream(new ByteArrayOutputStream())); + private void mockNonExistingResource(ResourceLoader resourceLoader) { + when(resourceLoader.resources(URI.create(DOES_NOT_EXIST), ".feature")).thenReturn(Collections.emptyList()); } @Test public void logs_message_if_no_features_are_found() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ResourceLoader resourceLoader = mock(ResourceLoader.class); - when(resourceLoader.resources("does/not/exist", ".feature")).thenReturn(Collections.emptyList()); + mockNonExistingResource(resourceLoader); - new FeatureLoader(resourceLoader).load(singletonList("does/not/exist"), new PrintStream(baos)); + new FeatureLoader(resourceLoader).load(feature("does/not/exist"), new PrintStream(baos)); assertEquals(String.format("No features found at [does/not/exist]%n"), baos.toString()); } @@ -40,7 +50,7 @@ public void logs_message_if_no_feature_paths_are_given() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ResourceLoader resourceLoader = mock(ResourceLoader.class); - new FeatureLoader(resourceLoader).load(Collections.emptyList(), new PrintStream(baos)); + new FeatureLoader(resourceLoader).load(Collections.emptyList(), new PrintStream(baos)); assertEquals(String.format("Got no path to feature directory or feature file%n"), baos.toString()); } @@ -50,18 +60,23 @@ public void gives_error_message_if_path_does_not_exist() { ResourceLoader resourceLoader = mock(ResourceLoader.class); mockFeaturePathToNotExist(resourceLoader, "path/bar.feature"); try { - new FeatureLoader(resourceLoader).load(singletonList("path/bar.feature"), new PrintStream(new ByteArrayOutputStream())); + new FeatureLoader(resourceLoader).load(feature("path/bar.feature"), new PrintStream(new ByteArrayOutputStream())); fail("IllegalArgumentException was expected"); } catch (IllegalArgumentException exception) { assertEquals("Not a file or directory: path/bar.feature", exception.getMessage()); } } + + public List feature(String s) { + return singletonList(URI.create(s)); + } + @Test public void gives_error_message_if_feature_on_class_path_does_not_exist() { ResourceLoader resourceLoader = mock(ResourceLoader.class); mockFeaturePathToNotExist(resourceLoader, "classpath:path/bar.feature"); try { - new FeatureLoader(resourceLoader).load(singletonList("classpath:path/bar.feature"), new PrintStream(new ByteArrayOutputStream())); + new FeatureLoader(resourceLoader).load(feature("classpath:path/bar.feature"), new PrintStream(new ByteArrayOutputStream())); fail("IllegalArgumentException was expected"); } catch (IllegalArgumentException exception) { assertEquals("Feature not found: classpath:path/bar.feature", exception.getMessage()); @@ -70,9 +85,9 @@ public void gives_error_message_if_feature_on_class_path_does_not_exist() { private void mockFeaturePathToNotExist(ResourceLoader resourceLoader, String featurePath) { if (featurePath.startsWith("classpath")) { - when(resourceLoader.resources(featurePath, ".feature")).thenReturn(new ArrayList()); + when(resourceLoader.resources(URI.create(featurePath), ".feature")).thenReturn(new ArrayList()); } else { - when(resourceLoader.resources(featurePath, ".feature")).thenThrow(new IllegalArgumentException("Not a file or directory: " + featurePath)); + when(resourceLoader.resources(URI.create(featurePath), ".feature")).thenThrow(new IllegalArgumentException("Not a file or directory: " + featurePath)); } } diff --git a/core/src/test/java/cucumber/runtime/model/FeatureBuilderTest.java b/core/src/test/java/cucumber/runtime/model/FeatureBuilderTest.java index 7215ec99eb..4c4d326ec3 100644 --- a/core/src/test/java/cucumber/runtime/model/FeatureBuilderTest.java +++ b/core/src/test/java/cucumber/runtime/model/FeatureBuilderTest.java @@ -5,6 +5,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; +import java.net.URI; import java.util.List; import static java.nio.charset.StandardCharsets.UTF_8; @@ -17,7 +18,7 @@ public class FeatureBuilderTest { @Test public void ignores_duplicate_features() throws IOException { FeatureBuilder builder = new FeatureBuilder(); - String featurePath = "foo.feature"; + URI featurePath = URI.create("foo.feature"); Resource resource1 = createResourceMock(featurePath); Resource resource2 = createResourceMock(featurePath); @@ -31,7 +32,7 @@ public void ignores_duplicate_features() throws IOException { @Test public void works_when_path_and_uri_are_the_same() throws IOException { - String featurePath = "path/foo.feature"; + URI featurePath = URI.create("path/foo.feature"); Resource resource = createResourceMock(featurePath); FeatureBuilder builder = new FeatureBuilder(); @@ -43,7 +44,7 @@ public void works_when_path_and_uri_are_the_same() throws IOException { assertEquals(featurePath, features.get(0).getUri()); } - private Resource createResourceMock(String featurePath) throws IOException { + private Resource createResourceMock(URI featurePath) throws IOException { Resource resource = mock(Resource.class); when(resource.getPath()).thenReturn(featurePath); ByteArrayInputStream feature = new ByteArrayInputStream("Feature: foo".getBytes(UTF_8)); diff --git a/core/src/test/java/cucumber/runtime/model/PathWithLinesTest.java b/core/src/test/java/cucumber/runtime/model/PathWithLinesTest.java deleted file mode 100644 index 5b1a24ab60..0000000000 --- a/core/src/test/java/cucumber/runtime/model/PathWithLinesTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package cucumber.runtime.model; - -import org.junit.Test; - -import static java.util.Arrays.asList; -import static java.util.Collections.emptyList; -import static org.junit.Assert.assertEquals; - -public class PathWithLinesTest { - @Test - public void should_create_FileWithFilters_with_no_lines() { - PathWithLines pathWithLines = new PathWithLines("foo.feature"); - assertEquals("foo.feature", pathWithLines.path); - assertEquals(emptyList(), pathWithLines.lines); - } - - @Test - public void should_create_FileWithFilters_with_2_lines() { - PathWithLines pathWithLines = new PathWithLines("foo.feature:999:2000"); - assertEquals("foo.feature", pathWithLines.path); - assertEquals(asList(999L, 2000L), pathWithLines.lines); - } - - @Test - public void should_create_FileWithFilters_with_2_lines_and_windows_path() { - PathWithLines pathWithLines = new PathWithLines("C:\\bar\\foo.feature:999:2000"); - assertEquals("C:\\bar\\foo.feature", pathWithLines.path); - assertEquals(asList(999L, 2000L), pathWithLines.lines); - } -} diff --git a/core/src/test/java/io/cucumber/core/model/FeatureIdentifierTest.java b/core/src/test/java/io/cucumber/core/model/FeatureIdentifierTest.java new file mode 100644 index 0000000000..adf4251513 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/model/FeatureIdentifierTest.java @@ -0,0 +1,76 @@ +package io.cucumber.core.model; + +import org.junit.Test; + +import java.io.File; +import java.net.URI; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assume.assumeThat; + +public class FeatureIdentifierTest { + + @Test + public void can_parse_classpath_form(){ + URI uri = FeatureIdentifier.parse("classpath:/path/to/file.feature"); + assertEquals("classpath", uri.getScheme()); + assertEquals("/path/to/file.feature", uri.getSchemeSpecificPart()); + } + + @Test + public void can_parse_absolute_file_form(){ + URI uri = FeatureIdentifier.parse("file:/path/to/file.feature"); + assertEquals("file", uri.getScheme()); + assertEquals("/path/to/file.feature", uri.getSchemeSpecificPart()); + } + + @Test + public void can_parse_relative_file_form(){ + URI uri = FeatureIdentifier.parse("file:path/to/file.feature"); + assertEquals("file", uri.getScheme()); + assertEquals("path/to/file.feature", uri.getSchemeSpecificPart()); + } + + @Test + public void can_parse_absolute_path_form(){ + URI uri = FeatureIdentifier.parse("/path/to/file.feature"); + assertEquals("file", uri.getScheme()); + assertEquals("/path/to/file.feature", uri.getSchemeSpecificPart()); + } + + @Test + public void can_parse_relative_path_form(){ + URI uri = FeatureIdentifier.parse("path/to/file.feature"); + assertEquals("file", uri.getScheme()); + assertEquals("path/to/file.feature", uri.getSchemeSpecificPart()); + } + + @Test + public void can_parse_windows_path_form(){ + assumeThat(File.separatorChar, is('\\')); //Requires windows + + URI uri = FeatureIdentifier.parse("path\\to\\file.feature"); + assertEquals("file", uri.getScheme()); + assertEquals("path/to/file.feature", uri.getSchemeSpecificPart()); + } + + + @Test + public void can_parse_windows_absolute_path_form(){ + assumeThat(File.separatorChar, is('\\')); //Requires windows + + URI uri = FeatureIdentifier.parse("C:\\path\\to\\file.feature"); + assertEquals("file", uri.getScheme()); + assertEquals("C:/path/to/file.feature", uri.getSchemeSpecificPart()); + } + + + @Test + public void can_parse_whitespace_in_path(){ + URI uri = FeatureIdentifier.parse("path/to the/file.feature"); + assertEquals("file", uri.getScheme()); + assertEquals("path/to the/file.feature", uri.getSchemeSpecificPart()); + } + +} diff --git a/core/src/test/java/io/cucumber/core/model/FeatureWithLinesTest.java b/core/src/test/java/io/cucumber/core/model/FeatureWithLinesTest.java new file mode 100644 index 0000000000..2de3649efe --- /dev/null +++ b/core/src/test/java/io/cucumber/core/model/FeatureWithLinesTest.java @@ -0,0 +1,33 @@ +package io.cucumber.core.model; + +import org.junit.Test; + +import java.net.URI; + +import static org.hamcrest.collection.IsEmptyCollection.emptyCollectionOf; +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +public class FeatureWithLinesTest { + @Test + public void should_create_FileWithFilters_with_no_lines() { + FeatureWithLines featureWithLines = FeatureWithLines.parse("foo.feature"); + assertEquals(URI.create("file:foo.feature"), featureWithLines.uri()); + assertThat(featureWithLines.lines(), emptyCollectionOf(Integer.class)); + } + + @Test + public void should_create_FileWithFilters_with_1_line() { + FeatureWithLines featureWithLines = FeatureWithLines.parse("foo.feature:999"); + assertEquals(URI.create("file:foo.feature"), featureWithLines.uri()); + assertThat(featureWithLines.lines(), contains(999)); + } + + @Test + public void should_create_FileWithFilters_with_2_lines() { + FeatureWithLines featureWithLines = FeatureWithLines.parse("foo.feature:999:2000"); + assertEquals(URI.create("file:foo.feature"), featureWithLines.uri()); + assertThat(featureWithLines.lines(), contains(999, 2000)); + } +} diff --git a/core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.json b/core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.json index edcccf5915..79de8b27ef 100644 --- a/core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.json +++ b/core/src/test/resources/cucumber/runtime/formatter/JSONPrettyFormatterTest.json @@ -344,7 +344,7 @@ "type": "scenario" } ], - "uri": "cucumber/runtime/formatter/JSONPrettyFormatterTest.feature", + "uri": "classpath:cucumber/runtime/formatter/JSONPrettyFormatterTest.feature", "tags": [] } ] \ No newline at end of file diff --git a/junit/src/main/java/cucumber/runtime/junit/FeatureRunner.java b/junit/src/main/java/cucumber/runtime/junit/FeatureRunner.java index 090807eec2..3e74e399c0 100644 --- a/junit/src/main/java/cucumber/runtime/junit/FeatureRunner.java +++ b/junit/src/main/java/cucumber/runtime/junit/FeatureRunner.java @@ -13,6 +13,7 @@ import org.junit.runners.model.InitializationError; import java.io.Serializable; +import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -94,7 +95,7 @@ private void buildFeatureElementRunners(Filters filters, ThreadLocalRunnerSuppli private static final class FeatureId implements Serializable { private static final long serialVersionUID = 1L; - private final String uri; + private final URI uri; FeatureId(CucumberFeature feature) { this.uri = feature.getUri(); @@ -116,7 +117,7 @@ public int hashCode() { @Override public String toString() { - return uri; + return uri.toString(); } } diff --git a/junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithStepDescriptionsTest.java b/junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithStepDescriptionsTest.java index 00c23199aa..5b39243954 100644 --- a/junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithStepDescriptionsTest.java +++ b/junit/src/test/java/cucumber/runtime/junit/PickleRunnerWithStepDescriptionsTest.java @@ -39,7 +39,7 @@ public void shouldAssignUnequalDescriptionsToDifferentOccurrencesOfSameStepInASc Compiler compiler = new Compiler(); List pickleEvents = new ArrayList<>(); for (Pickle pickle : compiler.compile(features.getGherkinFeature())) { - pickleEvents.add(new PickleEvent(features.getUri(), pickle)); + pickleEvents.add(new PickleEvent(features.getUri().toString(), pickle)); }; WithStepDescriptions runner = (WithStepDescriptions) PickleRunners.withStepDescriptions( diff --git a/junit/src/test/java/cucumber/runtime/junit/TestPickleBuilder.java b/junit/src/test/java/cucumber/runtime/junit/TestPickleBuilder.java index 7a2f8bf4ec..888430fd6d 100644 --- a/junit/src/test/java/cucumber/runtime/junit/TestPickleBuilder.java +++ b/junit/src/test/java/cucumber/runtime/junit/TestPickleBuilder.java @@ -9,6 +9,7 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -23,16 +24,20 @@ static List pickleEventsFromFeature(final String path, final String CucumberFeature feature = parseFeature(path, source); for (Pickle pickle : compiler.compile(feature.getGherkinFeature())) { - pickleEvents.add(new PickleEvent(feature.getUri(), pickle)); + pickleEvents.add(new PickleEvent(feature.getUri().toString(), pickle)); } return pickleEvents; } static CucumberFeature parseFeature(final String path, final String source) { + return parseFeature(URI.create(path), source); + } + + static CucumberFeature parseFeature(final URI path, final String source) { return FeatureParser.parseResource(new Resource() { @Override - public String getPath() { + public URI getPath() { return path; } From 5241ec7d9e51e44f626df61ce45909c28701587e Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 1 Feb 2019 23:35:32 +0100 Subject: [PATCH 072/155] Post merge clean up --- core/src/main/java/io/cucumber/core/io/ZipResource.java | 2 +- .../java/io/cucumber/core/model/FeatureWithLines.java | 2 +- .../src/main/java/io/cucumber/core/model/RerunLoader.java | 8 ++++---- .../java/io/cucumber/core/options/RuntimeOptions.java | 5 ----- .../test/java/io/cucumber/core/options/RerunFileTest.java | 8 ++++---- .../cucumber/core/options/RuntimeOptionsFactoryTest.java | 6 +----- .../java/io/cucumber/core/options/RuntimeOptionsTest.java | 6 +++--- 7 files changed, 14 insertions(+), 23 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/io/ZipResource.java b/core/src/main/java/io/cucumber/core/io/ZipResource.java index 003e43fa35..0c518c0d7f 100644 --- a/core/src/main/java/io/cucumber/core/io/ZipResource.java +++ b/core/src/main/java/io/cucumber/core/io/ZipResource.java @@ -6,7 +6,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import static cucumber.runtime.io.MultiLoader.CLASSPATH_SCHEME_PREFIX; +import static io.cucumber.core.io.MultiLoader.CLASSPATH_SCHEME_PREFIX; final class ZipResource implements Resource { private final ZipFile jarFile; diff --git a/core/src/main/java/io/cucumber/core/model/FeatureWithLines.java b/core/src/main/java/io/cucumber/core/model/FeatureWithLines.java index ac2139ab04..37ac819580 100644 --- a/core/src/main/java/io/cucumber/core/model/FeatureWithLines.java +++ b/core/src/main/java/io/cucumber/core/model/FeatureWithLines.java @@ -23,7 +23,7 @@ public class FeatureWithLines implements Serializable { private static final long serialVersionUID = 20190126L; private static final Pattern FEATURE_COLON_LINE_PATTERN = Pattern.compile("^(.*?):([\\d:]+)$"); - private static final String INVALID_PATH_MESSAGE = " is not valid. Try URI[:LINE]*"; + private static final String INVALID_PATH_MESSAGE = " is not valid. Try /.feature[:LINE]*"; private final URI uri; private final SortedSet lines; diff --git a/core/src/main/java/io/cucumber/core/model/RerunLoader.java b/core/src/main/java/io/cucumber/core/model/RerunLoader.java index 908a5dc031..1814431ee4 100644 --- a/core/src/main/java/io/cucumber/core/model/RerunLoader.java +++ b/core/src/main/java/io/cucumber/core/model/RerunLoader.java @@ -1,9 +1,9 @@ package io.cucumber.core.model; -import cucumber.runtime.CucumberException; -import cucumber.runtime.io.Resource; -import cucumber.runtime.io.ResourceLoader; -import cucumber.util.FixJava; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.util.FixJava; import java.io.IOException; import java.io.InputStreamReader; diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index d2f122ebf3..87095d65d8 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -6,12 +6,10 @@ import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; -import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.model.FeaturePath; import io.cucumber.core.model.FeatureWithLines; import io.cucumber.core.model.RerunLoader; -import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.util.FixJava; import io.cucumber.core.util.Mapper; import io.cucumber.datatable.DataTable; @@ -20,7 +18,6 @@ import java.io.InputStreamReader; import java.io.Reader; import java.net.URI; -import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -28,7 +25,6 @@ import java.util.ResourceBundle; import java.util.Set; import java.util.TreeSet; -import java.util.regex.Matcher; import java.util.regex.Pattern; import static io.cucumber.core.util.FixJava.join; @@ -40,7 +36,6 @@ public class RuntimeOptions implements FeatureOptions, FilterOptions, PluginOpti static final String VERSION = ResourceBundle.getBundle("io.cucumber.core.version").getString("cucumber-jvm.version"); private static final String USAGE_RESOURCE = "/io/cucumber/core/api/cli/USAGE.txt"; - private static final Pattern RERUN_PATH_SPECIFICATION = Pattern.compile("(?m:^| |)(.*?\\.feature(?:(?::\\d+)*))"); static String usageText; diff --git a/core/src/test/java/io/cucumber/core/options/RerunFileTest.java b/core/src/test/java/io/cucumber/core/options/RerunFileTest.java index 4e6a7f7c3b..e314f9082a 100644 --- a/core/src/test/java/io/cucumber/core/options/RerunFileTest.java +++ b/core/src/test/java/io/cucumber/core/options/RerunFileTest.java @@ -46,7 +46,7 @@ public void loads_features_specified_in_rerun_file() throws Exception { @Test public void loads_no_features_when_rerun_file_is_empty() throws Exception { ResourceLoader resourceLoader = mockFileResource( - "path/rerun.txt", + "file:path/rerun.txt", "" ); @@ -59,7 +59,7 @@ public void loads_no_features_when_rerun_file_is_empty() throws Exception { @Test public void loads_no_features_when_rerun_file_contains_new_line() throws Exception { ResourceLoader resourceLoader = mockFileResource( - "path/rerun.txt", + "file:path/rerun.txt", "\n" ); @@ -72,7 +72,7 @@ public void loads_no_features_when_rerun_file_contains_new_line() throws Excepti @Test public void loads_no_features_when_rerun_file_contains_carriage_return() throws Exception { ResourceLoader resourceLoader = mockFileResource( - "path/rerun.txt", + "file:path/rerun.txt", "\r"); RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); @@ -84,7 +84,7 @@ public void loads_no_features_when_rerun_file_contains_carriage_return() throws @Test public void loads_no_features_when_rerun_file_contains_new_line_and_carriage_return() throws Exception { ResourceLoader resourceLoader = mockFileResource( - "path/rerun.txt", + "file:path/rerun.txt", "\r\n"); RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, singletonList("@path/rerun.txt")); diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java index 87f53676b0..8bcce13326 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java @@ -60,11 +60,7 @@ public void create_without_options() { assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } - public List uris(String str) { - return singletonList(URI.create(str)); - } - - public List uris(String str) { + private List uris(String str) { return singletonList(URI.create(str)); } diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index 2bc79b5a3b..b9bf384561 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -101,9 +101,9 @@ public void assigns_feature_paths() { @Test public void strips_line_filters_from_feature_paths_and_put_them_among_line_filters() { - RuntimeOptions options = new RuntimeOptions("--glue somewhere somewhere_else:3"); - assertThat(options.getFeaturePaths(), contains(uri("file:somewhere_else"))); - assertThat(options.getLineFilters(), hasEntry(uri("file:somewhere_else"), singleton(3))); + RuntimeOptions options = new RuntimeOptions("--glue somewhere somewhere_else.feature:3"); + assertThat(options.getFeaturePaths(), contains(uri("file:somewhere_else.feature"))); + assertThat(options.getLineFilters(), hasEntry(uri("file:somewhere_else.feature"), singleton(3))); } @Test From cf8dd3db6a6728e21537553698f20b362c9df86d Mon Sep 17 00:00:00 2001 From: Michiel Leegwater Date: Fri, 15 Mar 2019 13:30:21 +0100 Subject: [PATCH 073/155] [Doc] Fix various javadoc issues * Added a few lines of JavaDoc that fail the build on development-v5. * Fixed various Javadoc issues. * Fixed Javadoc issues. --- .../core/api/event/EventListener.java | 2 +- .../core/api/options/CucumberOptions.java | 20 ++++++++++++ .../io/cucumber/core/backend/Backend.java | 3 ++ .../cucumber/core/backend/HookDefinition.java | 1 + .../cucumber/core/backend/StepDefinition.java | 13 ++++++-- .../java/io/cucumber/core/logging/Logger.java | 31 ++++++++++++++++++- .../cucumber/core/options/RuntimeOptions.java | 8 ++--- .../io/cucumber/guice/api/package-info.java | 1 - 8 files changed, 69 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/api/event/EventListener.java b/core/src/main/java/io/cucumber/core/api/event/EventListener.java index 3d38d36ba9..e4a19c1d25 100644 --- a/core/src/main/java/io/cucumber/core/api/event/EventListener.java +++ b/core/src/main/java/io/cucumber/core/api/event/EventListener.java @@ -8,7 +8,7 @@ *

      * When cucumber executes test in parallel or in a framework * that supports parallel execution (e.g. JUnit or TestNG) - * {@link cucumber.api.event.Event}s are stored and published + * {@link io.cucumber.api.event.Event}s are stored and published * in @{@link Event#CANONICAL_ORDER} after the test run has * completed. * diff --git a/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java b/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java index 6fb6589258..5d148cc780 100644 --- a/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java +++ b/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java @@ -14,11 +14,15 @@ /** * Skip execution of glue code. + * + * @return True when dry run, false otherwise. */ boolean dryRun() default false; /** * Treat undefined and pending steps as errors. + * + * @return True when strict, false otherwise. */ boolean strict() default false; @@ -31,6 +35,7 @@ * then features are assumed to be located in {@code classpath:com/example}. * * @see io.cucumber.core.model.FeatureWithLines + * @return The location(s) of the features. */ String[] features() default {}; @@ -43,6 +48,7 @@ * then glue is assumed to be located in {@code com.example}. * * @see io.cucumber.core.model.GluePath + * @return The package(s) that contain glue code. */ String[] glue() default {}; @@ -51,6 +57,8 @@ * plugins) from. E.g: {@code com.example.app} *

      * These packages are used in addition to the default described in {@code #glue}. + * + * @return The package(s) that contain the extra glue code. */ String[] extraGlue() default {}; @@ -58,6 +66,8 @@ * Only run scenarios tagged with tags matching {@code TAG_EXPRESSION}. *

      * For example {@code "@smoke and not @fast"}. + * + * @return The tags that should be matched. */ String[] tags() default {}; @@ -74,26 +84,36 @@ * {@code json:target/cucumber-report.json} * * @see io.cucumber.core.api.plugin.Plugin + * @return The plugins that should be added. */ String[] plugin() default {}; /** * Don't colour terminal output. + * + * @return True when no color should be present in the terminal output, false when color is allowed. */ boolean monochrome() default false; /** * Only run scenarios whose names match provided regular expression. + * + * @return The name(s) that should be matched via regular expressions. */ String[] name() default {}; /** * Format of the generated snippets. + * + * @see io.cucumber.core.api.options.SnippetType + * @return The snippet type to be generated for missing steps. */ SnippetType snippets() default SnippetType.UNDERSCORE; /** * Pass options to the JUnit runner. + * + * @param The JUnit options to pass on. */ String[] junit() default {}; diff --git a/core/src/main/java/io/cucumber/core/backend/Backend.java b/core/src/main/java/io/cucumber/core/backend/Backend.java index 810cdb842a..aeb27adb01 100644 --- a/core/src/main/java/io/cucumber/core/backend/Backend.java +++ b/core/src/main/java/io/cucumber/core/backend/Backend.java @@ -9,6 +9,9 @@ public interface Backend { /** * Invoked once before all features. This is where stepdefs and hooks should be loaded. + * + * @param glue Glue that provides the stepdefs to be executed. + * @param gluePaths The locations for the glue to be loaded. */ void loadGlue(Glue glue, List gluePaths); diff --git a/core/src/main/java/io/cucumber/core/backend/HookDefinition.java b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java index 4570a9c043..168d35fcf1 100644 --- a/core/src/main/java/io/cucumber/core/backend/HookDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java @@ -11,6 +11,7 @@ public interface HookDefinition { * Example: foo/bar/Zap.brainfuck:42 * * @param detail true if extra detailed location information should be included. + * @return The source line where the step definition is define. */ String getLocation(boolean detail); diff --git a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java index beff2262b9..349a523357 100644 --- a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java @@ -10,6 +10,9 @@ public interface StepDefinition { * Returns a list of arguments. Return null if the step definition * doesn't match at all. Return an empty List if it matches with 0 arguments * and bigger sizes if it matches several. + * + * @param step The step to match arguments for + * @return The arguments in a list when the step matches, null otherwise. */ List matchedArguments(PickleStep step); @@ -18,23 +21,27 @@ public interface StepDefinition { * Example: foo/bar/Zap.brainfuck:42 * * @param detail true if extra detailed location information should be included. + * @return The source line of the step definition. */ String getLocation(boolean detail); /** - * How many declared parameters this step definition has. Returns null if unknown. + * @return How many declared parameters this step definition has. Returns null if unknown. */ Integer getParameterCount(); /** * Invokes the step definition. The method should raise a Throwable * if the invocation fails, which will cause the step to fail. + * + * @param args The arguments for the step */ void execute(Object[] args) throws Throwable; /** - * Return true if this matches the location. This is used to filter - * stack traces. + * @param stackTraceElement The location of the step. + * @return Return true if this matches the location. This is used to filter + * stack traces. */ boolean isDefinedAt(StackTraceElement stackTraceElement); // TODO: redundant with getLocation? diff --git a/core/src/main/java/io/cucumber/core/logging/Logger.java b/core/src/main/java/io/cucumber/core/logging/Logger.java index 6a2600ab2d..a5ca0a0119 100644 --- a/core/src/main/java/io/cucumber/core/logging/Logger.java +++ b/core/src/main/java/io/cucumber/core/logging/Logger.java @@ -17,62 +17,91 @@ public interface Logger { /** * Log the {@code message} at error level. + * + * @param message The message to log. */ void error(String message); /** * Log the {@code message} and {@code throwable} at error level. + * + * @param message The message to log. + * @param throwable The throwable to log. */ void error(String message, Throwable throwable); /** * Log the {@code message} at warning level. + * + * @param message The message to log. */ void warn(String message); /** * Log the {@code message} and {@code throwable} at warning level. + * + * @param message The message to log. + * @param throwable The throwable to log. */ void warn(String message, Throwable throwable); /** * Log the {@code message} at info level. + * + * @param message The message to log. */ void info(String message); /** * Log the {@code message} and {@code throwable} at info level. + * + * @param message The message to log. + * @param throwable The throwable to log. */ void info(String message, Throwable throwable); /** * Log the {@code message} at config level. + * + * @param message The message to log. */ void config(String message); /** * Log the {@code message} and {@code throwable} at config level. + * + * @param message The message to log. + * @param throwable The throwable to log. */ void config(String message, Throwable throwable); /** * Log the {@code message} at debug level. + * + * @param message The message to log. */ void debug(String message); /** * Log {@code message} and {@code throwable} at debug level. + * + * @param message The message to log. + * @param throwable The throwable to log. */ void debug(String message, Throwable throwable); /** * Log the {@code message} at trace level. + * + * @param message The message to log. */ void trace(String message); /** * Log the {@code message} and {@code throwable} at trace level. + * + * @param message The message to log. + * @param throwable The throwable to log. */ void trace(String message, Throwable throwable); - } diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 2c3d447045..4f7ab36a73 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -73,8 +73,8 @@ public String map(String keyword) { /** * Create a new instance from a string of options, for example: - *

      - * + *

      + *

      {@code "--name 'the fox' --plugin pretty --strict"}
      * * @param argv the arguments */ @@ -84,8 +84,8 @@ public RuntimeOptions(String argv) { /** * Create a new instance from a list of options, for example: - *

      - * + *

      + *

      {@code Arrays.asList("--name", "the fox", "--plugin", "pretty", "--strict");}
      * * @param argv the arguments */ diff --git a/guice/src/main/java/io/cucumber/guice/api/package-info.java b/guice/src/main/java/io/cucumber/guice/api/package-info.java index d91b00979b..768def6d59 100644 --- a/guice/src/main/java/io/cucumber/guice/api/package-info.java +++ b/guice/src/main/java/io/cucumber/guice/api/package-info.java @@ -49,7 +49,6 @@ * You should use scenario scope when you want to store state during a scenario but do not want the state to interfere * with subsequent scenarios. *

      - *

      *

      Singleton scope

      *

      * Cucumber will create just one instance of a class bound in singleton scope that will last for the lifetime of all From c4816bfe8ea555ffc13d6eca339cfd95fa4ef9ef Mon Sep 17 00:00:00 2001 From: Michiel Leegwater Date: Sat, 16 Mar 2019 22:56:46 +0100 Subject: [PATCH 074/155] [Core] Fix javadoc and cleanup imports * Fixed various Javadoc issues. * Imports cleanup. * Added Javadoc. --- .../io/cucumber/core/api/TypeRegistry.java | 12 ++- .../core/api/TypeRegistryConfigurer.java | 11 ++- .../core/api/event/EventListener.java | 2 +- .../core/api/options/CucumberOptions.java | 2 +- .../cucumber/core/backend/StepDefinition.java | 1 + .../ZipThenFileResourceIteratorFactory.java | 1 - .../cucumber/core/options/RuntimeOptions.java | 2 + .../core/options/RuntimeOptionsFactory.java | 12 +-- .../core/plugin/JSONFormatterTest.java | 56 ++++++------- .../core/plugin/JUnitFormatterTest.java | 27 ++++--- .../core/plugin/URLOutputStreamTest.java | 35 ++++----- .../plugin/UndefinedStepsTrackerTest.java | 26 +++---- .../AmbiguousStepDefinitionMatchsTest.java | 17 ++-- .../io/cucumber/core/runner/EventBusTest.java | 13 ++-- .../io/cucumber/core/runner/RunnerTest.java | 57 +++++++------- .../UndefinedStepDefinitionMatchTest.java | 12 +-- .../io/cucumber/core/runtime/RuntimeTest.java | 78 +++++++++---------- 17 files changed, 192 insertions(+), 172 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/api/TypeRegistry.java b/core/src/main/java/io/cucumber/core/api/TypeRegistry.java index 986845c1d3..4683af5628 100644 --- a/core/src/main/java/io/cucumber/core/api/TypeRegistry.java +++ b/core/src/main/java/io/cucumber/core/api/TypeRegistry.java @@ -6,10 +6,20 @@ import io.cucumber.datatable.TableCellByTypeTransformer; import io.cucumber.datatable.TableEntryByTypeTransformer; +/** + * The type registry records defines parameter types and data table transformers. + */ public interface TypeRegistry { - + /** + * Defines a new parameter type. + * @param parameterType The new parameter type. + */ void defineParameterType(ParameterType parameterType); + /** + * Defines a new data table type. + * @param tableType The new table type. + */ void defineDataTableType(DataTableType tableType); /** diff --git a/core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java b/core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java index cd90a71bd9..7177e9cb93 100644 --- a/core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java +++ b/core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java @@ -2,9 +2,18 @@ import java.util.Locale; +/** + * The type registry configurer allows to configure a new type registry and the locale. + */ public interface TypeRegistryConfigurer { - + /** + * @return The locale to use. + */ Locale locale(); + /** + * Configures the type registry. + * @param typeRegistry The new type registry. + */ void configureTypeRegistry(TypeRegistry typeRegistry); } diff --git a/core/src/main/java/io/cucumber/core/api/event/EventListener.java b/core/src/main/java/io/cucumber/core/api/event/EventListener.java index e4a19c1d25..fe529a31d6 100644 --- a/core/src/main/java/io/cucumber/core/api/event/EventListener.java +++ b/core/src/main/java/io/cucumber/core/api/event/EventListener.java @@ -8,7 +8,7 @@ *

      * When cucumber executes test in parallel or in a framework * that supports parallel execution (e.g. JUnit or TestNG) - * {@link io.cucumber.api.event.Event}s are stored and published + * {@link Event}s are stored and published * in @{@link Event#CANONICAL_ORDER} after the test run has * completed. * diff --git a/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java b/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java index 5d148cc780..ab47592bb3 100644 --- a/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java +++ b/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java @@ -113,7 +113,7 @@ /** * Pass options to the JUnit runner. * - * @param The JUnit options to pass on. + * @return The JUnit options to pass on. */ String[] junit() default {}; diff --git a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java index 349a523357..25b3d67df0 100644 --- a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java @@ -35,6 +35,7 @@ public interface StepDefinition { * if the invocation fails, which will cause the step to fail. * * @param args The arguments for the step + * @throws The throwable in case of step failure. */ void execute(Object[] args) throws Throwable; diff --git a/core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java b/core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java index fda2ecd51a..5c323413bb 100644 --- a/core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java +++ b/core/src/main/java/io/cucumber/core/io/ZipThenFileResourceIteratorFactory.java @@ -1,7 +1,6 @@ package io.cucumber.core.io; import java.net.URI; -import java.net.URL; import java.util.Iterator; /** diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 4f7ab36a73..30a6a7b5f2 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -75,6 +75,7 @@ public String map(String keyword) { * Create a new instance from a string of options, for example: *

      *

      {@code "--name 'the fox' --plugin pretty --strict"}
      + *

      * * @param argv the arguments */ @@ -86,6 +87,7 @@ public RuntimeOptions(String argv) { * Create a new instance from a list of options, for example: *

      *

      {@code Arrays.asList("--name", "the fox", "--plugin", "pretty", "--strict");}
      + *

      * * @param argv the arguments */ diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java index 258b2e9042..6ff1ba793a 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsFactory.java @@ -1,16 +1,16 @@ package io.cucumber.core.options; -import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.core.model.Classpath; -import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.io.MultiLoader; -import io.cucumber.core.io.ResourceLoader; +import static java.util.Arrays.asList; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import static java.util.Arrays.asList; +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.model.Classpath; public final class RuntimeOptionsFactory { private final Class clazz; diff --git a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java index 79e8057cf6..044e9379ee 100755 --- a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java @@ -1,28 +1,18 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.options.SnippetType; -import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.io.TestClasspathResourceLoader; -import io.cucumber.core.event.EventBus; -import io.cucumber.core.backend.Glue; -import io.cucumber.core.runner.TestBackendSupplier; -import io.cucumber.core.runner.TestHelper; -import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.TimeServiceStub; -import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.runtime.Runtime; -import io.cucumber.core.model.CucumberFeature; -import gherkin.pickles.PickleStep; -import gherkin.pickles.PickleTag; -import org.junit.Test; -import org.mockito.ArgumentMatchers; -import org.mockito.stubbing.Answer; +import static io.cucumber.core.runner.TestHelper.createEmbedHookAction; +import static io.cucumber.core.runner.TestHelper.createWriteHookAction; +import static io.cucumber.core.runner.TestHelper.result; +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static uk.co.datumedge.hamcrest.json.SameJSONAs.sameJSONAs; import java.io.File; import java.io.IOException; import java.net.URI; -import java.net.URI; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.HashMap; @@ -30,15 +20,25 @@ import java.util.Map; import java.util.Scanner; -import static io.cucumber.core.runner.TestHelper.createEmbedHookAction; -import static io.cucumber.core.runner.TestHelper.createWriteHookAction; -import static io.cucumber.core.runner.TestHelper.result; -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import static uk.co.datumedge.hamcrest.json.SameJSONAs.sameJSONAs; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.stubbing.Answer; + +import gherkin.pickles.PickleStep; +import gherkin.pickles.PickleTag; +import io.cucumber.core.api.event.Result; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.TestClasspathResourceLoader; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.runner.TestBackendSupplier; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.runner.TimeServiceStub; +import io.cucumber.core.runtime.Runtime; public class JSONFormatterTest { diff --git a/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java index 78f9328f46..3c72b292a9 100644 --- a/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java @@ -1,14 +1,8 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.runner.TestHelper; -import io.cucumber.core.model.CucumberFeature; -import org.custommonkey.xmlunit.Diff; -import org.custommonkey.xmlunit.XMLUnit; -import org.junit.AssumptionViolatedException; -import org.junit.Test; -import org.mockito.stubbing.Answer; -import org.xml.sax.SAXException; +import static io.cucumber.core.runner.TestHelper.result; +import static java.util.Arrays.asList; +import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileInputStream; @@ -24,11 +18,16 @@ import java.util.Map; import java.util.Scanner; -import static io.cucumber.core.runner.TestHelper.result; -import static java.util.Arrays.asList; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; +import org.custommonkey.xmlunit.Diff; +import org.custommonkey.xmlunit.XMLUnit; +import org.junit.AssumptionViolatedException; +import org.junit.Test; +import org.mockito.stubbing.Answer; +import org.xml.sax.SAXException; + +import io.cucumber.core.api.event.Result; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.runner.TestHelper; public class JUnitFormatterTest { diff --git a/core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java b/core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java index a86ca0264c..2c13d3d217 100644 --- a/core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java @@ -1,20 +1,8 @@ package io.cucumber.core.plugin; -import io.cucumber.core.plugin.TestUTF8OutputStreamWriter; -import io.cucumber.core.plugin.URLOutputStream; -import io.cucumber.core.util.FixJava; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.webbitserver.HttpControl; -import org.webbitserver.HttpHandler; -import org.webbitserver.HttpRequest; -import org.webbitserver.HttpResponse; -import org.webbitserver.WebServer; -import org.webbitserver.netty.NettyWebServer; -import org.webbitserver.rest.Rest; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.File; import java.io.FileInputStream; @@ -40,9 +28,20 @@ import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.webbitserver.HttpControl; +import org.webbitserver.HttpHandler; +import org.webbitserver.HttpRequest; +import org.webbitserver.HttpResponse; +import org.webbitserver.WebServer; +import org.webbitserver.netty.NettyWebServer; +import org.webbitserver.rest.Rest; + +import io.cucumber.core.util.FixJava; public class URLOutputStreamTest { private static final URL CUCUMBER_STEPDEFS = createUrl("http://localhost:9873/.cucumber/stepdefs.json"); diff --git a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java index 8302ecc2d5..ed19778e05 100644 --- a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java @@ -1,23 +1,23 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.TestSourceRead; -import io.cucumber.core.runner.TestHelper; -import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.event.EventBus; -import io.cucumber.core.runner.TimeServiceStub; -import io.cucumber.core.model.CucumberFeature; -import gherkin.pickles.PickleLocation; -import org.junit.Ignore; -import org.junit.Test; +import static java.util.Arrays.asList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.Collections; import java.util.List; -import static java.util.Arrays.asList; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import org.junit.Test; + +import gherkin.pickles.PickleLocation; +import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.runner.TimeServiceEventBus; +import io.cucumber.core.runner.TimeServiceStub; public class UndefinedStepsTrackerTest { diff --git a/core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java b/core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java index 68c9c3c564..e46ea70baa 100644 --- a/core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java +++ b/core/src/test/java/io/cucumber/core/runner/AmbiguousStepDefinitionMatchsTest.java @@ -1,18 +1,17 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.Scenario; -import gherkin.pickles.Argument; -import gherkin.pickles.PickleLocation; -import gherkin.pickles.PickleStep; +import static org.mockito.Mockito.mock; + +import java.util.Collections; + import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import java.util.Collections; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; +import gherkin.pickles.Argument; +import gherkin.pickles.PickleLocation; +import gherkin.pickles.PickleStep; +import io.cucumber.core.api.Scenario; public class AmbiguousStepDefinitionMatchsTest { diff --git a/core/src/test/java/io/cucumber/core/runner/EventBusTest.java b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java index b739930385..9cc551d586 100644 --- a/core/src/test/java/io/cucumber/core/runner/EventBusTest.java +++ b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java @@ -1,17 +1,18 @@ package io.cucumber.core.runner; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import org.junit.Test; + +import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.PickleStepTestStep; import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.TestCase; -import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.api.event.TestStepStarted; import io.cucumber.core.event.EventBus; -import org.junit.Test; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; public class EventBusTest { diff --git a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java index 52d2d0e1f2..978e18068d 100644 --- a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -1,38 +1,11 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.Scenario; -import io.cucumber.core.api.options.SnippetType; -import io.cucumber.core.backend.Glue; -import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.backend.Backend; -import io.cucumber.core.event.EventBus; -import io.cucumber.core.io.MultiLoader; -import io.cucumber.core.options.Env; -import io.cucumber.core.options.RuntimeOptions; -import gherkin.events.PickleEvent; -import gherkin.pickles.Pickle; -import gherkin.pickles.PickleLocation; -import gherkin.pickles.PickleStep; -import gherkin.pickles.PickleTag; -import io.cucumber.core.stepexpression.Argument; -import org.junit.Test; -import org.mockito.ArgumentMatchers; -import org.mockito.InOrder; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; @@ -40,6 +13,34 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.net.URI; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.InOrder; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import gherkin.events.PickleEvent; +import gherkin.pickles.Pickle; +import gherkin.pickles.PickleLocation; +import gherkin.pickles.PickleStep; +import gherkin.pickles.PickleTag; +import io.cucumber.core.api.Scenario; +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.options.Env; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.stepexpression.Argument; + public class RunnerTest { private static final String ENGLISH = "en"; private static final String NAME = "name"; diff --git a/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java b/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java index ce16532ba8..2b622a216a 100644 --- a/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/UndefinedStepDefinitionMatchTest.java @@ -1,17 +1,17 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.Scenario; -import gherkin.pickles.PickleStep; -import org.junit.Test; -import org.junit.jupiter.api.function.Executable; - import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; +import org.junit.Test; +import org.junit.jupiter.api.function.Executable; + +import gherkin.pickles.PickleStep; +import io.cucumber.core.api.Scenario; + public class UndefinedStepDefinitionMatchTest { public final UndefinedPickleStepDefinitionMatch match = new UndefinedPickleStepDefinitionMatch(mock(PickleStep.class)); diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index d9893807fa..365d077471 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -1,58 +1,58 @@ package io.cucumber.core.runtime; +import static io.cucumber.core.runner.TestHelper.feature; +import static io.cucumber.core.runner.TestHelper.result; +import static java.util.Collections.singletonList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.net.URI; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; + +import gherkin.ast.ScenarioDefinition; +import gherkin.ast.Step; +import gherkin.pickles.PickleTag; +import io.cucumber.core.api.Scenario; import io.cucumber.core.api.event.HookType; -import io.cucumber.core.api.plugin.Plugin; import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.Scenario; -import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.api.event.TestCase; import io.cucumber.core.api.event.TestCaseFinished; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendSupplier; -import io.cucumber.core.io.TestClasspathResourceLoader; -import io.cucumber.core.event.EventBus; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.io.Resource; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.TestClasspathResourceLoader; +import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.plugin.FormatterBuilder; +import io.cucumber.core.plugin.FormatterSpy; import io.cucumber.core.runner.TestBackendSupplier; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.plugin.FormatterBuilder; -import io.cucumber.core.plugin.FormatterSpy; -import io.cucumber.core.io.Resource; -import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.model.CucumberFeature; -import gherkin.ast.ScenarioDefinition; -import gherkin.ast.Step; -import gherkin.pickles.PickleTag; import io.cucumber.core.stepexpression.TypeRegistry; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.mockito.ArgumentCaptor; -import org.mockito.ArgumentMatchers; - -import java.net.URI; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -import static io.cucumber.core.runner.TestHelper.feature; -import static io.cucumber.core.runner.TestHelper.result; -import static java.util.Collections.singletonList; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertSame; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; public class RuntimeTest { private final static long ANY_TIMESTAMP = 1234567890; From 1798016cf67a9febb5324e6d54b82bd44d8654fe Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 17 Mar 2019 00:02:47 +0100 Subject: [PATCH 075/155] [Core] Share object factory between backends By sharing the object factory between different backends it becomes possible to use the same test context in different languages. This is very useful when mixing Kotlin and Java, or Java and Java 8. This also requires that the backend no longer manages the object factory life-cycle. To end a container and lookup have been extracted from the object factory. Closes #1117. --- .../core/backend/BackendProviderService.java | 2 +- .../io/cucumber/core/backend/Container.java | 11 ++++ .../java/io/cucumber/core/backend/Lookup.java | 12 ++++ .../cucumber/core/backend/ObjectFactory.java | 19 +----- .../core/backend/ObjectFactorySupplier.java | 7 +++ .../SingletonObjectFactorySupplier.java | 18 ++++++ .../ThreadLocalObjectFactorySupplier.java | 18 ++++++ .../java/io/cucumber/core/runner/Runner.java | 9 ++- .../core/runtime/BackendServiceLoader.java | 13 ++-- .../io/cucumber/core/runtime/Runtime.java | 15 ++++- .../core/runtime/SingletonRunnerSupplier.java | 10 ++- .../runtime/ThreadLocalRunnerSupplier.java | 17 +++-- .../backend/StubBackendProviderService.java | 2 +- .../io/cucumber/core/runner/HookTest.java | 4 +- .../io/cucumber/core/runner/RunnerTest.java | 62 ++++++++++--------- .../core/runner/TestRunnerSupplier.java | 25 +++++++- .../runtime/BackendServiceLoaderTest.java | 8 ++- .../runtime/SingletonRunnerSupplierTest.java | 13 ++-- .../ThreadLocalRunnerSupplierTest.java | 15 +++-- .../java/io/cucumber/java/JavaBackend.java | 30 ++++----- .../java/JavaBackendProviderService.java | 6 +- .../io/cucumber/java/JavaHookDefinition.java | 10 +-- .../io/cucumber/java/JavaStepDefinition.java | 10 +-- .../io/cucumber/java/JavaBackendTest.java | 4 +- .../cucumber/java/JavaStepDefinitionTest.java | 7 ++- .../java/JavaStepDefinitionTransposeTest.java | 6 +- .../io/cucumber/java/MethodScannerTest.java | 4 +- .../java/io/cucumber/java8/Java8Backend.java | 16 +++-- .../java8/Java8BackendProviderService.java | 7 +-- .../io/cucumber/java8/Java8BackendTest.java | 4 +- .../java/io/cucumber/junit/api/Cucumber.java | 11 +++- .../cucumber/junit/api/FeatureRunnerTest.java | 8 ++- .../junit/api/StubBackendProviderService.java | 4 +- .../io/cucumber/spring/SpringFactoryTest.java | 7 ++- .../testng/api/TestNGCucumberRunner.java | 12 +++- .../api/StubBackendProviderService.java | 4 +- 36 files changed, 274 insertions(+), 156 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/backend/Container.java create mode 100644 core/src/main/java/io/cucumber/core/backend/Lookup.java create mode 100644 core/src/main/java/io/cucumber/core/backend/ObjectFactorySupplier.java create mode 100644 core/src/main/java/io/cucumber/core/backend/SingletonObjectFactorySupplier.java create mode 100644 core/src/main/java/io/cucumber/core/backend/ThreadLocalObjectFactorySupplier.java diff --git a/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java b/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java index 886a9d7527..613ec43aa7 100644 --- a/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java +++ b/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java @@ -5,6 +5,6 @@ public interface BackendProviderService { - Backend create(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry); + Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry); } diff --git a/core/src/main/java/io/cucumber/core/backend/Container.java b/core/src/main/java/io/cucumber/core/backend/Container.java new file mode 100644 index 0000000000..ac93db2318 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/Container.java @@ -0,0 +1,11 @@ +package io.cucumber.core.backend; + +public interface Container extends Lookup { + /** + * Collects glue classes in the classpath. Called once on init. + * + * @param glueClass Glue class containing cucumber.api annotations (Before, Given, When, ...) + * @return true if stepdefs and hooks in this class should be used, false if they should be ignored. + */ + boolean addClass(Class glueClass); +} diff --git a/core/src/main/java/io/cucumber/core/backend/Lookup.java b/core/src/main/java/io/cucumber/core/backend/Lookup.java new file mode 100644 index 0000000000..3a8c184edd --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/Lookup.java @@ -0,0 +1,12 @@ +package io.cucumber.core.backend; + +public interface Lookup { + /** + * Provides the glue instances used to execute the current scenario. + * + * @param glueClass type of instance to be created. + * @param type of Glue class + * @return new Glue instance of type T + */ + T getInstance(Class glueClass); +} diff --git a/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java b/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java index 43cd6c45d4..5b9a9ef6d0 100644 --- a/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java +++ b/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java @@ -3,7 +3,7 @@ /** * Minimal facade for Dependency Injection containers */ -public interface ObjectFactory { +public interface ObjectFactory extends Container { /** * Instantiate glue code before scenario execution. Called once per scenario. @@ -15,21 +15,4 @@ public interface ObjectFactory { */ void stop(); - /** - * Collects glue classes in the classpath. Called once on init. - * - * @param glueClass Glue class containing cucumber.api annotations (Before, Given, When, ...) - * @return true if stepdefs and hooks in this class should be used, false if they should be ignored. - */ - boolean addClass(Class glueClass); - - /** - * Provides the glue instances used to execute the current scenario. The instance can be prepared in - * {@link #start()}. - * - * @param glueClass type of instance to be created. - * @param type of Glue class - * @return new Glue instance of type T - */ - T getInstance(Class glueClass); } diff --git a/core/src/main/java/io/cucumber/core/backend/ObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/backend/ObjectFactorySupplier.java new file mode 100644 index 0000000000..53a053d772 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/ObjectFactorySupplier.java @@ -0,0 +1,7 @@ +package io.cucumber.core.backend; + +public interface ObjectFactorySupplier { + + ObjectFactory get(); + +} diff --git a/core/src/main/java/io/cucumber/core/backend/SingletonObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/backend/SingletonObjectFactorySupplier.java new file mode 100644 index 0000000000..7856e900f7 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/SingletonObjectFactorySupplier.java @@ -0,0 +1,18 @@ +package io.cucumber.core.backend; + +import io.cucumber.core.options.Env; + +import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; + +public class SingletonObjectFactorySupplier implements ObjectFactorySupplier { + + private ObjectFactory objectFactory; + + @Override + public ObjectFactory get() { + if(objectFactory == null){ + objectFactory = loadObjectFactory(Env.INSTANCE.get(ObjectFactory.class.getName())); + } + return objectFactory; + } +} diff --git a/core/src/main/java/io/cucumber/core/backend/ThreadLocalObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/backend/ThreadLocalObjectFactorySupplier.java new file mode 100644 index 0000000000..9ba08f0799 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/ThreadLocalObjectFactorySupplier.java @@ -0,0 +1,18 @@ +package io.cucumber.core.backend; + + +import io.cucumber.core.options.Env; + +import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; + +public class ThreadLocalObjectFactorySupplier implements ObjectFactorySupplier { + + private final ThreadLocal runners = ThreadLocal.withInitial( + () -> loadObjectFactory(Env.INSTANCE.get(ObjectFactory.class.getName())) + ); + + @Override + public ObjectFactory get() { + return runners.get(); + } +} diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index aceb5d2ec5..9505964055 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -8,6 +8,7 @@ import gherkin.pickles.PickleTag; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.event.EventBus; import io.cucumber.core.logging.Logger; import io.cucumber.core.logging.LoggerFactory; @@ -27,11 +28,13 @@ public final class Runner { private final EventBus bus; private final Collection backends; private final RunnerOptions runnerOptions; + private final ObjectFactory objectFactory; - public Runner(EventBus bus, Collection backends, RunnerOptions runnerOptions) { + public Runner(EventBus bus, Collection backends, ObjectFactory objectFactory, RunnerOptions runnerOptions) { this.bus = bus; this.runnerOptions = runnerOptions; this.backends = backends; + this.objectFactory = objectFactory; List gluePaths = runnerOptions.getGlue(); log.debug("Loading glue from " + FixJava.join(gluePaths, ", ")); for (Backend backend : backends) { @@ -49,7 +52,6 @@ public void runPickle(PickleEvent pickle) { TestCase testCase = createTestCaseForPickle(pickle); testCase.run(bus); disposeBackendWorlds(); - glue.removeScenarioScopedGlue(); } public void reportStepDefinitions(StepDefinitionReporter stepDefinitionReporter) { @@ -127,6 +129,7 @@ private List getBeforeStepHooks(List tags) { } private void buildBackendWorlds() { + objectFactory.start(); for (Backend backend : backends) { backend.buildWorld(); } @@ -136,5 +139,7 @@ private void disposeBackendWorlds() { for (Backend backend : backends) { backend.disposeWorld(); } + objectFactory.stop(); + glue.removeScenarioScopedGlue(); } } diff --git a/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java b/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java index 5cfff47198..d6b35d8c6b 100644 --- a/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java +++ b/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java @@ -4,11 +4,11 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; import io.cucumber.core.backend.BackendSupplier; -import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.backend.Container; +import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.options.Env; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.reflection.Reflections; import io.cucumber.core.stepexpression.TypeRegistry; @@ -19,8 +19,6 @@ import java.util.Locale; import java.util.ServiceLoader; -import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; - /** * Supplies instances of {@link Backend} created by using a {@link ServiceLoader} * to locate instance of {@link BackendSupplier}. @@ -30,11 +28,13 @@ public final class BackendServiceLoader implements BackendSupplier { private final ResourceLoader resourceLoader; private final ClassFinder classFinder; private final RuntimeOptions runtimeOptions; + private final ObjectFactorySupplier container; - public BackendServiceLoader(ResourceLoader resourceLoader, ClassFinder classFinder, RuntimeOptions runtimeOptions) { + public BackendServiceLoader(ResourceLoader resourceLoader, ClassFinder classFinder, RuntimeOptions runtimeOptions, ObjectFactorySupplier container) { this.resourceLoader = resourceLoader; this.classFinder = classFinder; this.runtimeOptions = runtimeOptions; + this.container = container; } @Override @@ -54,8 +54,7 @@ private Collection loadBackends(Iterable backends = new ArrayList<>(); for (BackendProviderService backendProviderService : serviceLoader) { - ObjectFactory objectFactory = loadObjectFactory(Env.INSTANCE.get(ObjectFactory.class.getName())); - backends.add(backendProviderService.create(objectFactory, resourceLoader, typeRegistry)); + backends.add(backendProviderService.create(container.get(), resourceLoader, typeRegistry)); } return backends; } diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 33be746bd0..b798c744b4 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -11,6 +11,10 @@ import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.backend.ObjectFactorySupplier; +import io.cucumber.core.backend.SingletonObjectFactorySupplier; +import io.cucumber.core.backend.ThreadLocalObjectFactorySupplier; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.event.EventBus; import io.cucumber.core.options.Env; @@ -38,6 +42,7 @@ import java.util.concurrent.TimeUnit; import static io.cucumber.core.api.event.Result.SEVERITY; +import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; import static java.util.Collections.emptyList; import static java.util.Collections.max; import static java.util.Collections.min; @@ -190,9 +195,13 @@ public Runtime build() { ? this.classFinder : new ResourceLoaderClassFinder(resourceLoader, this.classLoader); + final ObjectFactorySupplier objectFactorySupplier = runtimeOptions.isMultiThreaded() + ? new ThreadLocalObjectFactorySupplier() + : new SingletonObjectFactorySupplier(); + final BackendSupplier backendSupplier = this.backendSupplier != null ? this.backendSupplier - : new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); + : new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactorySupplier); final Plugins plugins = new Plugins(new PluginFactory(), this.eventBus, runtimeOptions); for (final Plugin plugin : additionalPlugins) { @@ -202,8 +211,8 @@ public Runtime build() { plugins.addPlugin(exitStatus); final RunnerSupplier runnerSupplier = runtimeOptions.isMultiThreaded() - ? new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier) - : new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier); + ? new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactorySupplier) + : new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactorySupplier); final ExecutorService executor = runtimeOptions.isMultiThreaded() ? Executors.newFixedThreadPool(runtimeOptions.getThreads()) diff --git a/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java index 8a1485e803..61030575ce 100644 --- a/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java @@ -1,6 +1,8 @@ package io.cucumber.core.runtime; import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.event.EventBus; import io.cucumber.core.options.RunnerOptions; import io.cucumber.core.runner.Runner; @@ -15,17 +17,19 @@ public final class SingletonRunnerSupplier implements RunnerSupplier { private final BackendSupplier backendSupplier; private final RunnerOptions runnerOptions; private final EventBus eventBus; + private final ObjectFactorySupplier objectFactory; private Runner runner; public SingletonRunnerSupplier( RunnerOptions runnerOptions, EventBus eventBus, - BackendSupplier backendSupplier - ) { + BackendSupplier backendSupplier, + ObjectFactorySupplier objectFactory) { this.backendSupplier = backendSupplier; this.runnerOptions = runnerOptions; this.eventBus = eventBus; + this.objectFactory = objectFactory; } @Override @@ -37,7 +41,7 @@ public Runner get() { } private Runner createRunner() { - return new Runner(eventBus, backendSupplier.get(), runnerOptions); + return new Runner(eventBus, backendSupplier.get(), objectFactory.get(), runnerOptions); } } diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java index b6a9995c16..a822c89a69 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java @@ -3,6 +3,8 @@ import io.cucumber.core.api.event.Event; import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.event.AbstractEventBus; import io.cucumber.core.event.EventBus; import io.cucumber.core.options.RunnerOptions; @@ -18,22 +20,19 @@ public final class ThreadLocalRunnerSupplier implements RunnerSupplier { private final BackendSupplier backendSupplier; private final RunnerOptions runnerOptions; private final SynchronizedEventBus sharedEventBus; + private final ObjectFactorySupplier objectFactory; - private final ThreadLocal runners = new ThreadLocal() { - @Override - protected Runner initialValue() { - return createRunner(); - } - }; + private final ThreadLocal runners = ThreadLocal.withInitial(this::createRunner); public ThreadLocalRunnerSupplier( RunnerOptions runnerOptions, EventBus sharedEventBus, - BackendSupplier backendSupplier - ) { + BackendSupplier backendSupplier, + ObjectFactorySupplier objectFactory) { this.runnerOptions = runnerOptions; this.sharedEventBus = SynchronizedEventBus.synchronize(sharedEventBus); this.backendSupplier = backendSupplier; + this.objectFactory = objectFactory; } @Override @@ -42,7 +41,7 @@ public Runner get() { } private Runner createRunner() { - return new Runner(new LocalEventBus(sharedEventBus), backendSupplier.get(), runnerOptions); + return new Runner(new LocalEventBus(sharedEventBus), backendSupplier.get(), objectFactory.get(), runnerOptions); } private static final class LocalEventBus extends AbstractEventBus { diff --git a/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java b/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java index 813c245292..04e121c8b6 100644 --- a/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java +++ b/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java @@ -12,7 +12,7 @@ public class StubBackendProviderService implements BackendProviderService { @Override - public Backend create(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + public Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { return new StubBackend(); } diff --git a/core/src/test/java/io/cucumber/core/runner/HookTest.java b/core/src/test/java/io/cucumber/core/runner/HookTest.java index 9e10ca3b5f..4a71ffc80c 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTest.java @@ -4,6 +4,7 @@ import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.event.EventBus; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.options.Env; @@ -47,6 +48,7 @@ public class HookTest { public void after_hooks_execute_before_objects_are_disposed() throws Throwable { Backend backend = mock(Backend.class); + ObjectFactory objectFactory = mock(ObjectFactory.class); final HookDefinition hook = mock(HookDefinition.class); when(hook.matches(ArgumentMatchers.anyCollection())).thenReturn(true); @@ -59,7 +61,7 @@ public Object answer(InvocationOnMock invocation) { } }).when(backend).loadGlue(any(Glue.class), ArgumentMatchers.anyList()); - Runner runner = new Runner(bus, Collections.singleton(backend), runtimeOptions); + Runner runner = new Runner(bus, Collections.singleton(backend), objectFactory, runtimeOptions); runner.runPickle(pickleEvent); diff --git a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java index 978e18068d..0a46e44e0b 100644 --- a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -1,29 +1,5 @@ package io.cucumber.core.runner; -import static java.util.Arrays.asList; -import static java.util.Collections.emptyList; -import static java.util.Collections.singletonList; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.junit.Test; -import org.mockito.ArgumentMatchers; -import org.mockito.InOrder; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - import gherkin.events.PickleEvent; import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; @@ -34,12 +10,36 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.event.EventBus; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.options.Env; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.stepexpression.Argument; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.InOrder; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import java.net.URI; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; public class RunnerTest { private static final String ENGLISH = "en"; @@ -59,6 +59,7 @@ public void hooks_execute_when_world_exist() throws Throwable { final HookDefinition afterHook = addAfterHook(); Backend backend = mock(Backend.class); + ObjectFactory objectFactory = mock(ObjectFactory.class); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) { @@ -72,7 +73,7 @@ public Object answer(InvocationOnMock invocation) { PickleStep step = mock(PickleStep.class); - new Runner(bus, singletonList(backend), runtimeOptions).runPickle(createPickleEventWithSteps(asList(step))); + new Runner(bus, singletonList(backend), objectFactory, runtimeOptions).runPickle(createPickleEventWithSteps(asList(step))); InOrder inOrder = inOrder(beforeHook, afterHook, backend); inOrder.verify(backend).buildWorld(); @@ -180,7 +181,7 @@ public void loadGlue(Glue glue, List gluePaths) { public void steps_are_executed() throws Throwable { final StepDefinition stepDefinition = mock(StepDefinition.class); PickleEvent pickleEventMatchingStepDefinitions = createPickleEventMatchingStepDefinitions(asList(stepDefinition)); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions){ + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); @@ -195,7 +196,7 @@ public void steps_are_not_executed_on_dry_run() throws Throwable { final StepDefinition stepDefinition = mock(StepDefinition.class); final PickleEvent pickleEvent = createPickleEventMatchingStepDefinitions(asList(stepDefinition)); RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, singletonList("--dry-run")); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions){ + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); @@ -214,7 +215,7 @@ public void hooks_not_executed_in_dry_run_mode() throws Throwable { final HookDefinition afterHook = addAfterHook(); final HookDefinition afterStepHook = addAfterStepHook(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions){ + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { @@ -238,7 +239,7 @@ public void hooks_not_executed_for_empty_pickles() throws Throwable { final HookDefinition afterHook = addAfterHook(); final HookDefinition afterStepHook = addAfterStepHook(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions){ + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { @@ -259,7 +260,8 @@ public void loadGlue(Glue glue, List gluePaths) { public void backends_are_asked_for_snippets_for_undefined_steps() { PickleStep step = mock(PickleStep.class); Backend backend = mock(Backend.class); - Runner runner = new Runner(bus, singletonList(backend), runtimeOptions); + ObjectFactory objectFactory = mock(ObjectFactory.class); + Runner runner = new Runner(bus, singletonList(backend), objectFactory, runtimeOptions); runner.runPickle(createPickleEventWithSteps(asList(step))); verify(backend).getSnippet(ArgumentMatchers.eq(step), anyString(), any(SnippetType.FunctionNameGenerator.class)); } diff --git a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java index bf725d3faf..83851a1534 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java @@ -3,6 +3,7 @@ import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.event.EventBus; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.options.RuntimeOptions; @@ -16,7 +17,7 @@ import static java.util.Collections.emptyList; -public class TestRunnerSupplier implements Backend, RunnerSupplier { +public class TestRunnerSupplier implements Backend, RunnerSupplier, ObjectFactory { private final EventBus bus; private final RuntimeOptions runtimeOptions; @@ -54,6 +55,26 @@ public List getSnippet(PickleStep step, String keyword, SnippetType.Func @Override public Runner get() { - return new Runner(bus, Collections.singleton(this), runtimeOptions); + return new Runner(bus, Collections.singleton(this), this, runtimeOptions); + } + + @Override + public void start() { + + } + + @Override + public void stop() { + + } + + @Override + public boolean addClass(Class glueClass) { + return false; + } + + @Override + public T getInstance(Class glueClass) { + return null; } } diff --git a/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java b/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java index 3c665f410b..49e30ca85d 100644 --- a/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java @@ -1,6 +1,8 @@ package io.cucumber.core.runtime; import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.backend.ObjectFactorySupplier; +import io.cucumber.core.backend.SingletonObjectFactorySupplier; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; @@ -30,7 +32,8 @@ public void should_create_a_backend() { RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); + BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); assertThat(backendSupplier.get().iterator().next(), is(notNullValue())); } @@ -39,8 +42,9 @@ public void should_throw_an_exception_when_no_backend_could_be_found() { ClassLoader classLoader = getClass().getClassLoader(); RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); expectedException.expect(CucumberException.class); backendSupplier.get(emptyList()).iterator().next(); diff --git a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java index eda2ef6018..16abe7e74b 100644 --- a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java @@ -1,14 +1,16 @@ package io.cucumber.core.runtime; +import io.cucumber.core.backend.ObjectFactorySupplier; +import io.cucumber.core.backend.SingletonObjectFactorySupplier; import io.cucumber.core.event.EventBus; -import io.cucumber.core.runner.TimeService; -import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.io.ClassFinder; -import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; import org.junit.Before; import org.junit.Test; @@ -30,9 +32,10 @@ public void before() { ResourceLoader resourceLoader = new MultiLoader(classLoader); RuntimeOptions runtimeOptions = new RuntimeOptions(resourceLoader, INSTANCE, emptyList()); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); EventBus eventBus = new TimeServiceEventBus(TimeService.SYSTEM); - runnerSupplier = new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier); + runnerSupplier = new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactory); } @Test diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 1b6454cb1f..393e746973 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -3,16 +3,18 @@ import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.backend.ObjectFactorySupplier; +import io.cucumber.core.backend.SingletonObjectFactorySupplier; import io.cucumber.core.event.EventBus; -import io.cucumber.core.options.Env; -import io.cucumber.core.runner.Runner; -import io.cucumber.core.runner.TimeService; -import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.options.Env; import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runner.Runner; +import io.cucumber.core.runner.TimeService; +import io.cucumber.core.runner.TimeServiceEventBus; import org.junit.Before; import org.junit.Test; @@ -37,9 +39,10 @@ public void before() { RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, Collections.emptyList()); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); eventBus = new TimeServiceEventBus(TimeService.SYSTEM); - runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier); + runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactory); } diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index bc4e2376ac..db22d1dbd8 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -3,8 +3,8 @@ import gherkin.pickles.PickleStep; import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.ResourceLoader; @@ -29,17 +29,17 @@ public class JavaBackend implements Backend { private final TypeRegistry typeRegistry; private final SnippetGenerator annotationSnippetGenerator; - private final ObjectFactory objectFactory; + private final Container container; private final MethodScanner methodScanner; private Glue glue; - JavaBackend(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { - this(objectFactory, new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader()), typeRegistry); + JavaBackend(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + this(container, new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader()), typeRegistry); } - JavaBackend(ObjectFactory objectFactory, ClassFinder classFinder, TypeRegistry typeRegistry) { - this.objectFactory = objectFactory; + JavaBackend(Container container, ClassFinder classFinder, TypeRegistry typeRegistry) { + this.container = container; this.methodScanner = new MethodScanner(classFinder); this.annotationSnippetGenerator = new SnippetGenerator(new JavaSnippet(), typeRegistry.parameterTypeRegistry()); this.typeRegistry = typeRegistry; @@ -54,12 +54,12 @@ public void loadGlue(Glue glue, List gluePaths) { @Override public void buildWorld() { - objectFactory.start(); + } @Override public void disposeWorld() { - objectFactory.stop(); + } @Override @@ -69,13 +69,13 @@ public List getSnippet(PickleStep step, String keyword, SnippetType.Func void addStepDefinition(Annotation annotation, Method method) { try { - objectFactory.addClass(method.getDeclaringClass()); + container.addClass(method.getDeclaringClass()); glue.addStepDefinition( new JavaStepDefinition( method, expression(annotation), timeoutMillis(annotation), - objectFactory, + container, typeRegistry)); } catch (CucumberException e) { throw e; @@ -85,23 +85,23 @@ void addStepDefinition(Annotation annotation, Method method) { } void addHook(Annotation annotation, Method method) { - if (objectFactory.addClass(method.getDeclaringClass())) { + if (container.addClass(method.getDeclaringClass())) { if (annotation.annotationType().equals(Before.class)) { String tagExpression = ((Before) annotation).value(); long timeout = ((Before) annotation).timeout(); - glue.addBeforeHook(new JavaHookDefinition(method, tagExpression, ((Before) annotation).order(), timeout, objectFactory)); + glue.addBeforeHook(new JavaHookDefinition(method, tagExpression, ((Before) annotation).order(), timeout, container)); } else if (annotation.annotationType().equals(After.class)) { String tagExpression = ((After) annotation).value(); long timeout = ((After) annotation).timeout(); - glue.addAfterHook(new JavaHookDefinition(method, tagExpression, ((After) annotation).order(), timeout, objectFactory)); + glue.addAfterHook(new JavaHookDefinition(method, tagExpression, ((After) annotation).order(), timeout, container)); } else if (annotation.annotationType().equals(BeforeStep.class)) { String tagExpression = ((BeforeStep) annotation).value(); long timeout = ((BeforeStep) annotation).timeout(); - glue.addBeforeStepHook(new JavaHookDefinition(method, tagExpression, ((BeforeStep) annotation).order(), timeout, objectFactory)); + glue.addBeforeStepHook(new JavaHookDefinition(method, tagExpression, ((BeforeStep) annotation).order(), timeout, container)); } else if (annotation.annotationType().equals(AfterStep.class)) { String tagExpression = ((AfterStep) annotation).value(); long timeout = ((AfterStep) annotation).timeout(); - glue.addAfterStepHook(new JavaHookDefinition(method, tagExpression, ((AfterStep) annotation).order(), timeout, objectFactory)); + glue.addAfterStepHook(new JavaHookDefinition(method, tagExpression, ((AfterStep) annotation).order(), timeout, container)); } } } diff --git a/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java b/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java index f0c87b9a12..d4e949dc2d 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java +++ b/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java @@ -2,14 +2,14 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; -import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.backend.Container; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.TypeRegistry; public class JavaBackendProviderService implements BackendProviderService { @Override - public Backend create(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { - return new JavaBackend(objectFactory, resourceLoader, typeRegistry); + public Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + return new JavaBackend(container, resourceLoader, typeRegistry); } } diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index c86c258606..2c96124760 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -1,7 +1,7 @@ package io.cucumber.java; import io.cucumber.core.api.Scenario; -import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.backend.Lookup; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.reflection.MethodFormat; @@ -18,14 +18,14 @@ class JavaHookDefinition implements HookDefinition { private final long timeoutMillis; private final TagPredicate tagPredicate; private final int order; - private final ObjectFactory objectFactory; + private final Lookup lookup; - JavaHookDefinition(Method method, String tagExpression, int order, long timeoutMillis, ObjectFactory objectFactory) { + JavaHookDefinition(Method method, String tagExpression, int order, long timeoutMillis, Lookup lookup) { this.method = method; this.timeoutMillis = timeoutMillis; this.tagPredicate = new TagPredicate(tagExpression); this.order = order; - this.objectFactory = objectFactory; + this.lookup = lookup; } Method getMethod() { @@ -55,7 +55,7 @@ public void execute(Scenario scenario) throws Throwable { throw new CucumberException("Hooks must declare 0 or 1 arguments. " + method.toString()); } - Invoker.invoke(objectFactory.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); + Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); } @Override diff --git a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java index 65bffdcb96..47dd23c980 100644 --- a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java @@ -1,8 +1,8 @@ package io.cucumber.java; +import io.cucumber.core.backend.Lookup; import io.cucumber.core.runtime.Invoker; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.ArgumentMatcher; import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; @@ -23,7 +23,7 @@ class JavaStepDefinition implements StepDefinition { private final Method method; private final StepExpression expression; private final long timeoutMillis; - private final ObjectFactory objectFactory; + private final Lookup lookup; private final ArgumentMatcher argumentMatcher; private final Type[] parameterTypes; @@ -33,11 +33,11 @@ class JavaStepDefinition implements StepDefinition { JavaStepDefinition(Method method, String expression, long timeoutMillis, - ObjectFactory objectFactory, + Lookup lookup, TypeRegistry typeRegistry) { this.method = method; this.timeoutMillis = timeoutMillis; - this.objectFactory = objectFactory; + this.lookup = lookup; List parameterInfos = ParameterInfo.fromMethod(method); this.parameterTypes = getTypes(parameterInfos); this.expression = createExpression(parameterInfos, expression, typeRegistry); @@ -57,7 +57,7 @@ private StepExpression createExpression(List parameterInfos, Stri @Override public void execute(Object[] args) throws Throwable { - Invoker.invoke(objectFactory.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); + Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); } @Override diff --git a/java/src/test/java/io/cucumber/java/JavaBackendTest.java b/java/src/test/java/io/cucumber/java/JavaBackendTest.java index 0ab61fd791..2a51a71336 100644 --- a/java/src/test/java/io/cucumber/java/JavaBackendTest.java +++ b/java/src/test/java/io/cucumber/java/JavaBackendTest.java @@ -1,12 +1,12 @@ package io.cucumber.java; +import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.java.stepdefs.Stepdefs; import org.junit.Before; import org.junit.Rule; @@ -44,7 +44,7 @@ public class JavaBackendTest { private Glue glue; @Mock - private ObjectFactory factory; + private Container factory; private JavaBackend backend; diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 6ee2083e8e..44e274c99c 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -3,6 +3,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.TestStepFinished; +import io.cucumber.core.backend.Container; import io.cucumber.core.backend.ObjectFactory; import io.cucumber.java.api.en.Given; import io.cucumber.core.options.Env; @@ -72,9 +73,9 @@ public class JavaStepDefinitionTest { public void createBackendAndLoadNoGlue() { ClassLoader classLoader = currentThread().getContextClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); - ObjectFactory factory = new SingletonFactory(defs); + ObjectFactory objectFactory = new SingletonFactory(defs); TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); - this.backend = new JavaBackend(factory, resourceLoader, typeRegistry); + this.backend = new JavaBackend(objectFactory, resourceLoader, typeRegistry); RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); BackendSupplier backendSupplier = new BackendSupplier() { @@ -83,7 +84,7 @@ public Collection get() { return asList(backend); } }; - this.runner = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier).get(); + this.runner = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, () -> objectFactory).get(); bus.registerHandlerFor(TestStepFinished.class, new EventHandler() { @Override diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java index 44c87244e4..548ba7d87e 100755 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java @@ -1,7 +1,7 @@ package io.cucumber.java; +import io.cucumber.core.backend.Lookup; import io.cucumber.java.api.Transpose; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.StepDefinition; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleLocation; @@ -112,9 +112,9 @@ public void passes_transposed_data_table() throws Throwable { private StepDefs runStepDef(Method method, PickleTable table) throws Throwable { StepDefs stepDefs = new StepDefs(); - ObjectFactory objectFactory = new SingletonFactory(stepDefs); + Lookup lookup = new SingletonFactory(stepDefs); - StepDefinition stepDefinition = new JavaStepDefinition(method, "some text", 0, objectFactory, typeRegistry); + StepDefinition stepDefinition = new JavaStepDefinition(method, "some text", 0, lookup, typeRegistry); PickleStep stepWithTable = new PickleStep("some text", asList((gherkin.pickles.Argument) table), asList(mock(PickleLocation.class))); List arguments = stepDefinition.matchedArguments(stepWithTable); diff --git a/java/src/test/java/io/cucumber/java/MethodScannerTest.java b/java/src/test/java/io/cucumber/java/MethodScannerTest.java index 2bb03b365f..8222515c47 100644 --- a/java/src/test/java/io/cucumber/java/MethodScannerTest.java +++ b/java/src/test/java/io/cucumber/java/MethodScannerTest.java @@ -1,7 +1,7 @@ package io.cucumber.java; +import io.cucumber.core.backend.Container; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.backend.Glue; import io.cucumber.core.io.MultiLoader; @@ -30,7 +30,7 @@ public class MethodScannerTest { public MockitoRule mockitoRule = MockitoJUnit.rule(); @Mock - private ObjectFactory factory; + private Container factory; private ResourceLoaderClassFinder classFinder; private JavaBackend backend; diff --git a/java8/src/main/java/io/cucumber/java8/Java8Backend.java b/java8/src/main/java/io/cucumber/java8/Java8Backend.java index 1b4c342215..47a5e24c63 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8Backend.java +++ b/java8/src/main/java/io/cucumber/java8/Java8Backend.java @@ -3,9 +3,9 @@ import gherkin.pickles.PickleStep; import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.ResourceLoader; @@ -26,15 +26,15 @@ public class Java8Backend implements Backend, LambdaGlueRegistry { private final TypeRegistry typeRegistry; private final SnippetGenerator lambdaSnippetGenerator; - private final ObjectFactory objectFactory; + private final Container container; private final ClassFinder classFinder; private Glue glue; private List> lambdaGlueClasses = new ArrayList<>(); - Java8Backend(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + Java8Backend(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { this.classFinder = new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader()); - this.objectFactory = objectFactory; + this.container = container; this.lambdaSnippetGenerator = new SnippetGenerator(new Java8Snippet(), typeRegistry.parameterTypeRegistry()); this.typeRegistry = typeRegistry; } @@ -50,7 +50,7 @@ public void loadGlue(Glue glue, List gluePaths) { continue; } - if (objectFactory.addClass(glueClass)) { + if (container.addClass(glueClass)) { lambdaGlueClasses.add(glueClass); } } @@ -59,14 +59,12 @@ public void loadGlue(Glue glue, List gluePaths) { @Override public void buildWorld() { - objectFactory.start(); - // Instantiate all the stepdef classes for java8 - the stepdef will be initialised // in the constructor. try { INSTANCE.set(this); for (Class lambdaGlueClass: lambdaGlueClasses) { - objectFactory.getInstance(lambdaGlueClass); + container.getInstance(lambdaGlueClass); } } finally { INSTANCE.remove(); @@ -75,7 +73,7 @@ public void buildWorld() { @Override public void disposeWorld() { - objectFactory.stop(); + } @Override diff --git a/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java b/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java index a13ab481b6..26a23a6fb7 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java +++ b/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java @@ -2,15 +2,14 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; -import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.backend.Container; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.java8.Java8Backend; public class Java8BackendProviderService implements BackendProviderService { @Override - public Backend create(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { - return new Java8Backend(objectFactory, resourceLoader, typeRegistry); + public Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + return new Java8Backend(container, resourceLoader, typeRegistry); } } diff --git a/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java b/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java index c808af4cbd..2b397216e6 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java @@ -1,7 +1,7 @@ package io.cucumber.java8; +import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; @@ -35,7 +35,7 @@ public class Java8BackendTest { private Glue glue; @Mock - private ObjectFactory factory; + private Container factory; private Java8Backend backend; diff --git a/junit/src/main/java/io/cucumber/junit/api/Cucumber.java b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java index 7de4793eb5..1424785b8f 100644 --- a/junit/src/main/java/io/cucumber/junit/api/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java @@ -5,7 +5,11 @@ import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.backend.ObjectFactorySupplier; +import io.cucumber.core.backend.SingletonObjectFactorySupplier; import io.cucumber.core.event.EventBus; +import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeService; import io.cucumber.core.runtime.BackendServiceLoader; import io.cucumber.core.backend.BackendSupplier; @@ -35,6 +39,8 @@ import java.util.ArrayList; import java.util.List; +import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; + /** *

      * Classes annotated with {@code @RunWith(Cucumber.class)} will run a Cucumber Feature. @@ -95,8 +101,9 @@ public Cucumber(Class clazz) throws InitializationError { this.bus = new TimeServiceEventBus(TimeService.SYSTEM); this.plugins = new Plugins(new PluginFactory(), bus, runtimeOptions); - BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); - this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); + BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); + this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactory); Filters filters = new Filters(runtimeOptions); for (CucumberFeature cucumberFeature : features) { FeatureRunner featureRunner = new FeatureRunner(cucumberFeature, filters, runnerSupplier, junitOptions); diff --git a/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java index 2c56a87671..b047497650 100644 --- a/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java @@ -1,5 +1,8 @@ package io.cucumber.junit.api; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.backend.ObjectFactorySupplier; +import io.cucumber.core.backend.SingletonObjectFactorySupplier; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; @@ -26,6 +29,7 @@ import java.util.HashSet; import java.util.Set; +import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static org.junit.Assert.assertEquals; @@ -156,6 +160,8 @@ private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, Strin } private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, JUnitOptions junitOption) throws InitializationError { + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); + final RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); final TimeService timeServiceStub = new TimeService() { @@ -179,7 +185,7 @@ public Iterable resources(URI path, String suffix) { } }); Filters filters = new Filters(runtimeOptions); - ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); + ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactory); return new FeatureRunner(cucumberFeature, filters, runnerSupplier, junitOption); } diff --git a/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java b/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java index 61e8543090..7c68e8d456 100644 --- a/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java +++ b/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java @@ -5,8 +5,8 @@ import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; +import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.TypeRegistry; @@ -18,7 +18,7 @@ public class StubBackendProviderService implements BackendProviderService { @Override - public Backend create(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + public Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { return new StubBackend(); } diff --git a/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java b/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java index e6f83fe8e1..6b3913a220 100644 --- a/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java +++ b/spring/src/test/java/io/cucumber/spring/SpringFactoryTest.java @@ -1,5 +1,6 @@ package io.cucumber.spring; +import io.cucumber.core.backend.Container; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.backend.ObjectFactory; import io.cucumber.spring.beans.BellyBean; @@ -246,7 +247,7 @@ public void shouldFailIfMultipleClassesWithSpringAnnotationsAreFound() { expectedException.expectMessage("Glue class class io.cucumber.spring.contextconfig.BellyStepdefs and class io.cucumber.spring.contextconfig.WithSpringAnnotations both attempt to configure the spring context"); - final ObjectFactory factory = new SpringFactory(); + final Container factory = new SpringFactory(); factory.addClass(WithSpringAnnotations.class); factory.addClass(BellyStepdefs.class); } @@ -256,7 +257,7 @@ public void shouldFailIfClassWithSpringComponentAnnotationsIsFound() { expectedException.expect(CucumberException.class); expectedException.expectMessage("Glue class io.cucumber.spring.componentannotation.WithComponentAnnotation was annotated with @Component"); expectedException.expectMessage("Please remove the @Component annotation"); - final ObjectFactory factory = new SpringFactory(); + final Container factory = new SpringFactory(); factory.addClass(WithComponentAnnotation.class); } @@ -265,7 +266,7 @@ public void shouldFailIfClassWithAnnotationAnnotatedWithSpringComponentAnnotatio expectedException.expect(CucumberException.class); expectedException.expectMessage("Glue class io.cucumber.spring.componentannotation.WithControllerAnnotation was annotated with @Controller"); expectedException.expectMessage("Please remove the @Controller annotation"); - final ObjectFactory factory = new SpringFactory(); + final Container factory = new SpringFactory(); factory.addClass(WithControllerAnnotation.class); } diff --git a/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java index d708cd322b..b2a88226f2 100644 --- a/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java @@ -5,6 +5,9 @@ import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.api.plugin.StepDefinitionReporter; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.backend.ObjectFactorySupplier; +import io.cucumber.core.backend.SingletonObjectFactorySupplier; import io.cucumber.core.event.EventBus; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.filter.Filters; @@ -14,6 +17,7 @@ import io.cucumber.core.io.ResourceLoaderClassFinder; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.options.Env; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.options.RuntimeOptionsFactory; import io.cucumber.core.plugin.PluginFactory; @@ -28,6 +32,8 @@ import java.util.ArrayList; import java.util.List; +import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; + /** * Glue code for running Cucumber via TestNG. */ @@ -60,10 +66,10 @@ public TestNGCucumberRunner(Class clazz) { this.bus = new TimeServiceEventBus(TimeService.SYSTEM); this.plugins = new Plugins(new PluginFactory(), bus, runtimeOptions); - - BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); this.filters = new Filters(runtimeOptions); - this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier); + this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactory); } diff --git a/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java b/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java index 3d3e60d6a3..54084b4137 100644 --- a/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java +++ b/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java @@ -5,8 +5,8 @@ import io.cucumber.core.api.options.SnippetType; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; +import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.Argument; @@ -21,7 +21,7 @@ public class StubBackendProviderService implements BackendProviderService { @Override - public Backend create(ObjectFactory objectFactory, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + public Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { return new StubBackend(); } From 277141ef2fcafe05e60053c2015887beb223e19f Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 24 Mar 2019 15:50:30 +0100 Subject: [PATCH 076/155] [Core] Use ThreadLocal object factory in concurrent context --- .../cucumber/core/runtime/BackendServiceLoader.java | 9 ++++----- .../main/java/io/cucumber/junit/api/Cucumber.java | 7 ++++--- .../io/cucumber/testng/api/TestNGCucumberRunner.java | 12 ++++-------- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java b/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java index d6b35d8c6b..6495a7140a 100644 --- a/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java +++ b/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java @@ -4,7 +4,6 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; import io.cucumber.core.backend.BackendSupplier; -import io.cucumber.core.backend.Container; import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.ClassFinder; @@ -28,13 +27,13 @@ public final class BackendServiceLoader implements BackendSupplier { private final ResourceLoader resourceLoader; private final ClassFinder classFinder; private final RuntimeOptions runtimeOptions; - private final ObjectFactorySupplier container; + private final ObjectFactorySupplier objectFactorySupplier; - public BackendServiceLoader(ResourceLoader resourceLoader, ClassFinder classFinder, RuntimeOptions runtimeOptions, ObjectFactorySupplier container) { + public BackendServiceLoader(ResourceLoader resourceLoader, ClassFinder classFinder, RuntimeOptions runtimeOptions, ObjectFactorySupplier objectFactorySupplier) { this.resourceLoader = resourceLoader; this.classFinder = classFinder; this.runtimeOptions = runtimeOptions; - this.container = container; + this.objectFactorySupplier = objectFactorySupplier; } @Override @@ -54,7 +53,7 @@ private Collection loadBackends(Iterable backends = new ArrayList<>(); for (BackendProviderService backendProviderService : serviceLoader) { - backends.add(backendProviderService.create(container.get(), resourceLoader, typeRegistry)); + backends.add(backendProviderService.create(objectFactorySupplier.get(), resourceLoader, typeRegistry)); } return backends; } diff --git a/junit/src/main/java/io/cucumber/junit/api/Cucumber.java b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java index 1424785b8f..c9e4c87a0e 100644 --- a/junit/src/main/java/io/cucumber/junit/api/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java @@ -8,6 +8,7 @@ import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.backend.SingletonObjectFactorySupplier; +import io.cucumber.core.backend.ThreadLocalObjectFactorySupplier; import io.cucumber.core.event.EventBus; import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeService; @@ -101,9 +102,9 @@ public Cucumber(Class clazz) throws InitializationError { this.bus = new TimeServiceEventBus(TimeService.SYSTEM); this.plugins = new Plugins(new PluginFactory(), bus, runtimeOptions); - ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); - BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); - this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactory); + ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(); + BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactorySupplier); + this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier); Filters filters = new Filters(runtimeOptions); for (CucumberFeature cucumberFeature : features) { FeatureRunner featureRunner = new FeatureRunner(cucumberFeature, filters, runnerSupplier, junitOptions); diff --git a/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java index b2a88226f2..22001caa2c 100644 --- a/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java @@ -5,9 +5,8 @@ import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.api.plugin.StepDefinitionReporter; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.ObjectFactorySupplier; -import io.cucumber.core.backend.SingletonObjectFactorySupplier; +import io.cucumber.core.backend.ThreadLocalObjectFactorySupplier; import io.cucumber.core.event.EventBus; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.filter.Filters; @@ -17,7 +16,6 @@ import io.cucumber.core.io.ResourceLoaderClassFinder; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.model.FeatureLoader; -import io.cucumber.core.options.Env; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.options.RuntimeOptionsFactory; import io.cucumber.core.plugin.PluginFactory; @@ -32,8 +30,6 @@ import java.util.ArrayList; import java.util.List; -import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; - /** * Glue code for running Cucumber via TestNG. */ @@ -66,10 +62,10 @@ public TestNGCucumberRunner(Class clazz) { this.bus = new TimeServiceEventBus(TimeService.SYSTEM); this.plugins = new Plugins(new PluginFactory(), bus, runtimeOptions); - ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); - BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); + ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactorySupplier); this.filters = new Filters(runtimeOptions); - this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactory); + this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier); } From 3dac91baa42366c09329e483d5ae293447ff332e Mon Sep 17 00:00:00 2001 From: maritvandijk Date: Mon, 25 Mar 2019 07:43:18 +0100 Subject: [PATCH 077/155] Fix typos in JavaDoc --- .../main/java/io/cucumber/core/backend/HookDefinition.java | 2 +- java/src/main/java/io/cucumber/java/api/After.java | 6 +++--- java/src/main/java/io/cucumber/java/api/AfterStep.java | 6 +++--- java/src/main/java/io/cucumber/java/api/Before.java | 6 +++--- java/src/main/java/io/cucumber/java/api/BeforeStep.java | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/backend/HookDefinition.java b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java index 168d35fcf1..e278edfe36 100644 --- a/core/src/main/java/io/cucumber/core/backend/HookDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java @@ -11,7 +11,7 @@ public interface HookDefinition { * Example: foo/bar/Zap.brainfuck:42 * * @param detail true if extra detailed location information should be included. - * @return The source line where the step definition is define. + * @return The source line where the step definition is defined. */ String getLocation(boolean detail); diff --git a/java/src/main/java/io/cucumber/java/api/After.java b/java/src/main/java/io/cucumber/java/api/After.java index a13c74dd7b..7eedd2b877 100644 --- a/java/src/main/java/io/cucumber/java/api/After.java +++ b/java/src/main/java/io/cucumber/java/api/After.java @@ -20,9 +20,9 @@ * Duration in milliseconds this hook is allowed to run. Cucumber * will mark the hook as failed when exceeded. * - * When the maximum duration is exceeded the thread will - * receive an in interrupt. Note: if the interrupt is ignored - * cucumber will wait for the this hook to finish. + * When the maximum duration is exceeded the thread will + * receive an interrupt. Note: if the interrupt is ignored + * Cucumber will wait for the this hook to finish. * * @return timeout in milliseconds. 0 (default) means no restriction. */ diff --git a/java/src/main/java/io/cucumber/java/api/AfterStep.java b/java/src/main/java/io/cucumber/java/api/AfterStep.java index b04dc19990..29f29aa052 100644 --- a/java/src/main/java/io/cucumber/java/api/AfterStep.java +++ b/java/src/main/java/io/cucumber/java/api/AfterStep.java @@ -20,9 +20,9 @@ * Duration in milliseconds this hook is allowed to run. Cucumber * will mark the hook as failed when exceeded. * - * When the maximum duration is exceeded the thread will - * receive an in interrupt. Note: if the interrupt is ignored - * cucumber will wait for the this hook to finish. + * When the maximum duration is exceeded the thread will + * receive an interrupt. Note: if the interrupt is ignored + * Cucumber will wait for the this hook to finish. * * @return timeout in milliseconds. 0 (default) means no restriction. */ diff --git a/java/src/main/java/io/cucumber/java/api/Before.java b/java/src/main/java/io/cucumber/java/api/Before.java index ca0e7092b8..c575f4e77a 100644 --- a/java/src/main/java/io/cucumber/java/api/Before.java +++ b/java/src/main/java/io/cucumber/java/api/Before.java @@ -20,9 +20,9 @@ * Duration in milliseconds this hook is allowed to run. Cucumber * will mark the hook as failed when exceeded. * - * When the maximum duration is exceeded the thread will - * receive an in interrupt. Note: if the interrupt is ignored - * cucumber will wait for the this hook to finish. + * When the maximum duration is exceeded the thread will + * receive an interrupt. Note: if the interrupt is ignored + * Cucumber will wait for the this hook to finish. * * @return timeout in milliseconds. 0 (default) means no restriction. */ diff --git a/java/src/main/java/io/cucumber/java/api/BeforeStep.java b/java/src/main/java/io/cucumber/java/api/BeforeStep.java index e5d35779ef..9f3d9db68d 100644 --- a/java/src/main/java/io/cucumber/java/api/BeforeStep.java +++ b/java/src/main/java/io/cucumber/java/api/BeforeStep.java @@ -20,9 +20,9 @@ * Duration in milliseconds this hook is allowed to run. Cucumber * will mark the hook as failed when exceeded. * - * When the maximum duration is exceeded the thread will - * receive an in interrupt. Note: if the interrupt is ignored - * cucumber will wait for the this hook to finish. + * When the maximum duration is exceeded the thread will + * receive an interrupt. Note: if the interrupt is ignored + * Cucumber will wait for the this hook to finish. * * @return timeout in milliseconds. 0 (default) means no restriction. */ From 4bb88764527445da8dd9b6a04af86aa0a7b7041c Mon Sep 17 00:00:00 2001 From: Yatharth Zutshi <34692418+gazler22@users.noreply.github.com> Date: Fri, 31 May 2019 02:24:38 +0530 Subject: [PATCH 078/155] [Core] Replace TimeService with Java Time API (#1620) ## Summary Migrating the current code to use Java 8 Time API fields instead of the currently used primitive fields. ## Details The long fields `time`, `timeStampMillis` and `duration` have been replaced by `Instant` and `Duration` respectively. These values can now be used instead of older primitives to allow for better representation of time and duration in cucumber without having to worry about precision or granularity. ## Motivation and Context To allow for more consistent time measurements and reduce custom code. --- .../core/api/event/CanonicalEventOrder.java | 2 +- .../cucumber/core/api/event/EmbedEvent.java | 11 +-- .../io/cucumber/core/api/event/Event.java | 12 ++- .../io/cucumber/core/api/event/Result.java | 16 ++-- .../api/event/SnippetsSuggestedEvent.java | 10 +-- .../core/api/event/TestCaseEvent.java | 6 +- .../core/api/event/TestCaseFinished.java | 18 ++--- .../core/api/event/TestCaseStarted.java | 15 ++-- .../core/api/event/TestRunFinished.java | 11 +-- .../core/api/event/TestRunStarted.java | 11 +-- .../core/api/event/TestSourceRead.java | 11 +-- .../core/api/event/TestStepFinished.java | 11 +-- .../core/api/event/TestStepStarted.java | 11 +-- .../core/api/event/TimeStampedEvent.java | 26 +++---- .../cucumber/core/api/event/WriteEvent.java | 11 +-- .../java/io/cucumber/core/event/EventBus.java | 6 +- .../cucumber/core/plugin/JSONFormatter.java | 21 +++--- .../cucumber/core/plugin/JUnitFormatter.java | 7 +- .../java/io/cucumber/core/plugin/Stats.java | 20 ++--- .../cucumber/core/plugin/TestNGFormatter.java | 11 +-- .../core/plugin/TimelineFormatter.java | 9 ++- .../cucumber/core/plugin/UsageFormatter.java | 75 +++++++++---------- .../java/io/cucumber/core/runner/Runner.java | 2 +- .../io/cucumber/core/runner/Scenario.java | 4 +- .../io/cucumber/core/runner/TestCase.java | 12 +-- .../io/cucumber/core/runner/TestStep.java | 16 ++-- .../io/cucumber/core/runner/TimeService.java | 19 ----- .../core/runner/TimeServiceEventBus.java | 18 ++--- .../io/cucumber/core/runtime/Runtime.java | 11 +-- .../runtime/ThreadLocalRunnerSupplier.java | 21 ++---- .../api/event/CanonicalEventOrderTest.java | 20 ++--- .../cucumber/core/api/event/ResultTest.java | 27 +++---- .../options/RuntimeOptionsFactoryTest.java | 10 +-- .../core/options/RuntimeOptionsTest.java | 26 +++---- .../AverageUsageStatisticStrategyTest.java | 19 +++-- .../core/plugin/HTMLFormatterTest.java | 26 ++++--- .../core/plugin/JSONFormatterTest.java | 38 +++++----- .../core/plugin/JUnitFormatterTest.java | 32 ++++---- .../core/plugin/JsonParallelRuntimeTest.java | 11 +-- .../MedianUsageStatisticStrategyTest.java | 22 +++--- .../core/plugin/PluginFactoryTest.java | 9 ++- .../core/plugin/RerunFormatterTest.java | 3 +- .../io/cucumber/core/plugin/StatsTest.java | 18 +++-- .../core/plugin/TestNGFormatterTest.java | 27 ++++--- .../core/plugin/TimelineFormatterTest.java | 17 +++-- .../plugin/UndefinedStepsTrackerTest.java | 17 +++-- .../core/plugin/UsageFormatterTest.java | 39 +++++----- .../io/cucumber/core/runner/ClockStub.java | 33 ++++++++ .../io/cucumber/core/runner/EventBusTest.java | 16 ++-- .../cucumber/core/runner/HookOrderTest.java | 3 +- .../io/cucumber/core/runner/HookTest.java | 3 +- .../core/runner/HookTestStepTest.java | 9 +++ .../core/runner/PickleStepTestStepTest.java | 25 +++++-- .../io/cucumber/core/runner/RunnerTest.java | 3 +- .../core/runner/ScenarioResultTest.java | 39 +++++----- .../core/runner/StepDurationTimeService.java | 39 ++++++---- .../io/cucumber/core/runner/TestCaseTest.java | 9 +++ .../io/cucumber/core/runner/TestHelper.java | 19 +++-- .../cucumber/core/runner/TimeServiceStub.java | 29 ------- .../cucumber/core/runner/TimeServiceTest.java | 49 ------------ .../cucumber/core/runtime/ExitStatusTest.java | 11 ++- .../io/cucumber/core/runtime/RuntimeTest.java | 14 ++-- .../runtime/SingletonRunnerSupplierTest.java | 5 +- .../core/runtime/TestFeatureSupplier.java | 2 +- .../ThreadLocalRunnerSupplierTest.java | 7 +- .../cucumber/java/JavaStepDefinitionTest.java | 5 +- .../java/io/cucumber/junit/api/Cucumber.java | 15 ++-- .../cucumber/junit/api/FeatureRunnerTest.java | 33 ++++---- .../cucumber/junit/api/JUnitReporterTest.java | 5 +- .../testng/api/TestNGCucumberRunner.java | 10 +-- .../api/TestCaseResultListenerTest.java | 19 ++--- 71 files changed, 583 insertions(+), 614 deletions(-) delete mode 100644 core/src/main/java/io/cucumber/core/runner/TimeService.java create mode 100644 core/src/test/java/io/cucumber/core/runner/ClockStub.java delete mode 100644 core/src/test/java/io/cucumber/core/runner/TimeServiceStub.java delete mode 100644 core/src/test/java/io/cucumber/core/runner/TimeServiceTest.java diff --git a/core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java b/core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java index 78e1c94b15..328f76bf6b 100644 --- a/core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java +++ b/core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java @@ -72,7 +72,7 @@ public int compare(TestCaseEvent a, TestCaseEvent b) { return line; } - return Long.compare(a.getTimeStamp(), b.getTimeStamp()); + return a.getInstant().compareTo(b.getInstant()); } } } diff --git a/core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java b/core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java index 7d318dbf60..b21c6d773f 100644 --- a/core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java @@ -1,16 +1,13 @@ package io.cucumber.core.api.event; +import java.time.Instant; + public final class EmbedEvent extends TestCaseEvent { public final byte[] data; public final String mimeType; - @Deprecated - public EmbedEvent(Long timeStamp, TestCase testCase, byte[] data, String mimeType) { - this(timeStamp, 0, testCase, data, mimeType); - } - - public EmbedEvent(Long timeStamp, long timeStampMillis, TestCase testCase, byte[] data, String mimeType) { - super(timeStamp, timeStampMillis, testCase); + public EmbedEvent(Instant timeInstant, TestCase testCase, byte[] data, String mimeType) { + super(timeInstant, testCase); this.data = data; this.mimeType = mimeType; } diff --git a/core/src/main/java/io/cucumber/core/api/event/Event.java b/core/src/main/java/io/cucumber/core/api/event/Event.java index 43b1c63e41..cfb711fa3a 100644 --- a/core/src/main/java/io/cucumber/core/api/event/Event.java +++ b/core/src/main/java/io/cucumber/core/api/event/Event.java @@ -1,5 +1,6 @@ package io.cucumber.core.api.event; +import java.time.Instant; import java.util.Comparator; public interface Event { @@ -31,13 +32,10 @@ public interface Event { Comparator CANONICAL_ORDER = new CanonicalEventOrder(); /** - * Returns timestamp in nano seconds since an arbitrary start time. + * Returns instant from epoch. * - * @return timestamp in nano seconds - * @see System#nanoTime() - * @deprecated prefer {@link TimeStampedEvent#getTimeStampMillis()} + * @return time instant in Instant + * @see Instant#now() */ - @Deprecated - Long getTimeStamp(); - + Instant getInstant(); } diff --git a/core/src/main/java/io/cucumber/core/api/event/Result.java b/core/src/main/java/io/cucumber/core/api/event/Result.java index 44ed0f22e2..cfa3085cb3 100644 --- a/core/src/main/java/io/cucumber/core/api/event/Result.java +++ b/core/src/main/java/io/cucumber/core/api/event/Result.java @@ -2,9 +2,11 @@ import java.io.PrintWriter; import java.io.StringWriter; +import java.time.Duration; import java.util.Comparator; import java.util.Objects; +import static java.time.Duration.ZERO; import static java.util.Locale.ROOT; import static java.util.Objects.requireNonNull; @@ -19,9 +21,9 @@ public int compare(Result a, Result b) { }; private final Type status; - private final Long duration; + private final Duration duration; private final Throwable error; - public static final Result UNDEFINED = new Result(Result.Type.UNDEFINED, 0L, null); + public static final Result UNDEFINED = new Result(Result.Type.UNDEFINED, ZERO, null); public enum Type { PASSED, SKIPPED, @@ -49,10 +51,10 @@ public String firstLetterCapitalizedName() { * The result of a step or scenario * * @param status status of the step or scenario - * @param duration the duration in nanoseconds + * @param duration the duration * @param error the error that caused the failure if any */ - public Result(Result.Type status, Long duration, Throwable error) { + public Result(Result.Type status, Duration duration, Throwable error) { this.status = requireNonNull(status); this.duration = requireNonNull(duration); this.error = error; @@ -62,10 +64,10 @@ public Result.Type getStatus() { return status; } - public Long getDuration() { + public Duration getDuration() { return duration; } - + public String getErrorMessage() { return error != null ? getErrorMessage(error) : null; } @@ -101,7 +103,7 @@ private String getErrorMessage(Throwable error) { public String toString() { return "Result{" + "status=" + status + - ", duration=" + duration + + ", duration=" + duration.getSeconds() + ", error=" + error + '}'; } diff --git a/core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java b/core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java index af0f1b794f..b84ea9fc6c 100644 --- a/core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java @@ -2,6 +2,7 @@ import gherkin.pickles.PickleLocation; +import java.time.Instant; import java.util.Collections; import java.util.List; @@ -10,13 +11,8 @@ public class SnippetsSuggestedEvent extends TimeStampedEvent { public final List stepLocations; public final List snippets; - @Deprecated - public SnippetsSuggestedEvent(Long timeStamp, String uri, List stepLocations, List snippets) { - this(timeStamp, 0, uri, stepLocations, snippets); - } - - public SnippetsSuggestedEvent(Long timeStamp, long timeStampMillis, String uri, List stepLocations, List snippets) { - super(timeStamp, timeStampMillis); + public SnippetsSuggestedEvent(Instant timeInstant, String uri, List stepLocations, List snippets) { + super(timeInstant); this.uri = uri; this.stepLocations = stepLocations; this.snippets = Collections.unmodifiableList(snippets); diff --git a/core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java b/core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java index 9dabfe8868..ff32a59c21 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java @@ -1,11 +1,13 @@ package io.cucumber.core.api.event; +import java.time.Instant; + public abstract class TestCaseEvent extends TimeStampedEvent { private final TestCase testCase; - TestCaseEvent(Long timeStamp, long timeStampMillis, TestCase testCase) { - super(timeStamp, timeStampMillis); + TestCaseEvent(Instant timeInstant, TestCase testCase) { + super(timeInstant); this.testCase = testCase; } diff --git a/core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java b/core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java index 512ea6704c..f9aaa2878a 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java @@ -1,18 +1,14 @@ package io.cucumber.core.api.event; +import java.time.Instant; + public final class TestCaseFinished extends TestCaseEvent { public final Result result; public final TestCase testCase; - @Deprecated - public TestCaseFinished(Long timeStamp, TestCase testCase, Result result) { - this(timeStamp, 0, testCase, result); - } - - public TestCaseFinished(Long timeStamp, long timeStampMillis, TestCase testCase, Result result) { - super(timeStamp, timeStampMillis, testCase); - this.testCase = testCase; - this.result = result; - } - + public TestCaseFinished(Instant timeInstant, TestCase testCase, Result result) { + super(timeInstant, testCase); + this.testCase = testCase; + this.result = result; + } } diff --git a/core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java b/core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java index 12fe61ecf4..583fef41c0 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java @@ -1,16 +1,13 @@ package io.cucumber.core.api.event; +import java.time.Instant; + public final class TestCaseStarted extends TestCaseEvent { public final TestCase testCase; - @Deprecated - public TestCaseStarted(Long timeStamp, TestCase testCase) { - this(timeStamp, 0L, testCase); - } - - public TestCaseStarted(Long timeStamp, long timeStampMillis, TestCase testCase) { - super(timeStamp, timeStampMillis, testCase); - this.testCase = testCase; - } + public TestCaseStarted(Instant timeInstant, TestCase testCase) { + super(timeInstant, testCase); + this.testCase = testCase; + } } diff --git a/core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java b/core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java index a2c0daf3f6..c75a5b24e3 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java @@ -1,13 +1,10 @@ package io.cucumber.core.api.event; -public final class TestRunFinished extends TimeStampedEvent { +import java.time.Instant; - @Deprecated - public TestRunFinished(Long timeStamp) { - this(timeStamp, 0); - } +public final class TestRunFinished extends TimeStampedEvent { - public TestRunFinished(Long timeStamp, long timeStampMillis) { - super(timeStamp, timeStampMillis); + public TestRunFinished(Instant timeInstant) { + super(timeInstant); } } diff --git a/core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java b/core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java index 43cb4751d0..e7a43fc1d3 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java @@ -1,13 +1,10 @@ package io.cucumber.core.api.event; -public final class TestRunStarted extends TimeStampedEvent { +import java.time.Instant; - @Deprecated - public TestRunStarted(Long timeStamp) { - this(timeStamp, 0); - } +public final class TestRunStarted extends TimeStampedEvent { - public TestRunStarted(Long timeStamp, long timeStampMillis) { - super(timeStamp, timeStampMillis); + public TestRunStarted(Instant timeInstant) { + super(timeInstant); } } diff --git a/core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java b/core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java index 5ff77b5c29..9c9d63a17e 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java @@ -1,16 +1,13 @@ package io.cucumber.core.api.event; +import java.time.Instant; + public final class TestSourceRead extends TimeStampedEvent { public final String uri; public final String source; - @Deprecated - public TestSourceRead(Long timeStamp, String uri, String source) { - this(timeStamp, 0, uri, source); - } - - public TestSourceRead(Long timeStamp, long timeStampMillis, String uri, String source) { - super(timeStamp, timeStampMillis); + public TestSourceRead(Instant timeInstant, String uri, String source) { + super(timeInstant); this.uri = uri; this.source = source; } diff --git a/core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java b/core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java index 4a4eb0cee6..98baebfd87 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java @@ -1,5 +1,7 @@ package io.cucumber.core.api.event; +import java.time.Instant; + /** * A test step finished event is broadcast when ever a step finishes. *

      @@ -20,13 +22,8 @@ public final class TestStepFinished extends TestCaseEvent { public final TestStep testStep; public final Result result; - @Deprecated - public TestStepFinished(Long timeStamp, TestCase testCase, TestStep testStep, Result result) { - this(timeStamp, 0, testCase, testStep, result); - } - - public TestStepFinished(Long timeStamp, long timeStampMillis, TestCase testCase, TestStep testStep, Result result) { - super(timeStamp, timeStampMillis, testCase); + public TestStepFinished(Instant timeInstant, TestCase testCase, TestStep testStep, Result result) { + super(timeInstant, testCase); this.testStep = testStep; this.result = result; } diff --git a/core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java b/core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java index e2f7d78176..b46fe83c70 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java @@ -1,5 +1,7 @@ package io.cucumber.core.api.event; +import java.time.Instant; + /** * A test step started event is broadcast when ever a step starts. *

      @@ -20,13 +22,8 @@ public final class TestStepStarted extends TestCaseEvent { public final TestStep testStep; - @Deprecated - public TestStepStarted(Long timeStamp, TestCase testCase, TestStep testStep) { - this(timeStamp, 0, testCase, testStep); - } - - public TestStepStarted(Long timeStamp, long timeStampMillis, TestCase testCase, TestStep testStep) { - super(timeStamp, timeStampMillis, testCase); + public TestStepStarted(Instant timeInstant, TestCase testCase, TestStep testStep) { + super(timeInstant, testCase); this.testStep = testStep; } diff --git a/core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java b/core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java index ae82ec6c9b..a3cd79f55a 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java @@ -1,30 +1,24 @@ package io.cucumber.core.api.event; +import java.time.Instant; + abstract class TimeStampedEvent implements Event { - private final Long timeStamp; - private final long timeStampMillis; + private final Instant instant; - TimeStampedEvent(Long timeStamp, Long timeStampMillis) { - this.timeStamp = timeStamp; - this.timeStampMillis = timeStampMillis; + TimeStampedEvent(Instant timeInstant) { + this.instant = timeInstant; } - + /** * {@inheritDoc} */ - @Override - public Long getTimeStamp() { - return timeStamp; - } /** - * Returns timestamp in milliseconds of the epoch. - * - * @return timestamp in milli seconds - * @see System#currentTimeMillis() + * {@inheritDoc} */ - public long getTimeStampMillis() { - return timeStampMillis; + @Override + public Instant getInstant() { + return instant; } } diff --git a/core/src/main/java/io/cucumber/core/api/event/WriteEvent.java b/core/src/main/java/io/cucumber/core/api/event/WriteEvent.java index f1d1f2414a..dbc5f4c023 100644 --- a/core/src/main/java/io/cucumber/core/api/event/WriteEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/WriteEvent.java @@ -1,15 +1,12 @@ package io.cucumber.core.api.event; +import java.time.Instant; + public final class WriteEvent extends TestCaseEvent { public final String text; - @Deprecated - public WriteEvent(Long timeStamp, TestCase testCase, String text) { - this(timeStamp, 0, testCase, text); - } - - public WriteEvent(Long timeStamp, long timeStampMillis, TestCase testCase, String text) { - super(timeStamp, timeStampMillis, testCase); + public WriteEvent(Instant timeInstant, TestCase testCase, String text) { + super(timeInstant, testCase); this.text = text; } } diff --git a/core/src/main/java/io/cucumber/core/event/EventBus.java b/core/src/main/java/io/cucumber/core/event/EventBus.java index 48bc985c22..3b23b0be91 100644 --- a/core/src/main/java/io/cucumber/core/event/EventBus.java +++ b/core/src/main/java/io/cucumber/core/event/EventBus.java @@ -1,13 +1,13 @@ package io.cucumber.core.event; +import java.time.Instant; + import io.cucumber.core.api.event.Event; import io.cucumber.core.api.event.EventPublisher; public interface EventBus extends EventPublisher { - Long getTime(); - - Long getTimeMillis(); + Instant getInstant(); void send(Event event); diff --git a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java index 0b3434dda2..1a9c3bdd3f 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java @@ -30,13 +30,13 @@ import gherkin.pickles.PickleTable; import gherkin.pickles.PickleTag; -import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.TimeZone; public final class JSONFormatter implements EventListener { private String currentFeatureFile; @@ -193,7 +193,7 @@ private Map createFeatureMap(TestCase testCase) { private Map createTestCase(TestCaseStarted event) { Map testCaseMap = new HashMap(); - testCaseMap.put("start_timestamp", getDateTimeFromTimeStamp(event.getTimeStampMillis())); + testCaseMap.put("start_timestamp", getDateTimeFromTimeStamp(event.getInstant())); TestCase testCase = event.getTestCase(); @@ -381,16 +381,15 @@ private Map createResultMap(Result result) { if (result.getErrorMessage() != null) { resultMap.put("error_message", result.getErrorMessage()); } - if (result.getDuration() != 0) { - resultMap.put("duration", result.getDuration()); + if (!result.getDuration().isZero()) { + resultMap.put("duration", result.getDuration().toNanos()); } return resultMap; } - private String getDateTimeFromTimeStamp(long timeStampMillis) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); - sdf.setTimeZone(TimeZone.getTimeZone("UTC")); - - return sdf.format(new Date(timeStampMillis)); + private String getDateTimeFromTimeStamp(Instant instant) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX") + .withZone(ZoneOffset.UTC); + return formatter.format(instant); } } diff --git a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java index 086a766be0..2db320eddd 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java @@ -12,6 +12,7 @@ import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.api.plugin.StrictAware; import io.cucumber.core.exception.CucumberException; + import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -25,6 +26,9 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; + +import static java.util.concurrent.TimeUnit.SECONDS; + import java.io.Closeable; import java.io.IOException; import java.io.PrintWriter; @@ -39,6 +43,7 @@ public final class JUnitFormatter implements EventListener, StrictAware { + private static final long NANOS_PER_SECONDS = SECONDS.toNanos(1L); private final Writer writer; private final Document document; private final Element rootElement; @@ -264,7 +269,7 @@ void handleEmptyTestCase(Document doc, Element tc, Result result) { private String calculateTotalDurationString(Result result) { DecimalFormat numberFormat = (DecimalFormat) NumberFormat.getNumberInstance(Locale.US); numberFormat.applyPattern("0.######"); - return numberFormat.format(((double) result.getDuration()) / 1000000000); + return numberFormat.format(((double) result.getDuration().toNanos() / NANOS_PER_SECONDS)); } private void addStepAndResultListing(StringBuilder sb) { diff --git a/core/src/main/java/io/cucumber/core/plugin/Stats.java b/core/src/main/java/io/cucumber/core/plugin/Stats.java index e218585bda..84f687d385 100755 --- a/core/src/main/java/io/cucumber/core/plugin/Stats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Stats.java @@ -15,6 +15,8 @@ import java.io.PrintStream; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; +import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -26,8 +28,8 @@ public class Stats implements EventListener, ColorAware, StrictAware { static final long ONE_MINUTE = 60 * ONE_SECOND; private SubCounts scenarioSubCounts = new SubCounts(); private SubCounts stepSubCounts = new SubCounts(); - private long startTime = 0; - private long totalDuration = 0; + private Instant startTime = Instant.EPOCH; + private Duration totalDuration = Duration.ZERO; private Formats formats = new AnsiFormats(); private Locale locale; private final List failedScenarios = new ArrayList(); @@ -38,7 +40,7 @@ public class Stats implements EventListener, ColorAware, StrictAware { private final EventHandler testRunStartedHandler = new EventHandler() { @Override public void receive(TestRunStarted event) { - setStartTime(event.getTimeStamp()); + setStartTime(event.getInstant()); } }; private final EventHandler stepFinishedHandler = new EventHandler() { @@ -62,7 +64,7 @@ public void receive(TestCaseFinished event) { private final EventHandler testRunFinishedHandler = new EventHandler() { @Override public void receive(TestRunFinished event) { - setFinishTime(event.getTimeStamp()); + setFinishTime(event.getInstant()); } }; private boolean strict; @@ -150,9 +152,9 @@ private boolean printSubCount(PrintStream out, int count, Result.Type type, bool } private void printDuration(PrintStream out) { - out.print(String.format("%dm", (totalDuration / ONE_MINUTE))); + out.print(String.format("%dm", (totalDuration.toNanos() / ONE_MINUTE))); DecimalFormat format = new DecimalFormat("0.000", new DecimalFormatSymbols(locale)); - out.println(format.format(((double) (totalDuration % ONE_MINUTE)) / ONE_SECOND) + "s"); + out.println(format.format(((double) (totalDuration.toNanos() % ONE_MINUTE) / ONE_SECOND)) + "s"); } private void printNonZeroResultScenarios(PrintStream out) { @@ -189,12 +191,12 @@ private void addError(Throwable error) { errors.add(error); } - void setStartTime(Long startTime) { + void setStartTime(Instant startTime) { this.startTime = startTime; } - void setFinishTime(Long finishTime) { - this.totalDuration = finishTime - startTime; + void setFinishTime(Instant finishTime) { + this.totalDuration = Duration.between(startTime, finishTime); } private void addResultToSubCount(SubCounts subCounts, Result.Type resultStatus) { diff --git a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java index 6c7f5fd2e0..b69382dda2 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java @@ -34,11 +34,12 @@ import java.io.Writer; import java.net.URL; import java.text.SimpleDateFormat; +import java.time.Duration; import java.util.ArrayList; import java.util.Date; import java.util.List; -import static java.util.concurrent.TimeUnit.NANOSECONDS; +import static java.time.Duration.ZERO; public final class TestNGFormatter implements EventListener, StrictAware { @@ -280,14 +281,14 @@ void finish(Document doc, Element element) { } private String calculateTotalDurationString() { - long totalDurationNanos = 0; + Duration totalDuration = ZERO; for (Result r : results) { - totalDurationNanos += r.getDuration(); + totalDuration = totalDuration.plus(r.getDuration()); } for (Result r : hooks) { - totalDurationNanos += r.getDuration(); + totalDuration = totalDuration.plus(r.getDuration()); } - return String.valueOf(NANOSECONDS.toMillis(totalDurationNanos)); + return String.valueOf(totalDuration.toMillis()); } private void addStepAndResultListing(StringBuilder sb) { diff --git a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index 58ee9c35d5..cea9264840 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -23,6 +23,7 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.URL; +import java.time.Instant; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -203,9 +204,9 @@ class TestData { @SerializedName("scenario") final String scenario; @SerializedName("start") - final long startTime; + final Instant startTime; @SerializedName("end") - long endTime; + Instant endTime; @SerializedName("group") final long threadId; @SerializedName("content") @@ -221,7 +222,7 @@ class TestData { final String uri = testCase.getUri(); this.feature = TimelineFormatter.this.testSources.getFeatureName(uri); this.scenario = testCase.getName(); - this.startTime = started.getTimeStampMillis(); + this.startTime = started.getInstant(); this.threadId = threadId; this.tags = buildTagsValue(testCase); } @@ -235,7 +236,7 @@ private String buildTagsValue(final TestCase testCase) { } public void end(final TestCaseFinished event) { - this.endTime = event.getTimeStampMillis(); + this.endTime = event.getInstant(); this.className = event.result.getStatus().lowerCaseName(); } } diff --git a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java index 02cd0eae75..d307614d70 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java @@ -10,8 +10,11 @@ import io.cucumber.core.api.event.TestStepFinished; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; +import gherkin.deps.com.google.gson.JsonSerializer; -import java.math.BigDecimal; +import static java.time.Duration.ZERO; + +import java.time.Duration; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -23,7 +26,6 @@ * by adding {@link UsageStatisticStrategy} to the usageFormatter */ public final class UsageFormatter implements Plugin, EventListener { - private static final BigDecimal NANOS_PER_SECOND = BigDecimal.valueOf(1000000000); final Map> usageMap = new HashMap>(); private final Map statisticStrategies = new HashMap(); @@ -85,45 +87,37 @@ void finishReport() { private List createStepContainer(List stepContainers) { for (StepContainer stepContainer : stepContainers) { stepContainer.aggregatedDurations = createAggregatedDurations(stepContainer); - formatDurationAsSeconds(stepContainer.durations); } return stepContainers; } - private void formatDurationAsSeconds(List durations) { - for (StepDuration duration : durations) { - duration.duration = toSeconds(duration.duration.longValue()); - } - } - - private Map createAggregatedDurations(StepContainer stepContainer) { - Map aggregatedResults = new HashMap(); + private Map createAggregatedDurations(StepContainer stepContainer) { + Map aggregatedResults = new HashMap(); for (Map.Entry calculatorEntry : statisticStrategies.entrySet()) { UsageStatisticStrategy statisticStrategy = calculatorEntry.getValue(); - List rawDurations = getRawDurations(stepContainer.durations); - Long calculationResult = statisticStrategy.calculate(rawDurations); + List rawDurations = getRawDurations(stepContainer.durations); + Duration calculationResult = statisticStrategy.calculate(rawDurations); String strategy = calculatorEntry.getKey(); - aggregatedResults.put(strategy, toSeconds(calculationResult)); + aggregatedResults.put(strategy, calculationResult); } return aggregatedResults; } - private BigDecimal toSeconds(Long nanoSeconds) { - return BigDecimal.valueOf(nanoSeconds).divide(NANOS_PER_SECOND); - } - - private List getRawDurations(List stepDurations) { - List rawDurations = new ArrayList(); + private List getRawDurations(List stepDurations) { + List rawDurations = new ArrayList(); for (StepDuration stepDuration : stepDurations) { - rawDurations.add(stepDuration.duration.longValue()); + rawDurations.add(stepDuration.duration); } return rawDurations; } private Gson gson() { - return new GsonBuilder().setPrettyPrinting().create(); + return new GsonBuilder().registerTypeAdapter(Duration.class, + (JsonSerializer) (duration, returnVal, jsonSerializationContext) -> { + return new Gson().toJsonTree(duration.getSeconds()); + }).setPrettyPrinting().create(); } private void addUsageEntry(Result result, String stepDefinition, String stepNameWithArgs, String stepLocation) { @@ -134,17 +128,17 @@ private void addUsageEntry(Result result, String stepDefinition, String stepName } StepContainer stepContainer = findOrCreateStepContainer(stepNameWithArgs, stepContainers); - Long duration = result.getDuration(); + Duration duration = result.getDuration(); StepDuration stepDuration = createStepDuration(duration, stepLocation); stepContainer.durations.add(stepDuration); } - private StepDuration createStepDuration(Long duration, String location) { + private StepDuration createStepDuration(Duration duration, String location) { StepDuration stepDuration = new StepDuration(); if (duration == null) { - stepDuration.duration = BigDecimal.ZERO; + stepDuration.duration = ZERO; } else { - stepDuration.duration = BigDecimal.valueOf(duration); + stepDuration.duration = duration; } stepDuration.location = location; return stepDuration; @@ -192,12 +186,12 @@ static class StepDefContainer { */ static class StepContainer { public String name; - public Map aggregatedDurations = new HashMap(); + public Map aggregatedDurations = new HashMap(); public List durations = new ArrayList(); } static class StepDuration { - public BigDecimal duration; + public Duration duration; public String location; } @@ -209,7 +203,7 @@ static interface UsageStatisticStrategy { * @param durationEntries list of execution times of steps as nanoseconds * @return a statistical value (e.g. median, average, ..) */ - Long calculate(List durationEntries); + Duration calculate(List durationEntries); } /** @@ -217,19 +211,20 @@ static interface UsageStatisticStrategy { */ static class AverageUsageStatisticStrategy implements UsageStatisticStrategy { @Override - public Long calculate(List durationEntries) { + public Duration calculate(List durationEntries) { if (verifyNoNulls(durationEntries)) { - return 0L; + return ZERO; } - long sum = 0; - for (Long duration : durationEntries) { - sum += duration; + Duration sum = ZERO; + for (Duration duration : durationEntries) { + sum = sum.plus(duration); } - return sum / durationEntries.size(); + + return sum.dividedBy(durationEntries.size()); } - private boolean verifyNoNulls(List durationEntries) { + private boolean verifyNoNulls(List durationEntries) { return durationEntries == null || durationEntries.isEmpty() || durationEntries.contains(null); } } @@ -239,20 +234,20 @@ private boolean verifyNoNulls(List durationEntries) { */ static class MedianUsageStatisticStrategy implements UsageStatisticStrategy { @Override - public Long calculate(List durationEntries) { + public Duration calculate(List durationEntries) { if (verifyNoNulls(durationEntries)) { - return 0L; + return ZERO; } Collections.sort(durationEntries); int middle = durationEntries.size() / 2; if (durationEntries.size() % 2 == 1) { return durationEntries.get(middle); } else { - return (durationEntries.get(middle - 1) + durationEntries.get(middle)) / 2; + return (durationEntries.get(middle - 1).plus(durationEntries.get(middle))).dividedBy(2); } } - private boolean verifyNoNulls(List durationEntries) { + private boolean verifyNoNulls(List durationEntries) { return durationEntries == null || durationEntries.isEmpty() || durationEntries.contains(null); } } diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index 673727d0a0..218a710f5a 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -82,7 +82,7 @@ private void addTestStepsForPickleSteps(List testSteps, Pick snippets.addAll(snippet); } if (!snippets.isEmpty()) { - bus.send(new SnippetsSuggestedEvent(bus.getTime(), bus.getTimeMillis(), pickleEvent.uri, step.getLocations(), snippets)); + bus.send(new SnippetsSuggestedEvent(bus.getInstant(), pickleEvent.uri, step.getLocations(), snippets)); } match = new UndefinedPickleStepDefinitionMatch(step); } diff --git a/core/src/main/java/io/cucumber/core/runner/Scenario.java b/core/src/main/java/io/cucumber/core/runner/Scenario.java index db49ba4dbe..e94c3da194 100644 --- a/core/src/main/java/io/cucumber/core/runner/Scenario.java +++ b/core/src/main/java/io/cucumber/core/runner/Scenario.java @@ -56,14 +56,14 @@ public boolean isFailed() { @Override public void embed(byte[] data, String mimeType) { if (bus != null) { - bus.send(new EmbedEvent(bus.getTime(), bus.getTimeMillis(), testCase, data, mimeType)); + bus.send(new EmbedEvent(bus.getInstant(), testCase, data, mimeType)); } } @Override public void write(String text) { if (bus != null) { - bus.send(new WriteEvent(bus.getTime(), bus.getTimeMillis(), testCase, text)); + bus.send(new WriteEvent(bus.getInstant(), testCase, text)); } } diff --git a/core/src/main/java/io/cucumber/core/runner/TestCase.java b/core/src/main/java/io/cucumber/core/runner/TestCase.java index 58f705abc7..f6ca02c270 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestCase.java +++ b/core/src/main/java/io/cucumber/core/runner/TestCase.java @@ -10,6 +10,8 @@ import io.cucumber.core.event.EventBus; import java.net.URI; +import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.List; @@ -34,9 +36,8 @@ public TestCase(List testSteps, void run(EventBus bus) { boolean skipNextStep = this.dryRun; - Long startTimeMillis = bus.getTimeMillis(); - Long startTimeNanos = bus.getTime(); - bus.send(new TestCaseStarted(startTimeNanos, startTimeMillis, this)); + Instant startTimeInstant = bus.getInstant(); + bus.send(new TestCaseStarted(startTimeInstant, this)); Scenario scenario = new Scenario(bus, this); for (HookTestStep before : beforeHooks) { @@ -51,9 +52,8 @@ void run(EventBus bus) { after.run(this, bus, scenario, dryRun); } - Long stopTimeNanos = bus.getTime(); - Long stopTimeMillis = bus.getTimeMillis(); - bus.send(new TestCaseFinished(stopTimeNanos, stopTimeMillis, this, new Result(scenario.getStatus(), stopTimeNanos - startTimeNanos, scenario.getError()))); + Instant stopTimeInstant = bus.getInstant(); + bus.send(new TestCaseFinished(stopTimeInstant, this, new Result(scenario.getStatus(), Duration.between(startTimeInstant, stopTimeInstant), scenario.getError()))); } @Override diff --git a/core/src/main/java/io/cucumber/core/runner/TestStep.java b/core/src/main/java/io/cucumber/core/runner/TestStep.java index ba23c73f16..107b7a7c84 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/TestStep.java @@ -8,6 +8,8 @@ import io.cucumber.core.backend.StepDefinitionMatch; import io.cucumber.core.event.EventBus; +import java.time.Duration; +import java.time.Instant; import java.util.Arrays; abstract class TestStep implements io.cucumber.core.api.event.TestStep { @@ -42,9 +44,8 @@ public String getCodeLocation() { * @return true iff subsequent skippable steps should be skipped */ boolean run(TestCase testCase, EventBus bus, Scenario scenario, boolean skipSteps) { - Long startTimeMillis = bus.getTimeMillis(); - Long startTimeNanos = bus.getTime(); - bus.send(new TestStepStarted(startTimeNanos, startTimeMillis, testCase, this)); + Instant startTimeMillis = bus.getInstant(); + bus.send(new TestStepStarted(startTimeMillis, testCase, this)); Result.Type status; Throwable error = null; try { @@ -53,11 +54,10 @@ boolean run(TestCase testCase, EventBus bus, Scenario scenario, boolean skipStep error = t; status = mapThrowableToStatus(t); } - Long stopTimeNanos = bus.getTime(); - Long stopTimeMillis = bus.getTimeMillis(); - Result result = mapStatusToResult(status, error, stopTimeNanos - startTimeNanos); + Instant stopTimeNanos = bus.getInstant(); + Result result = mapStatusToResult(status, error, Duration.between(startTimeMillis, stopTimeNanos)); scenario.add(result); - bus.send(new TestStepFinished(stopTimeNanos, stopTimeMillis, testCase, this, result)); + bus.send(new TestStepFinished(stopTimeNanos, testCase, this, result)); return !result.is(Result.Type.PASSED); } @@ -87,7 +87,7 @@ private Result.Type mapThrowableToStatus(Throwable t) { return Result.Type.FAILED; } - private Result mapStatusToResult(Result.Type status, Throwable error, long duration) { + private Result mapStatusToResult(Result.Type status, Throwable error, Duration duration) { if (status == Result.Type.UNDEFINED) { return Result.UNDEFINED; } diff --git a/core/src/main/java/io/cucumber/core/runner/TimeService.java b/core/src/main/java/io/cucumber/core/runner/TimeService.java deleted file mode 100644 index ab1dd7b111..0000000000 --- a/core/src/main/java/io/cucumber/core/runner/TimeService.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.cucumber.core.runner; - -public interface TimeService { - long time(); - long timeMillis(); - - TimeService SYSTEM = new TimeService() { - @Override - public long time() { - return System.nanoTime(); - } - - @Override - public long timeMillis() { - return System.currentTimeMillis(); - } - }; - -} diff --git a/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java b/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java index fc7aa95b03..fd33258e01 100644 --- a/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java +++ b/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java @@ -1,21 +1,19 @@ package io.cucumber.core.runner; +import java.time.Clock; +import java.time.Instant; + import io.cucumber.core.event.AbstractEventBus; public final class TimeServiceEventBus extends AbstractEventBus { - private final TimeService stopWatch; - - public TimeServiceEventBus(TimeService stopWatch) { - this.stopWatch = stopWatch; - } + private final Clock clock; - @Override - public Long getTime() { - return stopWatch.time(); + public TimeServiceEventBus(Clock clock) { + this.clock = clock; } @Override - public Long getTimeMillis() { - return stopWatch.timeMillis(); + public Instant getInstant() { + return clock.instant(); } } diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 0a48385e1f..4ccc9481d1 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -29,7 +29,6 @@ import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.plugin.Plugins; -import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.logging.Logger; import io.cucumber.core.logging.LoggerFactory; @@ -52,6 +51,8 @@ import static java.util.Collections.max; import static java.util.Collections.min; +import java.time.Clock; + /** * This is the main entry point for running Cucumber features from the CLI. */ @@ -87,9 +88,9 @@ private Runtime(final Plugins plugins, public void run() { final List features = featureSupplier.get(); - bus.send(new TestRunStarted(bus.getTime(), bus.getTimeMillis())); + bus.send(new TestRunStarted(bus.getInstant())); for (CucumberFeature feature : features) { - bus.send(new TestSourceRead(bus.getTime(), bus.getTimeMillis(), feature.getUri().toString(), feature.getSource())); + bus.send(new TestSourceRead(bus.getInstant(), feature.getUri().toString(), feature.getSource())); } final StepDefinitionReporter stepDefinitionReporter = plugins.stepDefinitionReporter(); runnerSupplier.get().reportStepDefinitions(stepDefinitionReporter); @@ -128,7 +129,7 @@ public void run() { throw new CompositeCucumberException(thrown); } - bus.send(new TestRunFinished(bus.getTime(), bus.getTimeMillis())); + bus.send(new TestRunFinished(bus.getInstant())); } public byte exitStatus() { @@ -141,7 +142,7 @@ public static Builder builder() { public static class Builder { - private EventBus eventBus = new TimeServiceEventBus(TimeService.SYSTEM); + private EventBus eventBus = new TimeServiceEventBus(Clock.systemUTC()); private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); private RuntimeOptions runtimeOptions; private BackendSupplier backendSupplier; diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java index b4d98d30cc..9a8bc6fc6f 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java @@ -1,9 +1,10 @@ package io.cucumber.core.runtime; +import java.time.Instant; + import io.cucumber.core.api.event.Event; import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.backend.BackendSupplier; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.event.AbstractEventBus; import io.cucumber.core.event.EventBus; @@ -52,11 +53,6 @@ private static final class LocalEventBus extends AbstractEventBus { this.parent = parent; } - @Override - public Long getTime() { - return parent.getTime(); - } - @Override public void send(final Event event) { super.send(event); @@ -64,8 +60,8 @@ public void send(final Event event) { } @Override - public Long getTimeMillis() { - return parent.getTimeMillis(); + public Instant getInstant() { + return parent.getInstant(); } } @@ -85,11 +81,6 @@ private SynchronizedEventBus(final EventBus delegate) { this.delegate = delegate; } - @Override - public synchronized Long getTime() { - return delegate.getTime(); - } - @Override public synchronized void send(final Event event) { delegate.send(event); @@ -111,8 +102,8 @@ public synchronized void removeHandlerFor(Class eventType, } @Override - public Long getTimeMillis() { - return delegate.getTimeMillis(); + public Instant getInstant() { + return delegate.getInstant(); } } } diff --git a/core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java b/core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java index ed6fca9a2c..ce4cf99658 100644 --- a/core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java +++ b/core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java @@ -11,9 +11,9 @@ import io.cucumber.core.api.event.TestSourceRead; import org.junit.Test; +import java.time.Instant; import java.util.Arrays; import java.util.Collections; -import java.util.Date; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -28,29 +28,25 @@ public class CanonicalEventOrderTest { private CanonicalEventOrder comparator = new CanonicalEventOrder(); - static long getTime() { - return new Date().getTime(); - } - - private static long getTimeStampMillis() { - return System.currentTimeMillis(); + private static Instant getInstant() { + return Instant.now(); } static Event createTestCaseEvent(final String uri, final int line) { final TestCase testCase = mock(TestCase.class); given(testCase.getUri()).willReturn(uri); given(testCase.getLine()).willReturn(line); - return new TestCaseStarted(getTime(), getTimeStampMillis(), testCase); + return new TestCaseStarted(getInstant(), testCase); } - private Event runStarted = new TestRunStarted(getTime(), getTimeStampMillis()); - private Event testRead = new TestSourceRead(getTime(), getTimeStampMillis(), "uri", "source"); - private Event suggested = new SnippetsSuggestedEvent(getTime(), getTimeStampMillis(), "uri", Collections.emptyList(), Collections.emptyList()); + private Event runStarted = new TestRunStarted(getInstant()); + private Event testRead = new TestSourceRead(getInstant(), "uri", "source"); + private Event suggested = new SnippetsSuggestedEvent(getInstant(), "uri", Collections.emptyList(), Collections.emptyList()); private Event feature1Case1Started = createTestCaseEvent("feature1", 1); private Event feature1Case2Started = createTestCaseEvent("feature1", 9); private Event feature1Case3Started = createTestCaseEvent("feature1", 11); private Event feature2Case1Started = createTestCaseEvent("feature2", 1); - private Event runFinished = new TestRunFinished(getTime(), getTimeStampMillis()); + private Event runFinished = new TestRunFinished(getInstant()); @Test public void verifyTestRunStartedSortedCorrectly() { diff --git a/core/src/test/java/io/cucumber/core/api/event/ResultTest.java b/core/src/test/java/io/cucumber/core/api/event/ResultTest.java index 2b9f5fc4e7..67ab2aa979 100644 --- a/core/src/test/java/io/cucumber/core/api/event/ResultTest.java +++ b/core/src/test/java/io/cucumber/core/api/event/ResultTest.java @@ -12,6 +12,7 @@ import static io.cucumber.core.api.event.Result.Type.PENDING; import static io.cucumber.core.api.event.Result.Type.SKIPPED; import static io.cucumber.core.api.event.Result.Type.UNDEFINED; +import static java.time.Duration.ZERO; import static java.util.Arrays.asList; import static java.util.Collections.sort; import static org.hamcrest.CoreMatchers.equalTo; @@ -23,12 +24,12 @@ public class ResultTest { @Test public void severity_from_low_to_high_is_passed_skipped_pending_undefined_ambiguous_failed() { - Result passed = new Result(PASSED, 0L, null); - Result skipped = new Result(SKIPPED, 0L, null); - Result pending = new Result(PENDING, 0L, null); - Result ambiguous = new Result(AMBIGUOUS, 0L, null); - Result undefined = new Result(UNDEFINED, 0L, null); - Result failed = new Result(FAILED, 0L, null); + Result passed = new Result(PASSED, ZERO, null); + Result skipped = new Result(SKIPPED, ZERO, null); + Result pending = new Result(PENDING, ZERO, null); + Result ambiguous = new Result(AMBIGUOUS, ZERO, null); + Result undefined = new Result(UNDEFINED, ZERO, null); + Result failed = new Result(FAILED, ZERO, null); List results = asList(pending, passed, skipped, failed, ambiguous, undefined); @@ -39,7 +40,7 @@ public void severity_from_low_to_high_is_passed_skipped_pending_undefined_ambigu @Test public void passed_result_is_always_ok() { - Result passedResult = new Result(PASSED, 0L, null); + Result passedResult = new Result(PASSED, ZERO, null); assertTrue(passedResult.isOk(isStrict(false))); assertTrue(passedResult.isOk(isStrict(true))); @@ -47,7 +48,7 @@ public void passed_result_is_always_ok() { @Test public void skipped_result_is_always_ok() { - Result skippedResult = new Result(SKIPPED, 0L, null); + Result skippedResult = new Result(SKIPPED, ZERO, null); assertTrue(skippedResult.isOk(isStrict(false))); assertTrue(skippedResult.isOk(isStrict(true))); @@ -55,7 +56,7 @@ public void skipped_result_is_always_ok() { @Test public void failed_result_is_never_ok() { - Result failedResult = new Result(FAILED, 0L, null); + Result failedResult = new Result(FAILED, ZERO, null); assertFalse(failedResult.isOk(isStrict(false))); assertFalse(failedResult.isOk(isStrict(true))); @@ -63,7 +64,7 @@ public void failed_result_is_never_ok() { @Test public void undefined_result_is_only_ok_when_not_strict() { - Result undefinedResult = new Result(UNDEFINED, 0L, null); + Result undefinedResult = new Result(UNDEFINED, ZERO, null); assertTrue(undefinedResult.isOk(isStrict(false))); assertFalse(undefinedResult.isOk(isStrict(true))); @@ -71,7 +72,7 @@ public void undefined_result_is_only_ok_when_not_strict() { @Test public void pending_result_is_only_ok_when_not_strict() { - Result pendingResult = new Result(PENDING, 0L, null); + Result pendingResult = new Result(PENDING, ZERO, null); assertTrue(pendingResult.isOk(isStrict(false))); assertFalse(pendingResult.isOk(isStrict(true))); @@ -81,7 +82,7 @@ public void pending_result_is_only_ok_when_not_strict() { public void is_query_returns_true_for_the_status_of_the_result_object() { int checkCount = 0; for (Result.Type status : Result.Type.values()) { - Result result = new Result(status, 0L, null); + Result result = new Result(status, ZERO, null); assertTrue(result.is(result.getStatus())); checkCount += 1; @@ -93,7 +94,7 @@ public void is_query_returns_true_for_the_status_of_the_result_object() { public void is_query_returns_false_for_statuses_different_from_the_status_of_the_result_object() { int checkCount = 0; for (Result.Type resultStatus : Result.Type.values()) { - Result result = new Result(resultStatus, 0L, null); + Result result = new Result(resultStatus, ZERO, null); for (Result.Type status : Result.Type.values()) { if (status != resultStatus) { assertFalse(result.is(status)); diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java index 0e4e083e70..26267c4e29 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java @@ -3,7 +3,6 @@ import io.cucumber.core.api.options.CucumberOptions; import io.cucumber.core.api.plugin.Plugin; import io.cucumber.core.api.options.SnippetType; -import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.plugin.PluginFactory; @@ -12,6 +11,7 @@ import org.junit.jupiter.api.function.Executable; import java.net.URI; +import java.time.Clock; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; @@ -50,7 +50,7 @@ public void create_without_options() { assertFalse(runtimeOptions.isStrict()); assertThat(runtimeOptions.getFeaturePaths(), contains(uri("classpath:io/cucumber/core/options"))); assertThat(runtimeOptions.getGlue(), contains(uri("classpath:io/cucumber/core/options"))); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), runtimeOptions); assertThat(plugins.getPlugins(), hasSize(2)); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.ProgressFormatter"); @@ -65,7 +65,7 @@ public static URI uri(String str) { public void create_without_options_with_base_class_without_options() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(WithoutOptionsWithBaseClassWithoutOptions.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), runtimeOptions); assertThat(runtimeOptions.getFeaturePaths(), contains(uri("classpath:io/cucumber/core/options"))); assertThat(runtimeOptions.getGlue(), contains(uri("classpath:io/cucumber/core/options"))); @@ -111,7 +111,7 @@ private String getRegexpPattern(Object pattern) { public void create_default_summary_printer_when_no_summary_printer_plugin_is_defined() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(ClassWithNoSummaryPrinterPlugin.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), runtimeOptions); assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); } @@ -119,7 +119,7 @@ public void create_default_summary_printer_when_no_summary_printer_plugin_is_def public void inherit_plugin_from_baseclass() { RuntimeOptionsFactory runtimeOptionsFactory = new RuntimeOptionsFactory(SubClassWithFormatter.class); RuntimeOptions runtimeOptions = runtimeOptionsFactory.create(); - List plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), runtimeOptions).getPlugins(); + List plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), runtimeOptions).getPlugins(); assertPluginExists(plugins, "io.cucumber.core.plugin.JSONFormatter"); assertPluginExists(plugins, "io.cucumber.core.plugin.PrettyFormatter"); } diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index b79d8a2df3..9d42199e33 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -11,7 +11,6 @@ import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.plugin.Plugins; -import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import org.hamcrest.Description; import org.hamcrest.Matcher; @@ -26,6 +25,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.URI; +import java.time.Clock; import java.util.Collections; import java.util.HashSet; import java.util.Properties; @@ -148,35 +148,35 @@ public void assigns_glue() { @Test public void creates_html_formatter() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "html:some/dir", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); assertThat(plugins.getPlugins().get(0).getClass().getName(), is("io.cucumber.core.plugin.HTMLFormatter")); } @Test public void creates_progress_formatter_as_default() { RuntimeOptions options = new RuntimeOptions(asList("--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); assertThat(plugins.getPlugins().get(0).getClass().getName(), is("io.cucumber.core.plugin.ProgressFormatter")); } @Test public void creates_progress_formatter_when_no_formatter_plugin_is_specified() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "io.cucumber.core.plugin.AnyStepDefinitionReporter", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); assertThat(plugins.getPlugins(), hasItem(plugin("io.cucumber.core.plugin.ProgressFormatter"))); } @Test public void creates_default_summary_printer_when_no_summary_printer_plugin_is_specified() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "pretty", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); assertThat(plugins.getPlugins(), hasItem(plugin("io.cucumber.core.plugin.DefaultSummaryPrinter"))); } @Test public void creates_null_summary_printer() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "null_summary", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); assertThat(plugins.getPlugins(), hasItem(plugin("io.cucumber.core.plugin.NullSummaryPrinter"))); assertThat(plugins.getPlugins(), not(hasItem(plugin("io.cucumber.core.plugin.DefaultSummaryPrinter")))); } @@ -344,7 +344,7 @@ public void clobbers_line_filters_from_cli_if_features_specified_in_cucumber_opt public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucumber_options_property() { properties.setProperty("cucumber.options", "--plugin pretty"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:some/dir", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); assertThat(plugins.getPlugins(), hasItem(plugin("io.cucumber.core.plugin.PrettyFormatter"))); assertThat(plugins.getPlugins(), not(hasItem(plugin("io.cucumber.core.plugin.HTMLFormatter")))); } @@ -353,7 +353,7 @@ public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucum public void adds_to_formatter_plugins_with_add_plugin_option() { properties.setProperty("cucumber.options", "--add-plugin pretty"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "html:some/dir", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); assertThat(plugins.getPlugins(), hasItem(plugin("io.cucumber.core.plugin.HTMLFormatter"))); assertThat(plugins.getPlugins(), hasItem(plugin("io.cucumber.core.plugin.PrettyFormatter"))); } @@ -362,7 +362,7 @@ public void adds_to_formatter_plugins_with_add_plugin_option() { public void clobbers_summary_plugins_from_cli_if_summary_printer_specified_in_cucumber_options_property() { properties.setProperty("cucumber.options", "--plugin default_summary"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "null_summary", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); assertThat(plugins.getPlugins(), hasItem(plugin("io.cucumber.core.plugin.DefaultSummaryPrinter"))); assertThat(plugins.getPlugins(), not(hasItem(plugin("io.cucumber.core.plugin.NullSummaryPrinter")))); } @@ -371,7 +371,7 @@ public void clobbers_summary_plugins_from_cli_if_summary_printer_specified_in_cu public void adds_to_summary_plugins_with_add_plugin_option() { properties.setProperty("cucumber.options", "--add-plugin default_summary"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "null_summary", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); assertThat(plugins.getPlugins(), hasItem(plugin("io.cucumber.core.plugin.NullSummaryPrinter"))); assertThat(plugins.getPlugins(), hasItem(plugin("io.cucumber.core.plugin.DefaultSummaryPrinter"))); } @@ -380,7 +380,7 @@ public void adds_to_summary_plugins_with_add_plugin_option() { public void does_not_clobber_plugins_of_different_type_when_specifying_plugins_in_cucumber_options_property() { properties.setProperty("cucumber.options", "--plugin default_summary"); RuntimeOptions options = new RuntimeOptions(new Env(properties), asList("--plugin", "pretty", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); assertThat(plugins.getPlugins(), hasItem(plugin("io.cucumber.core.plugin.PrettyFormatter"))); assertThat(plugins.getPlugins(), hasItem(plugin("io.cucumber.core.plugin.DefaultSummaryPrinter"))); } @@ -420,7 +420,7 @@ public void ensure_less_than_1_thread_is_not_allowed() { @Test public void set_monochrome_on_color_aware_formatters() { RuntimeOptions options = new RuntimeOptions(new Env(), asList("--monochrome", "--plugin", AwareFormatter.class.getName())); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); AwareFormatter formatter = (AwareFormatter) plugins.getPlugins().get(0); assertThat(formatter.isMonochrome(), is(true)); } @@ -428,7 +428,7 @@ public void set_monochrome_on_color_aware_formatters() { @Test public void set_strict_on_strict_aware_formatters() { RuntimeOptions options = new RuntimeOptions(new Env(), asList("--strict", "--plugin", AwareFormatter.class.getName())); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(TimeService.SYSTEM), options); + Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); AwareFormatter formatter = (AwareFormatter) plugins.getPlugins().get(0); assertThat(formatter.isStrict(), is(true)); diff --git a/core/src/test/java/io/cucumber/core/plugin/AverageUsageStatisticStrategyTest.java b/core/src/test/java/io/cucumber/core/plugin/AverageUsageStatisticStrategyTest.java index 8ac9a0b9a8..8c240b3219 100644 --- a/core/src/test/java/io/cucumber/core/plugin/AverageUsageStatisticStrategyTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/AverageUsageStatisticStrategyTest.java @@ -2,37 +2,40 @@ import org.junit.Test; +import java.time.Duration; import java.util.Arrays; import java.util.Collections; +import static java.time.Duration.ofMillis; import static org.junit.Assert.assertEquals; public class AverageUsageStatisticStrategyTest { + @Test public void calculate() { UsageFormatter.AverageUsageStatisticStrategy averageUsageStatisticStrategy = new UsageFormatter.AverageUsageStatisticStrategy(); - Long result = averageUsageStatisticStrategy.calculate(Arrays.asList(1L, 2L, 3L)); - assertEquals(result, Long.valueOf(2)); + Duration result = averageUsageStatisticStrategy.calculate(Arrays.asList(ofMillis(1L), ofMillis(2L), ofMillis(3L))); + assertEquals(result, ofMillis(2)); } @Test public void calculateNull() { UsageFormatter.AverageUsageStatisticStrategy averageUsageStatisticStrategy = new UsageFormatter.AverageUsageStatisticStrategy(); - Long result = averageUsageStatisticStrategy.calculate(null); - assertEquals(result, Long.valueOf(0)); + Duration result = averageUsageStatisticStrategy.calculate(null); + assertEquals(result, ofMillis(0)); } @Test public void calculateEmptyList() { UsageFormatter.AverageUsageStatisticStrategy averageUsageStatisticStrategy = new UsageFormatter.AverageUsageStatisticStrategy(); - Long result = averageUsageStatisticStrategy.calculate(Collections.emptyList()); - assertEquals(result, Long.valueOf(0)); + Duration result = averageUsageStatisticStrategy.calculate(Collections.emptyList()); + assertEquals(result, ofMillis(0)); } @Test public void calculateListWithNulls() { UsageFormatter.AverageUsageStatisticStrategy averageUsageStatisticStrategy = new UsageFormatter.AverageUsageStatisticStrategy(); - Long result = averageUsageStatisticStrategy.calculate(Arrays.asList(3L, null)); - assertEquals(result, Long.valueOf(0)); + Duration result = averageUsageStatisticStrategy.calculate(Arrays.asList(ofMillis(3L), null)); + assertEquals(result, ofMillis(0)); } } diff --git a/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java index c13039d533..ed63d9d870 100644 --- a/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java @@ -14,6 +14,7 @@ import java.io.File; import java.io.InputStreamReader; import java.net.URL; +import java.time.Duration; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.HashMap; @@ -27,6 +28,7 @@ import static io.cucumber.core.runner.TestHelper.createWriteHookAction; import static io.cucumber.core.runner.TestHelper.feature; import static io.cucumber.core.runner.TestHelper.result; +import static java.time.Duration.ofMillis; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -43,7 +45,7 @@ public class HTMLFormatterTest { private final List> hooks = new ArrayList<>(); private final List hookLocations = new ArrayList<>(); private final List> hookActions = new ArrayList<>(); - private Long stepDuration = null; + private Duration stepDuration = null; private URL outputDir; @@ -125,7 +127,7 @@ public void should_handle_a_single_scenario() throws Throwable { stepsToResult.put("second step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); stepsToLocation.put("second step", "path/step_definitions.java:7"); - stepDuration = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -181,7 +183,7 @@ public void should_handle_backgound() throws Throwable { stepsToLocation.put("first step", "path/step_definitions.java:3"); stepsToLocation.put("second step", "path/step_definitions.java:7"); stepsToLocation.put("third step", "path/step_definitions.java:11"); - stepDuration = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -267,7 +269,7 @@ public void should_handle_scenario_outline() throws Throwable { stepsToLocation.put("first step", "path/step_definitions.java:3"); stepsToLocation.put("second step", "path/step_definitions.java:7"); stepsToLocation.put("third step", "path/step_definitions.java:11"); - stepDuration = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -376,7 +378,7 @@ public void should_handle_before_hooks() throws Throwable { stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); hooks.add(TestHelper.hookEntry("before", result("passed"))); - stepDuration = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -412,7 +414,7 @@ public void should_handle_after_hooks() throws Throwable { stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); hooks.add(TestHelper.hookEntry("after", result("passed"))); - stepDuration = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -452,7 +454,7 @@ public void should_handle_after_step_hooks() throws Throwable { stepsToLocation.put("second step", "path/step_definitions.java:4"); hooks.add(TestHelper.hookEntry("afterstep", result("passed"))); hooks.add(TestHelper.hookEntry("afterstep", result("passed"))); - stepDuration = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -508,7 +510,7 @@ public void should_handle_output_from_before_hooks() throws Throwable { stepsToLocation.put("first step", "path/step_definitions.java:3"); hooks.add(TestHelper.hookEntry("before", result("passed"))); hookActions.add(createWriteHookAction("printed from hook")); - stepDuration = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -546,7 +548,7 @@ public void should_handle_output_from_after_hooks() throws Throwable { stepsToLocation.put("first step", "path/step_definitions.java:3"); hooks.add(TestHelper.hookEntry("after", result("passed"))); hookActions.add(createWriteHookAction("printed from hook")); - stepDuration = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -587,7 +589,7 @@ public void should_handle_output_from_after_step_hooks() throws Throwable { stepsToLocation.put("second step", "path/step_definitions.java:4"); hooks.add(TestHelper.hookEntry("afterstep", result("passed"))); hookActions.add(createWriteHookAction("printed from hook")); - stepDuration = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -639,7 +641,7 @@ public void should_handle_text_embeddings_from_before_hooks() throws Throwable { stepsToLocation.put("first step", "path/step_definitions.java:3"); hooks.add(TestHelper.hookEntry("before", result("passed"))); hookActions.add(createEmbedHookAction("embedded from hook".getBytes("US-ASCII"), "text/ascii")); - stepDuration = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -738,7 +740,7 @@ private void runFeaturesWithFormatter(URL outputDir) throws Throwable { hooks.add(TestHelper.hookEntry("after", result("passed"))); hookActions.add(createEmbedHookAction("fakedata".getBytes("US-ASCII"), "image/png")); hookActions.add(createEmbedHookAction("dodgy stack trace here".getBytes("US-ASCII"), "text/plain")); - stepDuration = 1L; + stepDuration = ofMillis(1L); runFeaturesWithFormatter(f); } diff --git a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java index 257309610f..58c6f1592f 100755 --- a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java @@ -3,6 +3,7 @@ import static io.cucumber.core.runner.TestHelper.createEmbedHookAction; import static io.cucumber.core.runner.TestHelper.createWriteHookAction; import static io.cucumber.core.runner.TestHelper.result; +import static java.time.Duration.ofMillis; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.junit.Assert.assertThat; @@ -13,6 +14,7 @@ import java.io.File; import java.io.IOException; import java.net.URI; +import java.time.Duration; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.HashMap; @@ -37,7 +39,7 @@ import io.cucumber.core.runner.TestBackendSupplier; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.TimeServiceStub; +import io.cucumber.core.runner.ClockStub; import io.cucumber.core.runtime.Runtime; public class JSONFormatterTest { @@ -48,7 +50,7 @@ public class JSONFormatterTest { private final List> hooks = new ArrayList<>(); private final List hookLocations = new ArrayList<>(); private final List> hookActions = new ArrayList<>(); - private Long stepDurationMillis = 0L; + private Duration stepDuration = Duration.ZERO; @Test public void featureWithOutlineTest() { @@ -126,7 +128,7 @@ public void should_format_scenario_with_a_passed_step() { features.add(feature); stepsToResult.put("there are bananas", result("passed")); stepsToLocation.put("there are bananas", "StepDefs.there_are_bananas()"); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -180,7 +182,7 @@ public void should_format_scenario_with_a_failed_step() { features.add(feature); stepsToResult.put("there are bananas", result("failed")); stepsToLocation.put("there are bananas", "StepDefs.there_are_bananas()"); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -238,7 +240,7 @@ public void should_format_scenario_outline_with_one_example() { features.add(feature); stepsToResult.put("there are bananas", result("passed")); stepsToLocation.put("there are bananas", "StepDefs.there_are_bananas()"); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -302,7 +304,7 @@ public void should_format_feature_with_background() { stepsToLocation.put("there are bananas", "StepDefs.there_are_bananas()"); stepsToLocation.put("the monkey eats bananas", "StepDefs.monkey_eats_bananas()"); stepsToLocation.put("the monkey eats more bananas", "StepDefs.monkey_eats_more_bananas()"); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -422,7 +424,7 @@ public void should_format_feature_and_scenario_with_tags() { features.add(feature); stepsToResult.put("the monkey eats more bananas", result("passed")); stepsToLocation.put("the monkey eats more bananas", "StepDefs.monkey_eats_more_bananas()"); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -508,7 +510,7 @@ public void should_format_scenario_with_hooks() { hooks.add(TestHelper.hookEntry("after", result("passed"))); hookLocations.add("Hooks.before_hook_1()"); hookLocations.add("Hooks.after_hook_1()"); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -593,7 +595,7 @@ public void should_add_step_hooks_to_step() { hookLocations.add("Hooks.beforestep_hooks_1()"); hookLocations.add("Hooks.afterstep_hooks_1()"); hookLocations.add("Hooks.afterstep_hooks_2()"); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -724,7 +726,7 @@ public void should_handle_write_from_a_hook() { hooks.add(TestHelper.hookEntry("before", result("passed"))); hookLocations.add("Hooks.before_hook_1()"); hookActions.add(createWriteHookAction("printed from hook")); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -795,7 +797,7 @@ public void should_handle_embed_from_a_hook() { hooks.add(TestHelper.hookEntry("before", result("passed"))); hookLocations.add("Hooks.before_hook_1()"); hookActions.add(createEmbedHookAction(new byte[]{1, 2, 3}, "mime-type;base64")); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -869,7 +871,7 @@ public void should_format_scenario_with_a_step_with_a_doc_string() { features.add(feature); stepsToResult.put("there are bananas", result("passed")); stepsToLocation.put("there are bananas", "StepDefs.there_are_bananas()"); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -930,7 +932,7 @@ public void should_format_scenario_with_a_step_with_a_doc_string_and_content_typ features.add(feature); stepsToResult.put("there are bananas", result("passed")); stepsToLocation.put("there are bananas", "StepDefs.there_are_bananas()"); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -991,7 +993,7 @@ public void should_format_scenario_with_a_step_with_a_data_table() { features.add(feature); stepsToResult.put("there are bananas", result("passed")); stepsToLocation.put("there are bananas", "StepDefs.there_are_bananas()"); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -1067,7 +1069,7 @@ public void should_handle_several_features() { stepsToResult.put("there are oranges", result("passed")); stepsToLocation.put("there are bananas", "StepDefs.there_are_bananas()"); stepsToLocation.put("there are oranges", "StepDefs.there_are_oranges()"); - stepDurationMillis = 1L; + stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -1172,7 +1174,7 @@ public List getSnippet(PickleStep step, String keyword, SnippetType.Func return singletonList("TEST SNIPPET"); } }; - final EventBus bus = new TimeServiceEventBus(new TimeServiceStub(1234)); + final EventBus bus = new TimeServiceEventBus(new ClockStub(ofMillis(1234L))); Appendable stringBuilder = new StringBuilder(); @@ -1209,7 +1211,7 @@ public List getSnippet(PickleStep step, String keyword, SnippetType.Func return singletonList("TEST SNIPPET"); } }; - final EventBus bus = new TimeServiceEventBus(new TimeServiceStub(1234)); + final EventBus bus = new TimeServiceEventBus(new ClockStub(ofMillis(1234L))); Appendable stringBuilder = new StringBuilder(); @@ -1237,7 +1239,7 @@ private String runFeaturesWithFormatter() { .withHooks(hooks) .withHookLocations(hookLocations) .withHookActions(hookActions) - .withTimeServiceIncrement(stepDurationMillis) + .withTimeServiceIncrement(stepDuration) .build() .run(); diff --git a/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java index 789f883299..9090f135ac 100644 --- a/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java @@ -1,6 +1,7 @@ package io.cucumber.core.plugin; import static io.cucumber.core.runner.TestHelper.result; +import static java.time.Duration.ZERO; import static java.util.Arrays.asList; import static org.junit.Assert.assertTrue; @@ -11,6 +12,7 @@ import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; +import java.time.Duration; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.HashMap; @@ -37,7 +39,7 @@ public class JUnitFormatterTest { private final List> hooks = new ArrayList<>(); private final List hookLocations = new ArrayList<>(); private final List> hookActions = new ArrayList<>(); - private Long stepDurationMillis = null; + private Duration stepDuration = null; @Test public void featureSimpleTest() throws Exception { @@ -76,7 +78,7 @@ public void should_format_passed_scenario() throws Throwable { stepsToResult.put("first step", result("passed")); stepsToResult.put("second step", result("passed")); stepsToResult.put("third step", result("passed")); - stepDurationMillis = 1L; + stepDuration = Duration.ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -106,7 +108,7 @@ public void should_format_skipped_scenario() throws Throwable { stepsToResult.put("first step", result("skipped", exception)); stepsToResult.put("second step", result("skipped")); stepsToResult.put("third step", result("skipped")); - stepDurationMillis = 1L; + stepDuration = Duration.ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -139,7 +141,7 @@ public void should_format_pending_scenario() throws Throwable { stepsToResult.put("first step", result("pending")); stepsToResult.put("second step", result("skipped")); stepsToResult.put("third step", result("undefined")); - stepDurationMillis = 1L; + stepDuration = Duration.ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -168,7 +170,7 @@ public void should_format_failed_scenario() throws Throwable { stepsToResult.put("first step", result("passed")); stepsToResult.put("second step", result("passed")); stepsToResult.put("third step", result("failed")); - stepDurationMillis = 1L; + stepDuration = Duration.ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -201,7 +203,7 @@ public void should_handle_failure_in_before_hook() throws Throwable { stepsToResult.put("second step", result("passed")); stepsToResult.put("third step", result("passed")); hooks.add(TestHelper.hookEntry("before", result("failed"))); - stepDurationMillis = 1L; + stepDuration = Duration.ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -234,7 +236,7 @@ public void should_handle_pending_in_before_hook() throws Throwable { stepsToResult.put("second step", result("skipped")); stepsToResult.put("third step", result("skipped")); hooks.add(TestHelper.hookEntry("before", result("pending"))); - stepDurationMillis = 1L; + stepDuration = Duration.ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -265,7 +267,7 @@ public void should_handle_failure_in_before_hook_with_background() throws Throwa stepsToResult.put("second step", result("passed")); stepsToResult.put("third step", result("passed")); hooks.add(TestHelper.hookEntry("before", result("failed"))); - stepDurationMillis = 1L; + stepDuration = Duration.ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -298,7 +300,7 @@ public void should_handle_failure_in_after_hook() throws Throwable { stepsToResult.put("second step", result("passed")); stepsToResult.put("third step", result("passed")); hooks.add(TestHelper.hookEntry("after", result("failed"))); - stepDurationMillis = 1L; + stepDuration = Duration.ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -330,7 +332,7 @@ public void should_accumulate_time_from_steps_and_hooks() throws Throwable { stepsToResult.put("second step", result("passed")); hooks.add(TestHelper.hookEntry("before", result("passed"))); hooks.add(TestHelper.hookEntry("after", result("passed"))); - stepDurationMillis = 1L; + stepDuration = Duration.ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -363,7 +365,7 @@ public void should_format_scenario_outlines() throws Throwable { stepsToResult.put("first step \"b\"", result("passed")); stepsToResult.put("second step", result("passed")); stepsToResult.put("third step", result("passed")); - stepDurationMillis = 1L; + stepDuration = Duration.ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -410,7 +412,7 @@ public void should_format_scenario_outlines_with_multiple_examples() throws Thro stepsToResult.put("first step \"d\"", result("passed")); stepsToResult.put("second step", result("passed")); stepsToResult.put("third step", result("passed")); - stepDurationMillis = 1L; + stepDuration = Duration.ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -465,7 +467,7 @@ public void should_format_scenario_outlines_with_arguments_in_name() throws Thro stepsToResult.put("first step \"b\"", result("passed")); stepsToResult.put("second step", result("passed")); stepsToResult.put("third step", result("passed")); - stepDurationMillis = 1L; + stepDuration = Duration.ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -513,7 +515,7 @@ private File runFeaturesWithJunitFormatter(final List featurePaths, bool .withHookLocations(hookLocations) .withHookActions(hookActions) .withTimeServiceType(TestHelper.TimeServiceType.FIXED_INCREMENT) - .withTimeServiceIncrement(0L) + .withTimeServiceIncrement(ZERO) .build() .run(); @@ -532,7 +534,7 @@ private String runFeaturesWithFormatter() throws IOException { .withHooks(hooks) .withHookLocations(hookLocations) .withHookActions(hookActions) - .withTimeServiceIncrement(stepDurationMillis) + .withTimeServiceIncrement(stepDuration) .build() .run(); diff --git a/core/src/test/java/io/cucumber/core/plugin/JsonParallelRuntimeTest.java b/core/src/test/java/io/cucumber/core/plugin/JsonParallelRuntimeTest.java index 1930b9f03f..9ce003a6fc 100644 --- a/core/src/test/java/io/cucumber/core/plugin/JsonParallelRuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JsonParallelRuntimeTest.java @@ -1,10 +1,11 @@ package io.cucumber.core.plugin; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.TimeServiceStub; +import io.cucumber.core.runner.ClockStub; import io.cucumber.core.runtime.Runtime; import org.junit.Test; +import static java.time.Duration.ZERO; import static org.junit.Assert.assertThat; import static uk.co.datumedge.hamcrest.json.SameJSONAs.sameJSONAs; @@ -20,7 +21,7 @@ public void testSingleFeature() { .withArgs("--threads", "3", "src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.feature") .withAdditionalPlugins(new JSONFormatter(parallel)) - .withEventBus(new TimeServiceEventBus(new TimeServiceStub(0))) + .withEventBus(new TimeServiceEventBus(new ClockStub(ZERO))) .build() .run(); @@ -30,7 +31,7 @@ public void testSingleFeature() { .withArgs("--threads", "1", "src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.feature") .withAdditionalPlugins(new JSONFormatter(serial)) - .withEventBus(new TimeServiceEventBus(new TimeServiceStub(0))) + .withEventBus(new TimeServiceEventBus(new ClockStub(ZERO))) .build() .run(); @@ -46,7 +47,7 @@ public void testMultipleFeatures() { "src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.feature", "src/test/resources/io/cucumber/core/plugin/FormatterInParallel.feature") .withAdditionalPlugins(new JSONFormatter(parallel)) - .withEventBus(new TimeServiceEventBus(new TimeServiceStub(0))) + .withEventBus(new TimeServiceEventBus(new ClockStub(ZERO))) .build() .run(); @@ -58,7 +59,7 @@ public void testMultipleFeatures() { "src/test/resources/io/cucumber/core/plugin/JSONPrettyFormatterTest.feature", "src/test/resources/io/cucumber/core/plugin/FormatterInParallel.feature") .withAdditionalPlugins(new JSONFormatter(serial)) - .withEventBus(new TimeServiceEventBus(new TimeServiceStub(0))) + .withEventBus(new TimeServiceEventBus(new ClockStub(ZERO))) .build() .run(); diff --git a/core/src/test/java/io/cucumber/core/plugin/MedianUsageStatisticStrategyTest.java b/core/src/test/java/io/cucumber/core/plugin/MedianUsageStatisticStrategyTest.java index b5eda8b711..f164348a61 100644 --- a/core/src/test/java/io/cucumber/core/plugin/MedianUsageStatisticStrategyTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/MedianUsageStatisticStrategyTest.java @@ -2,44 +2,46 @@ import org.junit.Test; +import java.time.Duration; import java.util.Arrays; import java.util.Collections; +import static java.time.Duration.ofMillis; import static org.junit.Assert.assertEquals; public class MedianUsageStatisticStrategyTest { @Test public void calculateOddEntries() throws Exception { UsageFormatter.MedianUsageStatisticStrategy medianUsageStatisticStrategy = new UsageFormatter.MedianUsageStatisticStrategy(); - Long result = medianUsageStatisticStrategy.calculate(Arrays.asList(1L, 2L, 3L)); - assertEquals(result, Long.valueOf(2)); + Duration result = medianUsageStatisticStrategy.calculate(Arrays.asList(ofMillis(1L), ofMillis(2L), ofMillis(3L))); + assertEquals(result, ofMillis(2)); } @Test public void calculateEvenEntries() throws Exception { UsageFormatter.MedianUsageStatisticStrategy medianUsageStatisticStrategy = new UsageFormatter.MedianUsageStatisticStrategy(); - Long result = medianUsageStatisticStrategy.calculate(Arrays.asList(1L, 3L, 10L, 5L)); - assertEquals(result, Long.valueOf(4)); + Duration result = medianUsageStatisticStrategy.calculate(Arrays.asList(ofMillis(1L), ofMillis(3L), ofMillis(10L), ofMillis(5L))); + assertEquals(result, ofMillis(4)); } @Test public void calculateNull() throws Exception { UsageFormatter.MedianUsageStatisticStrategy medianUsageStatisticStrategy = new UsageFormatter.MedianUsageStatisticStrategy(); - Long result = medianUsageStatisticStrategy.calculate(null); - assertEquals(result, Long.valueOf(0)); + Duration result = medianUsageStatisticStrategy.calculate(null); + assertEquals(result, ofMillis(0)); } @Test public void calculateEmptylist() throws Exception { UsageFormatter.MedianUsageStatisticStrategy medianUsageStatisticStrategy = new UsageFormatter.MedianUsageStatisticStrategy(); - Long result = medianUsageStatisticStrategy.calculate(Collections.emptyList()); - assertEquals(result, Long.valueOf(0)); + Duration result = medianUsageStatisticStrategy.calculate(Collections.emptyList()); + assertEquals(result, ofMillis(0)); } @Test public void calculateListWithNulls() throws Exception { UsageFormatter.MedianUsageStatisticStrategy medianUsageStatisticStrategy = new UsageFormatter.MedianUsageStatisticStrategy(); - Long result = medianUsageStatisticStrategy.calculate(Arrays.asList(1L, null, 3L)); - assertEquals(result, Long.valueOf(0)); + Duration result = medianUsageStatisticStrategy.calculate(Arrays.asList(ofMillis(1L), null, ofMillis(3L))); + assertEquals(result, ofMillis(0)); } } diff --git a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java index 414cb8f1a6..58bfd252b7 100644 --- a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java @@ -7,7 +7,7 @@ import io.cucumber.core.event.EventBus; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.TimeServiceStub; +import io.cucumber.core.runner.ClockStub; import org.junit.Test; import java.io.ByteArrayOutputStream; @@ -21,6 +21,7 @@ import java.net.URL; import static io.cucumber.core.options.TestPluginOption.parse; +import static java.time.Duration.ZERO; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; @@ -90,10 +91,10 @@ public void plugin_does_not_buffer_its_output() { fc = new PluginFactory(); ProgressFormatter plugin = (ProgressFormatter) fc.create(parse("progress")); - EventBus bus = new TimeServiceEventBus(new TimeServiceStub(0)); + EventBus bus = new TimeServiceEventBus(new ClockStub(ZERO)); plugin.setEventPublisher(bus); - Result result = new Result(Result.Type.PASSED, 0L, null); - TestStepFinished event = new TestStepFinished(bus.getTime(), bus.getTimeMillis(), mock(TestCase.class), mock(PickleStepTestStep.class), result); + Result result = new Result(Result.Type.PASSED, ZERO, null); + TestStepFinished event = new TestStepFinished(bus.getInstant(), mock(TestCase.class), mock(PickleStepTestStep.class), result); bus.send(event); assertThat(mockSystemOut.toString(), is(not(""))); diff --git a/core/src/test/java/io/cucumber/core/plugin/RerunFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/RerunFormatterTest.java index b2ca105397..04203f6789 100755 --- a/core/src/test/java/io/cucumber/core/plugin/RerunFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/RerunFormatterTest.java @@ -12,6 +12,7 @@ import java.util.Map; import static io.cucumber.core.runner.TestHelper.result; +import static java.time.Duration.ZERO; import static org.junit.Assert.assertEquals; public class RerunFormatterTest { @@ -211,7 +212,7 @@ private String runFeaturesWithFormatter(boolean isStrict) { .withFeatures(features) .withStepsToResult(stepsToResult) .withHooks(hooks) - .withTimeServiceIncrement(0L) + .withTimeServiceIncrement(ZERO) .build() .run(); diff --git a/core/src/test/java/io/cucumber/core/plugin/StatsTest.java b/core/src/test/java/io/cucumber/core/plugin/StatsTest.java index a34e1f1331..56b8883732 100755 --- a/core/src/test/java/io/cucumber/core/plugin/StatsTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/StatsTest.java @@ -1,6 +1,9 @@ package io.cucumber.core.plugin; -import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static java.time.Duration.ofHours; +import static java.time.Duration.ofMillis; +import static java.time.Duration.ofMinutes; +import static java.time.Duration.ofSeconds; import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.endsWith; @@ -10,14 +13,13 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.time.Instant; import java.util.Locale; import org.junit.Test; public class StatsTest { - private static final long ANY_TIME = 1234567890; - private static final long ONE_MILLI_SECOND = MILLISECONDS.toNanos(1); - private static final long ONE_HOUR = 60 * Stats.ONE_MINUTE; + private static final Instant ANY_TIME = Instant.ofEpochMilli(1234567890); @Test public void should_print_zero_scenarios_zero_steps_if_nothing_has_executed() { @@ -106,7 +108,7 @@ public void should_report_the_difference_between_finish_time_and_start_time() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); counter.setStartTime(ANY_TIME); - counter.setFinishTime(ANY_TIME + 4*ONE_MILLI_SECOND); + counter.setFinishTime(ANY_TIME.plus(ofMillis(4))); counter.printStats(new PrintStream(baos)); assertThat(baos.toString(), endsWith(String.format( @@ -119,7 +121,7 @@ public void should_print_minutes_seconds_and_milliseconds() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); counter.setStartTime(ANY_TIME); - counter.setFinishTime(ANY_TIME + Stats.ONE_MINUTE + Stats.ONE_SECOND + ONE_MILLI_SECOND); + counter.setFinishTime(ANY_TIME.plus(ofMinutes(1)).plus(ofSeconds(1)).plus(ofMillis(1))); counter.printStats(new PrintStream(baos)); assertThat(baos.toString(), endsWith(String.format( @@ -132,7 +134,7 @@ public void should_print_minutes_instead_of_hours() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); counter.setStartTime(ANY_TIME); - counter.setFinishTime(ANY_TIME + ONE_HOUR + Stats.ONE_MINUTE); + counter.setFinishTime(ANY_TIME.plus(ofHours(1)).plus(ofMinutes(1))); counter.printStats(new PrintStream(baos)); assertThat(baos.toString(), endsWith(String.format( @@ -146,7 +148,7 @@ public void should_use_locale_for_decimal_separator() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); counter.setStartTime(ANY_TIME); - counter.setFinishTime(ANY_TIME + Stats.ONE_MINUTE + Stats.ONE_SECOND + ONE_MILLI_SECOND); + counter.setFinishTime(ANY_TIME.plus(ofMinutes(1)).plus(ofSeconds(1)).plus(ofMillis(1))); counter.printStats(new PrintStream(baos)); assertThat(baos.toString(), endsWith(String.format("1m1,001s%n"))); diff --git a/core/src/test/java/io/cucumber/core/plugin/TestNGFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/TestNGFormatterTest.java index b8d1031eee..b47280a125 100644 --- a/core/src/test/java/io/cucumber/core/plugin/TestNGFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/TestNGFormatterTest.java @@ -14,6 +14,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.PrintWriter; +import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -22,6 +23,8 @@ import java.util.AbstractMap.SimpleEntry; import static io.cucumber.core.runner.TestHelper.result; +import static java.time.Duration.ZERO; +import static java.time.Duration.ofMillis; import static org.junit.Assert.assertTrue; public final class TestNGFormatterTest { @@ -32,7 +35,7 @@ public final class TestNGFormatterTest { private final List> hooks = new ArrayList<>(); private final List hookLocations = new ArrayList<>(); private final List> hookActions = new ArrayList<>(); - private Long stepDurationMillis = null; + private Duration stepDuration = null; @Test public final void testScenarioWithUndefinedSteps() throws Throwable { @@ -43,7 +46,7 @@ public final void testScenarioWithUndefinedSteps() throws Throwable { " Then step\n"); features.add(feature); stepsToResult.put("step", result("undefined")); - stepDurationMillis = 0L; + stepDuration = ZERO; String actual = runFeaturesWithFormatter(false); assertXmlEqual("" + "" + @@ -67,7 +70,7 @@ public void testScenarioWithUndefinedStepsStrict() throws Throwable { " Then step\n"); features.add(feature); stepsToResult.put("step", result("undefined")); - stepDurationMillis = 0L; + stepDuration = ZERO; String actual = runFeaturesWithFormatter(true); assertXmlEqual("" + "" + @@ -99,7 +102,7 @@ public final void testScenarioWithPendingSteps() throws Throwable { features.add(feature); stepsToResult.put("step1", result("pending")); stepsToResult.put("step2", result("skipped")); - stepDurationMillis = 0L; + stepDuration = ZERO; String actual = runFeaturesWithFormatter(false); assertXmlEqual("" + "" + @@ -124,7 +127,7 @@ public void testScenarioWithFailedSteps() throws Throwable { features.add(feature); stepsToResult.put("step1", result("failed", new TestNGException("message", "stacktrace"))); stepsToResult.put("step2", result("skipped")); - stepDurationMillis = 0L; + stepDuration = ZERO; String actual = runFeaturesWithFormatter(false); assertXmlEqual("" + "" + @@ -155,7 +158,7 @@ public final void testScenarioWithPassedSteps() throws Throwable { " Then step\n"); features.add(feature); stepsToResult.put("step", result("passed")); - stepDurationMillis = 0L; + stepDuration = ZERO; String actual = runFeaturesWithFormatter(false); assertXmlEqual("" + "" + @@ -183,7 +186,7 @@ public void testScenarioWithBackground() throws Throwable { features.add(feature); stepsToResult.put("background", result("undefined")); stepsToResult.put("step", result("undefined")); - stepDurationMillis = 0L; + stepDuration = ZERO; String actual = runFeaturesWithFormatter(false); assertXmlEqual("" + "" + @@ -211,7 +214,7 @@ public void testScenarioOutlineWithExamples() throws Throwable { " | 2 |\n"); features.add(feature); stepsToResult.put("step", result("undefined")); - stepDurationMillis = 0L; + stepDuration = ZERO; String actual = runFeaturesWithFormatter(false); assertXmlEqual("" + "" + @@ -247,7 +250,7 @@ public void testDurationCalculationOfStepsAndHooks() throws Throwable { stepsToResult.put("step", result("passed")); hooks.add(TestHelper.hookEntry("before", result("passed"))); hooks.add(TestHelper.hookEntry("after", result("passed"))); - stepDurationMillis = 1L; + stepDuration = ofMillis(1); String actual = runFeaturesWithFormatter(false); assertXmlEqual("" + "" + @@ -276,7 +279,7 @@ public void testScenarioWithFailedBeforeHook() throws Throwable { features.add(feature); stepsToResult.put("step", result("skipped")); hooks.add(TestHelper.hookEntry("before", result("failed", new TestNGException("message", "stacktrace")))); - stepDurationMillis = 0L; + stepDuration = ZERO; String actual = runFeaturesWithFormatter(false); assertXmlEqual("" + "" + @@ -308,7 +311,7 @@ public void testScenarioWithFailedAfterHook() throws Throwable { features.add(feature); stepsToResult.put("step", result("passed")); hooks.add(TestHelper.hookEntry("after", result("failed", new TestNGException("message", "stacktrace")))); - stepDurationMillis = 0L; + stepDuration = ZERO; String actual = runFeaturesWithFormatter(false); assertXmlEqual("" + "" + @@ -357,7 +360,7 @@ private String runFeaturesWithFormatter(boolean strict) throws IOException { .withHooks(hooks) .withHookLocations(hookLocations) .withHookActions(hookActions) - .withTimeServiceIncrement(stepDurationMillis) + .withTimeServiceIncrement(stepDuration) .build() .run(); diff --git a/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java index 468fd81d35..21ac356767 100644 --- a/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java @@ -5,12 +5,16 @@ import io.cucumber.core.model.CucumberFeature; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; +import gherkin.deps.com.google.gson.JsonDeserializer; + import org.junit.Before; import org.junit.Test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.time.Duration; +import java.time.Instant; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; @@ -18,7 +22,6 @@ import java.util.List; import java.util.Map; import java.util.Scanner; -import java.util.concurrent.TimeUnit; import static io.cucumber.core.runner.TestHelper.feature; import static io.cucumber.core.runner.TestHelper.result; @@ -38,9 +41,13 @@ public int compare(TimelineFormatter.TestData o1, TimelineFormatter.TestData o2) private static final String REPORT_TEMPLATE_RESOURCE_DIR = "src/main/resources/io/cucumber/core/plugin/timeline"; private static final String REPORT_JS = "report.js"; - private static final long STEP_DURATION_MS = 1000; + private static final Duration STEP_DURATION = Duration.ofMillis(1000); - private final Gson gson = new GsonBuilder().create(); + private final Gson gson = new GsonBuilder().registerTypeAdapter(Instant.class, (JsonDeserializer) (json, + type, jsonDeserializationContext) -> { + return json.isJsonObject() ? Instant.ofEpochSecond(json.getAsJsonObject().get("seconds").getAsLong()) : Instant.ofEpochMilli(json.getAsLong()); + }).create(); + private final Map stepsToResult = new HashMap<>(); private final Map stepsToLocation = new HashMap<>(); @@ -128,7 +135,7 @@ public void shouldWriteItemsCorrectlyToReportJsWhenRunInParallel() throws Throwa .withRuntimeArgs("--plugin", "timeline:" + reportDir.getAbsolutePath(), "--threads", "3") .withStepsToResult(stepsToResult) .withStepsToLocation(stepsToLocation) - .withTimeServiceIncrement(TimeUnit.MILLISECONDS.toNanos(STEP_DURATION_MS)) + .withTimeServiceIncrement(STEP_DURATION) .build() .run(); @@ -233,7 +240,7 @@ private void runFormatterWithPlugin() { .withRuntimeArgs("--plugin", "timeline:" + reportDir.getAbsolutePath()) .withStepsToResult(stepsToResult) .withStepsToLocation(stepsToLocation) - .withTimeServiceIncrement(STEP_DURATION_MS) + .withTimeServiceIncrement(STEP_DURATION) .build() .run(); } diff --git a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java index ed19778e05..f6f49316bf 100644 --- a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java @@ -1,5 +1,6 @@ package io.cucumber.core.plugin; +import static java.time.Duration.ZERO; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -17,7 +18,7 @@ import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.runner.TimeServiceStub; +import io.cucumber.core.runner.ClockStub; public class UndefinedStepsTrackerTest { @@ -44,7 +45,7 @@ public void removes_duplicates() { @Test public void uses_given_when_then_keywords() throws IOException { - EventBus bus = new TimeServiceEventBus(new TimeServiceStub(0)); + EventBus bus = new TimeServiceEventBus(new ClockStub(ZERO)); UndefinedStepsTracker tracker = new UndefinedStepsTracker(); tracker.setEventPublisher(bus); CucumberFeature feature = TestHelper.feature("path/test.feature", "" + @@ -59,7 +60,7 @@ public void uses_given_when_then_keywords() throws IOException { @Test public void converts_and_to_previous_step_keyword() throws IOException { - EventBus bus = new TimeServiceEventBus(new TimeServiceStub(0)); + EventBus bus = new TimeServiceEventBus(new ClockStub(ZERO)); UndefinedStepsTracker tracker = new UndefinedStepsTracker(); tracker.setEventPublisher(bus); CucumberFeature feature = TestHelper.feature("path/test.feature", "" + @@ -75,7 +76,7 @@ public void converts_and_to_previous_step_keyword() throws IOException { @Test public void backtrack_into_background_to_find_step_keyword() throws IOException { - EventBus bus = new TimeServiceEventBus(new TimeServiceStub(0)); + EventBus bus = new TimeServiceEventBus(new ClockStub(ZERO)); UndefinedStepsTracker tracker = new UndefinedStepsTracker(); tracker.setEventPublisher(bus); CucumberFeature feature = TestHelper.feature("path/test.feature", "" + @@ -91,12 +92,12 @@ public void backtrack_into_background_to_find_step_keyword() throws IOException } private void sendTestSourceRead(EventBus bus, CucumberFeature feature) { - bus.send(new TestSourceRead(bus.getTime(), feature.getUri().toString(), feature.getSource())); + bus.send(new TestSourceRead(bus.getInstant(), feature.getUri().toString(), feature.getSource())); } @Test public void doesnt_try_to_use_star_keyword() throws IOException { - EventBus bus = new TimeServiceEventBus(new TimeServiceStub(0)); + EventBus bus = new TimeServiceEventBus(new ClockStub(ZERO)); UndefinedStepsTracker tracker = new UndefinedStepsTracker(); tracker.setEventPublisher(bus); CucumberFeature feature = TestHelper.feature("path/test.feature", "" + @@ -112,7 +113,7 @@ public void doesnt_try_to_use_star_keyword() throws IOException { @Test public void star_keyword_becomes_given_when_no_previous_step() throws IOException { - EventBus bus = new TimeServiceEventBus(new TimeServiceStub(0)); + EventBus bus = new TimeServiceEventBus(new ClockStub(ZERO)); UndefinedStepsTracker tracker = new UndefinedStepsTracker(); tracker.setEventPublisher(bus); CucumberFeature feature = TestHelper.feature("path/test.feature", "" + @@ -126,7 +127,7 @@ public void star_keyword_becomes_given_when_no_previous_step() throws IOExceptio @Test public void snippets_are_generated_for_correct_locale() throws Exception { - EventBus bus = new TimeServiceEventBus(new TimeServiceStub(0)); + EventBus bus = new TimeServiceEventBus(new ClockStub(ZERO)); UndefinedStepsTracker tracker = new UndefinedStepsTracker(); tracker.setEventPublisher(bus); CucumberFeature feature = TestHelper.feature("path/test.feature", "" + diff --git a/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java index 97b7dee654..e5234f687f 100644 --- a/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java @@ -10,10 +10,13 @@ import java.io.Closeable; import java.io.IOException; -import java.math.BigDecimal; +import java.time.Duration; import java.util.List; import java.util.Map; +import static java.time.Duration.ZERO; +import static java.time.Duration.ofMillis; +import static java.time.Instant.EPOCH; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertEquals; @@ -37,8 +40,8 @@ public void close() throws IOException { public void resultWithoutSkippedSteps() { Appendable out = mock(Appendable.class); UsageFormatter usageFormatter = new UsageFormatter(out); - Result result = new Result(Result.Type.FAILED, 0L, null); - usageFormatter.handleTestStepFinished(new TestStepFinished(0L, 0L, mock(TestCase.class), mockTestStep(), result)); + Result result = new Result(Result.Type.FAILED, ZERO, null); + usageFormatter.handleTestStepFinished(new TestStepFinished(EPOCH, mock(TestCase.class), mockTestStep(), result)); verifyZeroInteractions(out); } @@ -48,10 +51,10 @@ public void resultWithStep() { UsageFormatter usageFormatter = new UsageFormatter(out); TestStep testStep = mockTestStep(); - Result result = new Result(Result.Type.PASSED, 12345L, null); + Result result = new Result(Result.Type.PASSED, ofMillis(12345L), null); - usageFormatter.handleTestStepFinished(new TestStepFinished(0L, 0L, mock(TestCase.class), testStep, result)); + usageFormatter.handleTestStepFinished(new TestStepFinished(EPOCH, mock(TestCase.class), testStep, result)); Map> usageMap = usageFormatter.usageMap; assertEquals(usageMap.size(), 1); @@ -59,7 +62,7 @@ public void resultWithStep() { assertEquals(durationEntries.size(), 1); assertEquals(durationEntries.get(0).name, "step"); assertEquals(durationEntries.get(0).durations.size(), 1); - assertEquals(durationEntries.get(0).durations.get(0).duration, BigDecimal.valueOf(12345)); + assertEquals(durationEntries.get(0).durations.get(0).duration, Duration.ofMillis(12345)); } @Test @@ -68,9 +71,9 @@ public void resultWithZeroDuration() { UsageFormatter usageFormatter = new UsageFormatter(out); TestStep testStep = mockTestStep(); - Result result = new Result(Result.Type.PASSED, 0L, null); + Result result = new Result(Result.Type.PASSED, ZERO, null); - usageFormatter.handleTestStepFinished(new TestStepFinished(0L, 0L, mock(TestCase.class), testStep, result)); + usageFormatter.handleTestStepFinished(new TestStepFinished(EPOCH, mock(TestCase.class), testStep, result)); Map> usageMap = usageFormatter.usageMap; assertEquals(usageMap.size(), 1); @@ -78,7 +81,7 @@ public void resultWithZeroDuration() { assertEquals(durationEntries.size(), 1); assertEquals(durationEntries.get(0).name, "step"); assertEquals(durationEntries.get(0).durations.size(), 1); - assertEquals(durationEntries.get(0).durations.get(0).duration, BigDecimal.ZERO); + assertEquals(durationEntries.get(0).durations.get(0).duration, Duration.ZERO); } @Test @@ -87,9 +90,9 @@ public void resultWithNullDuration() { UsageFormatter usageFormatter = new UsageFormatter(out); PickleStepTestStep testStep = mockTestStep(); - Result result = new Result(Result.Type.PASSED, 0L, null); + Result result = new Result(Result.Type.PASSED, ZERO, null); - usageFormatter.handleTestStepFinished(new TestStepFinished(0L, 0L, mock(TestCase.class), testStep, result)); + usageFormatter.handleTestStepFinished(new TestStepFinished(EPOCH, mock(TestCase.class), testStep, result)); Map> usageMap = usageFormatter.usageMap; assertEquals(usageMap.size(), 1); @@ -97,7 +100,7 @@ public void resultWithNullDuration() { assertEquals(durationEntries.size(), 1); assertEquals(durationEntries.get(0).name, "step"); assertEquals(durationEntries.get(0).durations.size(), 1); - assertEquals(durationEntries.get(0).durations.get(0).duration, BigDecimal.ZERO); + assertEquals(durationEntries.get(0).durations.get(0).duration, Duration.ZERO); } @Test @@ -107,7 +110,7 @@ public void doneWithoutUsageStatisticStrategies() { UsageFormatter.StepContainer stepContainer = new UsageFormatter.StepContainer(); UsageFormatter.StepDuration stepDuration = new UsageFormatter.StepDuration(); - stepDuration.duration = BigDecimal.valueOf(12345678L); + stepDuration.duration = ofMillis(12345678L); stepDuration.location = "location.feature"; stepContainer.durations = asList(stepDuration); @@ -115,7 +118,7 @@ public void doneWithoutUsageStatisticStrategies() { usageFormatter.finishReport(); - assertThat(out.toString(), containsString("0.012345678")); + assertThat(out.toString(), containsString("12345")); } @Test @@ -125,20 +128,20 @@ public void doneWithUsageStatisticStrategies() { UsageFormatter.StepContainer stepContainer = new UsageFormatter.StepContainer(); UsageFormatter.StepDuration stepDuration = new UsageFormatter.StepDuration(); - stepDuration.duration = BigDecimal.valueOf(12345678L); + stepDuration.duration = ofMillis(12345678L); stepDuration.location = "location.feature"; stepContainer.durations = asList(stepDuration); usageFormatter.usageMap.put("aStep", asList(stepContainer)); UsageFormatter.UsageStatisticStrategy usageStatisticStrategy = mock(UsageFormatter.UsageStatisticStrategy.class); - when(usageStatisticStrategy.calculate(asList(12345678L))).thenReturn(23456L); + when(usageStatisticStrategy.calculate(asList(ofMillis(12345678L)))).thenReturn(ofMillis(23456L)); usageFormatter.addUsageStatisticStrategy("average", usageStatisticStrategy); usageFormatter.finishReport(); - assertThat(out.toString(), containsString("0.000023456")); - assertThat(out.toString(), containsString("0.012345678")); + assertThat(out.toString(), containsString("12345")); + assertThat(out.toString(), containsString("12345")); } private PickleStepTestStep mockTestStep() { diff --git a/core/src/test/java/io/cucumber/core/runner/ClockStub.java b/core/src/test/java/io/cucumber/core/runner/ClockStub.java new file mode 100644 index 0000000000..57c65753ff --- /dev/null +++ b/core/src/test/java/io/cucumber/core/runner/ClockStub.java @@ -0,0 +1,33 @@ +package io.cucumber.core.runner; + +import java.time.Clock; +import java.time.Duration; +import java.time.Instant; +import java.time.ZoneId; + +public class ClockStub extends Clock { + private final Duration duration; + private final ThreadLocal currentInstant = new ThreadLocal<>(); + + public ClockStub(Duration duration) { + this.duration = duration; + } + + @Override + public ZoneId getZone() { + return null; + } + + @Override + public Clock withZone(ZoneId zone) { + return null; + } + + @Override + public Instant instant() { + Instant result = currentInstant.get(); + result = result != null ? result : Instant.EPOCH; + currentInstant.set(result.plus(duration)); + return result; + } +} diff --git a/core/src/test/java/io/cucumber/core/runner/EventBusTest.java b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java index fb7d01c085..a21a498ca6 100644 --- a/core/src/test/java/io/cucumber/core/runner/EventBusTest.java +++ b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java @@ -1,9 +1,15 @@ package io.cucumber.core.runner; +import static java.time.Duration.ZERO; +import static java.time.Instant.EPOCH; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import java.time.Clock; +import java.time.Instant; +import java.time.ZoneId; + import org.junit.Test; import io.cucumber.core.api.event.EventHandler; @@ -20,11 +26,11 @@ public class EventBusTest { public void handlers_receive_the_events_they_registered_for() { EventHandler handler = mock(EventHandler.class); PickleStepTestStep testStep = mock(PickleStepTestStep.class); - Result result = new Result(Result.Type.PASSED, 0L, null); + Result result = new Result(Result.Type.PASSED, ZERO, null); TestCase testCase = mock(TestCase.class); - TestStepFinished event = new TestStepFinished(0L, 0L, testCase, testStep, result); + TestStepFinished event = new TestStepFinished(EPOCH, testCase, testStep, result); - EventBus bus = new TimeServiceEventBus(new TimeServiceStub(0)); + EventBus bus = new TimeServiceEventBus(Clock.fixed(Instant.EPOCH, ZoneId.of("UTC"))); bus.registerHandlerFor(TestStepFinished.class, handler); bus.send(event); @@ -36,9 +42,9 @@ public void handlers_do_not_receive_the_events_they_did_not_registered_for() { EventHandler handler = mock(EventHandler.class); PickleStepTestStep testStep = mock(PickleStepTestStep.class); TestCase testCase = mock(TestCase.class); - TestStepStarted event = new TestStepStarted(0L, 0L, testCase, testStep); + TestStepStarted event = new TestStepStarted(EPOCH, testCase, testStep); - EventBus bus = new TimeServiceEventBus(new TimeServiceStub(0)); + EventBus bus = new TimeServiceEventBus(Clock.fixed(Instant.EPOCH, ZoneId.of("UTC"))); bus.registerHandlerFor(TestStepFinished.class, handler); bus.send(event); diff --git a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java index b52360f677..ed52c76ab6 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java @@ -20,6 +20,7 @@ import org.mockito.InOrder; import java.net.URI; +import java.time.Clock; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -36,7 +37,7 @@ public class HookOrderTest { private final static String ENGLISH = "en"; private final RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); - private final EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); + private final EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); private final StubStepDefinition stepDefinition = new StubStepDefinition("pattern1", new TypeRegistry(Locale.ENGLISH)); private final PickleStep pickleStep = new PickleStep("pattern1", Collections.emptyList(), singletonList(new PickleLocation(2,2))); diff --git a/core/src/test/java/io/cucumber/core/runner/HookTest.java b/core/src/test/java/io/cucumber/core/runner/HookTest.java index 4a71ffc80c..f62acc5a43 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTest.java @@ -22,6 +22,7 @@ import org.mockito.stubbing.Answer; import java.net.URI; +import java.time.Clock; import java.util.Collections; import static java.util.Collections.emptyList; @@ -35,7 +36,7 @@ public class HookTest { private final static String ENGLISH = "en"; private final MultiLoader resoureceLoader = new MultiLoader(RuntimeOptions.class.getClassLoader()); - private final EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); + private final EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); private final RuntimeOptions runtimeOptions = new RuntimeOptions(resoureceLoader, Env.INSTANCE, emptyList()); private final PickleStep pickleStep = new PickleStep("pattern1", Collections.emptyList(), singletonList(new PickleLocation(2, 2))); private final PickleEvent pickleEvent = new PickleEvent("uri", diff --git a/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java index 3268495e13..65cafe73fc 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java @@ -7,9 +7,13 @@ import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; import io.cucumber.core.event.EventBus; + +import org.junit.Before; import org.junit.Test; import org.mockito.InOrder; +import org.mockito.Mockito; +import java.time.Instant; import java.util.Collections; import static org.junit.Assert.assertEquals; @@ -34,6 +38,11 @@ public class HookTestStepTest { private final Scenario scenario = new Scenario(bus, testCase); private HookTestStep step = new HookTestStep(HookType.AfterStep, definitionMatch); + @Before + public void init() { + Mockito.when(bus.getInstant()).thenReturn(Instant.now()); + } + @Test public void run_does_run() throws Throwable { step.run(testCase, bus, scenario, false); diff --git a/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java index d7d034be3f..ae180f892f 100644 --- a/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java @@ -10,11 +10,14 @@ import gherkin.pickles.PickleStep; import io.cucumber.core.event.EventBus; import org.junit.AssumptionViolatedException; +import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatcher; import org.mockito.InOrder; +import org.mockito.Mockito; +import java.time.Instant; import java.util.Collections; import java.util.List; @@ -23,6 +26,9 @@ import static io.cucumber.core.api.event.Result.Type.FAILED; import static io.cucumber.core.api.event.Result.Type.PASSED; import static io.cucumber.core.api.event.Result.Type.SKIPPED; +import static java.time.Duration.ZERO; +import static java.time.Duration.ofMillis; +import static java.time.Instant.ofEpochMilli; import static java.util.Collections.singletonList; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; @@ -58,6 +64,11 @@ public class PickleStepTestStepTest { definitionMatch ); + @Before + public void init() { + Mockito.when(bus.getInstant()).thenReturn(Instant.now()); + } + @Test public void run_wraps_run_step_in_test_step_started_and_finished_events() throws Throwable { step.run(testCase, bus, scenario, false); @@ -112,7 +123,7 @@ public void step_execution_is_dry_run_when_before_step_hook_does_not_pass() thro public void result_is_result_from_hook_when_before_step_hook_does_not_pass() throws Throwable { Exception exception = new RuntimeException(); doThrow(exception).when(beforeHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); - Result failure = new Result(Result.Type.FAILED, 0L, exception); + Result failure = new Result(Result.Type.FAILED, ZERO, exception); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); assertEquals(FAILED, scenario.getStatus()); @@ -126,7 +137,7 @@ public void result_is_result_from_hook_when_before_step_hook_does_not_pass() thr @Test public void result_is_result_from_step_when_step_hook_does_not_pass() throws Throwable { RuntimeException runtimeException = new RuntimeException(); - Result failure = new Result(Result.Type.FAILED, 0L, runtimeException); + Result failure = new Result(Result.Type.FAILED, ZERO, runtimeException); doThrow(runtimeException).when(definitionMatch).runStep(any(Scenario.class)); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); @@ -141,7 +152,7 @@ public void result_is_result_from_step_when_step_hook_does_not_pass() throws Thr @Test public void result_is_result_from_hook_when_after_step_hook_does_not_pass() throws Throwable { Exception exception = new RuntimeException(); - Result failure = new Result(Result.Type.FAILED, 0L, exception); + Result failure = new Result(Result.Type.FAILED, ZERO, exception); doThrow(exception).when(afterHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); @@ -227,7 +238,7 @@ public void result_is_pending_when_step_definition_throws_pending_exception() th @Test public void step_execution_time_is_measured() { TestStep step = new PickleStepTestStep("uri", mock(PickleStep.class), definitionMatch); - when(bus.getTime()).thenReturn(234L, (Long) 1234L); + when(bus.getInstant()).thenReturn(ofEpochMilli(234L), ofEpochMilli(1234L)); step.run(testCase, bus, scenario, false); ArgumentCaptor captor = forClass(TestCaseEvent.class); @@ -237,9 +248,9 @@ public void step_execution_time_is_measured() { TestStepStarted started = (TestStepStarted) allValues.get(0); TestStepFinished finished = (TestStepFinished) allValues.get(1); - assertEquals((Long) 234L, started.getTimeStamp()); - assertEquals((Long) 1234L, finished.getTimeStamp()); - assertEquals((Long) 1000L, finished.result.getDuration()); + assertEquals(ofEpochMilli(234L), started.getInstant()); + assertEquals(ofEpochMilli(1234L), finished.getInstant()); + assertEquals(ofMillis(1000L), finished.result.getDuration()); } } diff --git a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java index 0a46e44e0b..0aa1e0a54d 100644 --- a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -24,6 +24,7 @@ import org.mockito.stubbing.Answer; import java.net.URI; +import java.time.Clock; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -50,7 +51,7 @@ public class RunnerTest { private final RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); - private final EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); + private final EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); @Test diff --git a/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java index 2f1ec7fdfd..9838d4ce27 100644 --- a/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java @@ -11,6 +11,7 @@ import java.util.Arrays; import java.util.Collections; +import static java.time.Duration.ZERO; import static org.hamcrest.CoreMatchers.sameInstance; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -41,44 +42,44 @@ public void no_steps_is_undefined() { @Test public void one_passed_step_is_passed() { - s.add(new Result(Result.Type.PASSED, 0L, null)); + s.add(new Result(Result.Type.PASSED, ZERO, null)); assertEquals(Result.Type.PASSED, s.getStatus()); } @Test public void passed_failed_pending_undefined_skipped_is_failed() { - s.add(new Result(Result.Type.PASSED, 0L, null)); - s.add(new Result(Result.Type.FAILED, 0L, null)); - s.add(new Result(Result.Type.PENDING, 0L, null)); - s.add(new Result(Result.Type.UNDEFINED, 0L, null)); - s.add(new Result(Result.Type.SKIPPED, 0L, null)); + s.add(new Result(Result.Type.PASSED, ZERO, null)); + s.add(new Result(Result.Type.FAILED, ZERO, null)); + s.add(new Result(Result.Type.PENDING, ZERO, null)); + s.add(new Result(Result.Type.UNDEFINED, ZERO, null)); + s.add(new Result(Result.Type.SKIPPED, ZERO, null)); assertEquals(Result.Type.FAILED, s.getStatus()); assertTrue(s.isFailed()); } @Test public void passed_and_skipped_is_skipped_although_we_cant_have_skipped_without_undefined_or_pending() { - s.add(new Result(Result.Type.PASSED, 0L, null)); - s.add(new Result(Result.Type.SKIPPED, 0L, null)); + s.add(new Result(Result.Type.PASSED, ZERO, null)); + s.add(new Result(Result.Type.SKIPPED, ZERO, null)); assertEquals(Result.Type.SKIPPED, s.getStatus()); assertFalse(s.isFailed()); } @Test public void passed_pending_undefined_skipped_is_pending() { - s.add(new Result(Result.Type.PASSED, 0L, null)); - s.add(new Result(Result.Type.UNDEFINED, 0L, null)); - s.add(new Result(Result.Type.PENDING, 0L, null)); - s.add(new Result(Result.Type.SKIPPED, 0L, null)); + s.add(new Result(Result.Type.PASSED, ZERO, null)); + s.add(new Result(Result.Type.UNDEFINED, ZERO, null)); + s.add(new Result(Result.Type.PENDING, ZERO, null)); + s.add(new Result(Result.Type.SKIPPED, ZERO, null)); assertEquals(Result.Type.UNDEFINED, s.getStatus()); assertFalse(s.isFailed()); } @Test public void passed_undefined_skipped_is_undefined() { - s.add(new Result(Result.Type.PASSED, 0L, null)); - s.add(new Result(Result.Type.UNDEFINED, 0L, null)); - s.add(new Result(Result.Type.SKIPPED, 0L, null)); + s.add(new Result(Result.Type.PASSED, ZERO, null)); + s.add(new Result(Result.Type.UNDEFINED, ZERO, null)); + s.add(new Result(Result.Type.SKIPPED, ZERO, null)); assertEquals(Result.Type.UNDEFINED, s.getStatus()); assertFalse(s.isFailed()); } @@ -101,8 +102,8 @@ public void failed_followed_by_pending_yields_failed_error() { Throwable failedError = mock(Throwable.class); Throwable pendingError = mock(Throwable.class); - s.add(new Result(Result.Type.FAILED, 0L, failedError)); - s.add(new Result(Result.Type.PENDING, 0L, pendingError)); + s.add(new Result(Result.Type.FAILED, ZERO, failedError)); + s.add(new Result(Result.Type.PENDING, ZERO, pendingError)); assertThat(s.getError(), sameInstance(failedError)); } @@ -112,8 +113,8 @@ public void pending_followed_by_failed_yields_failed_error() { Throwable pendingError = mock(Throwable.class); Throwable failedError = mock(Throwable.class); - s.add(new Result(Result.Type.PENDING, 0L, pendingError)); - s.add(new Result(Result.Type.FAILED, 0L, failedError)); + s.add(new Result(Result.Type.PENDING, ZERO, pendingError)); + s.add(new Result(Result.Type.FAILED, ZERO, failedError)); assertThat(s.getError(), sameInstance(failedError)); } diff --git a/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java b/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java index 6752552371..646ea556c1 100644 --- a/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java +++ b/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java @@ -5,12 +5,15 @@ import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestStepStarted; -import static java.util.concurrent.TimeUnit.MILLISECONDS; +import java.time.Clock; +import java.time.Duration; +import java.time.Instant; +import java.time.ZoneId; -public class StepDurationTimeService implements TimeService, EventListener { +public class StepDurationTimeService extends Clock implements EventListener { - private final ThreadLocal currentTime = new ThreadLocal<>(); - private final long stepDurationMillis; + private final ThreadLocal currentInstant = new ThreadLocal<>(); + private final Duration stepDuration; private EventHandler stepStartedHandler = new EventHandler() { @Override @@ -18,9 +21,9 @@ public void receive(TestStepStarted event) { handleTestStepStarted(); } }; - - public StepDurationTimeService(long stepDurationMillis) { - this.stepDurationMillis = stepDurationMillis; + + public StepDurationTimeService(Duration stepDuration) { + this.stepDuration = stepDuration; } @Override @@ -28,21 +31,25 @@ public void setEventPublisher(EventPublisher publisher) { publisher.registerHandlerFor(TestStepStarted.class, stepStartedHandler); } + private void handleTestStepStarted() { + Instant timeInstant = instant(); + currentInstant.set(timeInstant.plus(stepDuration)); + } + @Override - public long time() { - Long result = currentTime.get(); - return result != null ? MILLISECONDS.toNanos(result) : 0L; + public ZoneId getZone() { + return null; } @Override - public long timeMillis() { - Long result = currentTime.get(); - return result != null ? result : 0L; + public Clock withZone(ZoneId zone) { + return null; } - private void handleTestStepStarted() { - long time = timeMillis(); - currentTime.set(time + stepDurationMillis); + @Override + public Instant instant() { + Instant result = currentInstant.get(); + return result != null ? result : Instant.EPOCH; } } diff --git a/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java index 39ff26a96f..4c264fad5d 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java +++ b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java @@ -9,9 +9,13 @@ import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import io.cucumber.core.event.EventBus; + +import org.junit.Before; import org.junit.Test; import org.mockito.InOrder; +import org.mockito.Mockito; +import java.time.Instant; import java.util.Collections; import static io.cucumber.core.api.event.HookType.AfterStep; @@ -34,6 +38,11 @@ public class TestCaseTest { private HookDefinition beforeStep1HookDefinition1 = mock(HookDefinition.class); private HookDefinition afterStep1HookDefinition1 = mock(HookDefinition.class); + @Before + public void init() { + Mockito.when(bus.getInstant()).thenReturn(Instant.now()); + } + private final PickleStepTestStep testStep1 = new PickleStepTestStep( "uri", mock(PickleStep.class), diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index d90f71837e..49b279e3fa 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -40,6 +40,10 @@ import java.lang.reflect.Type; import java.net.URI; import java.nio.charset.StandardCharsets; +import java.time.Clock; +import java.time.Duration; +import java.time.Instant; +import java.time.ZoneId; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Arrays; @@ -52,6 +56,7 @@ import static io.cucumber.core.api.event.Result.Type.PENDING; import static io.cucumber.core.api.event.Result.Type.SKIPPED; import static io.cucumber.core.api.event.Result.Type.UNDEFINED; +import static java.time.Duration.ZERO; import static java.util.Locale.ENGLISH; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; @@ -74,7 +79,7 @@ public enum TimeServiceType { private List hookLocations = Collections.emptyList(); private List> hookActions = Collections.emptyList(); private TimeServiceType timeServiceType = TimeServiceType.FIXED_INCREMENT_ON_STEP_START; - private long timeServiceIncrement = 0L; + private Duration timeServiceIncrement = Duration.ZERO; private Object formatterUnderTest = null; private List runtimeArgs = Collections.emptyList(); @@ -184,7 +189,7 @@ public String getLocation(boolean detail) { private static Result getResultWithDefaultPassed(Map stepsToResult, String step) { - return stepsToResult.containsKey(step) ? stepsToResult.get(step) : new Result(PASSED, 0L, null); + return stepsToResult.containsKey(step) ? stepsToResult.get(step) : new Result(PASSED, ZERO, null); } @@ -317,13 +322,13 @@ private EventBus createEventBus() { EventBus bus = null; if (TimeServiceType.REAL_TIME.equals(this.timeServiceType)) { - bus = new TimeServiceEventBus(TimeService.SYSTEM); + bus = new TimeServiceEventBus(Clock.systemUTC()); } else if (TimeServiceType.FIXED_INCREMENT_ON_STEP_START.equals(this.timeServiceType)) { final StepDurationTimeService timeService = new StepDurationTimeService(this.timeServiceIncrement); bus = new TimeServiceEventBus(timeService); timeService.setEventPublisher(bus); } else if (TimeServiceType.FIXED_INCREMENT.equals(this.timeServiceType)) { - bus = new TimeServiceEventBus(new TimeServiceStub(this.timeServiceIncrement)); + bus = new TimeServiceEventBus(Clock.fixed(Instant.EPOCH, ZoneId.of("UTC"))); } return bus; } @@ -379,7 +384,7 @@ public Builder withHookActions(List> hookActions) { * @param timeServiceIncrement increment to be used * @return this instance */ - public Builder withTimeServiceIncrement(long timeServiceIncrement) { + public Builder withTimeServiceIncrement(Duration timeServiceIncrement) { this.instance.timeServiceIncrement = timeServiceIncrement; return this; } @@ -387,7 +392,7 @@ public Builder withTimeServiceIncrement(long timeServiceIncrement) { /** * Specifies what type of TimeService to be used by the {@link EventBus} * {@link TimeServiceType#REAL_TIME} > {@link TimeService#SYSTEM} - * {@link TimeServiceType#FIXED_INCREMENT} > {@link TimeServiceStub} + * {@link TimeServiceType#FIXED_INCREMENT} > {@link ClockStub} * {@link TimeServiceType#FIXED_INCREMENT_ON_STEP_START} > {@link StepDurationTimeService} *

      * Defaults to {@link TimeServiceType#FIXED_INCREMENT_ON_STEP_START} @@ -469,7 +474,7 @@ public static Result result(Result.Type status) { } public static Result result(Result.Type status, Throwable error) { - return new Result(status, 0L, error); + return new Result(status, Duration.ZERO, error); } public static Answer createWriteHookAction(final String output) { diff --git a/core/src/test/java/io/cucumber/core/runner/TimeServiceStub.java b/core/src/test/java/io/cucumber/core/runner/TimeServiceStub.java deleted file mode 100644 index 30609c0149..0000000000 --- a/core/src/test/java/io/cucumber/core/runner/TimeServiceStub.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.cucumber.core.runner; - -import static java.util.concurrent.TimeUnit.MILLISECONDS; - -public class TimeServiceStub implements TimeService { - private final long durationMillis; - private final ThreadLocal currentTime = new ThreadLocal<>(); - private final ThreadLocal currentTimeMillis = new ThreadLocal<>(); - - public TimeServiceStub(long durationMillis) { - this.durationMillis = durationMillis; - } - - @Override - public long time() { - Long result = currentTime.get(); - result = result != null ? result : 0L; - currentTime.set(result + durationMillis); - return MILLISECONDS.toNanos(result); - } - - @Override - public long timeMillis() { - Long result = currentTimeMillis.get(); - result = result != null ? result : 0L; - currentTimeMillis.set(result + durationMillis); - return result; - } -} diff --git a/core/src/test/java/io/cucumber/core/runner/TimeServiceTest.java b/core/src/test/java/io/cucumber/core/runner/TimeServiceTest.java deleted file mode 100644 index cebf275b6e..0000000000 --- a/core/src/test/java/io/cucumber/core/runner/TimeServiceTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.cucumber.core.runner; - -import static org.junit.Assert.assertNull; - -import org.junit.Test; - -public class TimeServiceTest { - private final TimeService stopWatch = TimeService.SYSTEM; - private Throwable exception; - - @Test - public void should_be_thread_safe() { - try { - Thread timerThreadOne = new TimerThread(500L); - Thread timerThreadTwo = new TimerThread(750L); - - timerThreadOne.start(); - timerThreadTwo.start(); - - timerThreadOne.join(); - timerThreadTwo.join(); - - assertNull("null_pointer_exception", exception); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - - class TimerThread extends Thread { - private final long timeoutMillis; - - public TimerThread(long timeoutMillis) { - this.timeoutMillis = timeoutMillis; - } - - @Override - public void run() { - try { - stopWatch.time(); - Thread.sleep(timeoutMillis); - stopWatch.time(); - } catch (NullPointerException e) { - exception = e; - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - } -} diff --git a/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java index 1db7517dc0..865ca92d9b 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java @@ -7,17 +7,20 @@ import io.cucumber.core.event.EventBus; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.options.Env; -import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.options.RuntimeOptions; import org.junit.Test; +import static java.time.Duration.ZERO; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; +import java.time.Clock; +import java.time.Instant; + public class ExitStatusTest { - private final static long ANY_TIMESTAMP = 1234567890; + private final static Instant ANY_INSTANT = Instant.ofEpochMilli(1234567890); private EventBus bus; private Runtime.ExitStatus exitStatus; @@ -35,12 +38,12 @@ private void createNonStrictWipExitStatus() { } private TestCaseFinished testCaseFinishedWithStatus(Result.Type resultStatus) { - return new TestCaseFinished(ANY_TIMESTAMP, ANY_TIMESTAMP, mock(TestCase.class), new Result(resultStatus, 0L, null)); + return new TestCaseFinished(ANY_INSTANT, mock(TestCase.class), new Result(resultStatus, ZERO, null)); } private void createExitStatus(String... runtimeArgs) { RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, asList(runtimeArgs)); - this.bus = new TimeServiceEventBus(TimeService.SYSTEM); + this.bus = new TimeServiceEventBus(Clock.systemUTC()); exitStatus = new Runtime.ExitStatus(runtimeOptions); exitStatus.setEventPublisher(bus); } diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index 4434279c44..d22a5569a6 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -2,6 +2,7 @@ import static io.cucumber.core.runner.TestHelper.feature; import static io.cucumber.core.runner.TestHelper.result; +import static java.time.Duration.ZERO; import static java.util.Collections.singletonList; import static java.util.concurrent.TimeUnit.HOURS; import static java.util.concurrent.TimeUnit.MINUTES; @@ -18,6 +19,9 @@ import static uk.co.datumedge.hamcrest.json.SameJSONAs.sameJSONAs; import java.net.URI; +import java.time.Clock; +import java.time.Instant; +import java.time.ZoneId; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -32,7 +36,6 @@ import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.exception.CompositeCucumberException; -import io.cucumber.core.runner.TimeServiceStub; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -63,15 +66,14 @@ import io.cucumber.core.plugin.FormatterSpy; import io.cucumber.core.runner.TestBackendSupplier; import io.cucumber.core.runner.TestHelper; -import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.stepexpression.TypeRegistry; public class RuntimeTest { - private final static long ANY_TIMESTAMP = 1234567890; + private final static Instant ANY_INSTANT = Instant.ofEpochMilli(1234567890); private final TypeRegistry TYPE_REGISTRY = new TypeRegistry(Locale.ENGLISH); - private final EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); + private final EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -99,7 +101,7 @@ public Collection get() { .withBackendSupplier(backendSupplier) .withAdditionalPlugins(jsonFormatter) .withResourceLoader(TestClasspathResourceLoader.create(classLoader)) - .withEventBus(new TimeServiceEventBus(new TimeServiceStub(0))) + .withEventBus(new TimeServiceEventBus(Clock.fixed(Instant.EPOCH, ZoneId.of("UTC")))) .withFeatureSupplier(featureSupplier) .build() .run(); @@ -653,6 +655,6 @@ private void mockHook(Glue glue, HookDefinition hook, HookType hookType) { } private TestCaseFinished testCaseFinishedWithStatus(Result.Type resultStatus) { - return new TestCaseFinished(ANY_TIMESTAMP, ANY_TIMESTAMP, mock(TestCase.class), new Result(resultStatus, 0L, null)); + return new TestCaseFinished(ANY_INSTANT, mock(TestCase.class), new Result(resultStatus, ZERO, null)); } } diff --git a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java index 16abe7e74b..19536ddf8f 100644 --- a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java @@ -9,7 +9,6 @@ import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import org.junit.Before; import org.junit.Test; @@ -21,6 +20,8 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThat; +import java.time.Clock; + public class SingletonRunnerSupplierTest { @@ -34,7 +35,7 @@ public void before() { ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); - EventBus eventBus = new TimeServiceEventBus(TimeService.SYSTEM); + EventBus eventBus = new TimeServiceEventBus(Clock.systemUTC()); runnerSupplier = new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactory); } diff --git a/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java index 155a8c7fbc..7bd8eb0af8 100644 --- a/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java +++ b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java @@ -23,7 +23,7 @@ public TestFeatureSupplier(EventBus bus, List features) { @Override public List get() { for (CucumberFeature feature : features) { - bus.send(new TestSourceRead(bus.getTime(), feature.getUri().toString(), feature.getSource())); + bus.send(new TestSourceRead(bus.getInstant(), feature.getUri().toString(), feature.getSource())); } return features; } diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index a181b1652b..8fe5f5bb8f 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -13,13 +13,14 @@ import io.cucumber.core.options.Env; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runner.Runner; -import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import org.junit.Before; import org.junit.Test; +import java.time.Clock; import java.util.Collections; +import static java.time.Instant.EPOCH; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertNotSame; @@ -41,7 +42,7 @@ public void before() { ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); - eventBus = new TimeServiceEventBus(TimeService.SYSTEM); + eventBus = new TimeServiceEventBus(Clock.systemUTC()); runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactory); } @@ -98,6 +99,6 @@ public void receive(TestCaseStarted event) { fail(); } }); - eventBus.send(new TestCaseStarted(0L, 0L, null)); + eventBus.send(new TestCaseStarted(EPOCH, null)); } } \ No newline at end of file diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 44e274c99c..0c29145dba 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -3,14 +3,12 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.TestStepFinished; -import io.cucumber.core.backend.Container; import io.cucumber.core.backend.ObjectFactory; import io.cucumber.java.api.en.Given; import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.Runner; -import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.AmbiguousStepDefinitionsException; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendSupplier; @@ -29,6 +27,7 @@ import org.junit.Test; import java.lang.reflect.Method; +import java.time.Clock; import java.util.Collection; import java.util.Collections; import java.util.Locale; @@ -77,7 +76,7 @@ public void createBackendAndLoadNoGlue() { TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); this.backend = new JavaBackend(objectFactory, resourceLoader, typeRegistry); RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); - EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); + EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); BackendSupplier backendSupplier = new BackendSupplier() { @Override public Collection get() { diff --git a/junit/src/main/java/io/cucumber/junit/api/Cucumber.java b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java index 8829f8a392..8238291b70 100644 --- a/junit/src/main/java/io/cucumber/junit/api/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java @@ -5,13 +5,9 @@ import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.ObjectFactorySupplier; -import io.cucumber.core.backend.SingletonObjectFactorySupplier; import io.cucumber.core.backend.ThreadLocalObjectFactorySupplier; import io.cucumber.core.event.EventBus; -import io.cucumber.core.options.Env; -import io.cucumber.core.runner.TimeService; import io.cucumber.core.runtime.BackendServiceLoader; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.runner.TimeServiceEventBus; @@ -37,11 +33,10 @@ import org.junit.runners.model.InitializationError; import org.junit.runners.model.Statement; +import java.time.Clock; import java.util.ArrayList; import java.util.List; -import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; - /** *

      * Classes annotated with {@code @RunWith(Cucumber.class)} will run a Cucumber Feature. @@ -99,7 +94,7 @@ public Cucumber(Class clazz) throws InitializationError { this.features = featureSupplier.get(); // Create plugins after feature parsing to avoid the creation of empty files on lexer errors. - this.bus = new TimeServiceEventBus(TimeService.SYSTEM); + this.bus = new TimeServiceEventBus(Clock.systemUTC()); this.plugins = new Plugins(new PluginFactory(), bus, runtimeOptions); ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(); @@ -144,14 +139,14 @@ class RunCucumber extends Statement { @Override public void evaluate() throws Throwable { - bus.send(new TestRunStarted(bus.getTime(), bus.getTimeMillis())); + bus.send(new TestRunStarted(bus.getInstant())); for (CucumberFeature feature : features) { - bus.send(new TestSourceRead(bus.getTime(), feature.getUri().toString(), feature.getSource())); + bus.send(new TestSourceRead(bus.getInstant(), feature.getUri().toString(), feature.getSource())); } StepDefinitionReporter stepDefinitionReporter = plugins.stepDefinitionReporter(); runnerSupplier.get().reportStepDefinitions(stepDefinitionReporter); runFeatures.evaluate(); - bus.send(new TestRunFinished(bus.getTime(), bus.getTimeMillis())); + bus.send(new TestRunFinished(bus.getInstant())); } } } diff --git a/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java index ab1eee3ef8..6399db5e0e 100644 --- a/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java @@ -1,35 +1,31 @@ package io.cucumber.junit.api; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.backend.SingletonObjectFactorySupplier; import io.cucumber.core.io.MultiLoader; -import io.cucumber.core.io.Resource; -import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; -import io.cucumber.core.runner.TimeService; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import io.cucumber.core.filter.Filters; import io.cucumber.core.model.CucumberFeature; -import io.cucumber.core.model.FeatureLoader; import org.junit.Test; import org.junit.runner.Description; import org.junit.runner.notification.RunNotifier; import org.junit.runners.model.InitializationError; import org.mockito.InOrder; -import java.net.URI; +import java.time.Clock; +import java.time.Instant; +import java.time.ZoneId; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Set; -import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static org.junit.Assert.assertEquals; @@ -164,15 +160,20 @@ private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, JUnit final RuntimeOptions runtimeOptions = new RuntimeOptions(new MultiLoader(RuntimeOptions.class.getClassLoader()), Env.INSTANCE, emptyList()); - final TimeService timeServiceStub = new TimeService() { + final Clock clockStub = new Clock() { @Override - public long time() { - return 0L; + public Instant instant() { + return Instant.EPOCH; } @Override - public long timeMillis() { - return 0L; + public ZoneId getZone() { + return null; + } + + @Override + public Clock withZone(ZoneId zone) { + return null; } }; BackendSupplier backendSupplier = new BackendSupplier() { @@ -182,13 +183,7 @@ public Collection get() { } }; - EventBus bus = new TimeServiceEventBus(timeServiceStub); - FeatureLoader featureLoader = new FeatureLoader(new ResourceLoader() { - @Override - public Iterable resources(URI path, String suffix) { - return emptyList(); - } - }); + EventBus bus = new TimeServiceEventBus(clockStub); Filters filters = new Filters(runtimeOptions); ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactory); return new FeatureRunner(cucumberFeature, filters, runnerSupplier, junitOption); diff --git a/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java b/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java index fb537577ec..e1aac968b2 100644 --- a/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java +++ b/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java @@ -26,6 +26,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static java.time.Duration.ZERO; import static java.util.Arrays.asList; @@ -450,11 +451,11 @@ public void test_case_finished_fires_failure_and_test_finished_for_failed_step() } private Result mockResult(Result.Type status, Throwable exception) { - return new Result(status, 0L, exception); + return new Result(status, ZERO, exception); } private Result mockResult(Result.Type status) { - return new Result(status, 0L, null); + return new Result(status, ZERO, null); } private PickleRunner mockPickleRunner(List runnerSteps) { diff --git a/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java index 50f2ca6cf8..7580792e04 100644 --- a/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java @@ -21,12 +21,12 @@ import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.plugin.Plugins; import io.cucumber.core.runner.Runner; -import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.runtime.BackendServiceLoader; import io.cucumber.core.runtime.FeaturePathFeatureSupplier; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; +import java.time.Clock; import java.util.ArrayList; import java.util.List; @@ -60,7 +60,7 @@ public TestNGCucumberRunner(Class clazz) { FeatureLoader featureLoader = new FeatureLoader(resourceLoader); featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions); - this.bus = new TimeServiceEventBus(TimeService.SYSTEM); + this.bus = new TimeServiceEventBus(Clock.systemUTC()); this.plugins = new Plugins(new PluginFactory(), bus, runtimeOptions); ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactorySupplier); @@ -82,7 +82,7 @@ public void runScenario(PickleEvent pickle) throws Throwable { } public void finish() { - bus.send(new TestRunFinished(bus.getTime(), bus.getTimeMillis())); + bus.send(new TestRunFinished(bus.getInstant())); } /** @@ -109,9 +109,9 @@ public Object[][] provideScenarios() { List getFeatures() { List features = featureSupplier.get(); - bus.send(new TestRunStarted(bus.getTime(), bus.getTimeMillis())); + bus.send(new TestRunStarted(bus.getInstant())); for (CucumberFeature feature : features) { - bus.send(new TestSourceRead(bus.getTime(), bus.getTimeMillis(), feature.getUri().toString(), feature.getSource())); + bus.send(new TestSourceRead(bus.getInstant(), feature.getUri().toString(), feature.getSource())); } StepDefinitionReporter stepDefinitionReporter = plugins.stepDefinitionReporter(); runnerSupplier.get().reportStepDefinitions(stepDefinitionReporter); diff --git a/testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java b/testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java index c67ebc5e3f..08d5e007eb 100644 --- a/testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java +++ b/testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java @@ -2,20 +2,21 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.event.EventBus; -import io.cucumber.core.runner.TimeService; import io.cucumber.core.runner.TimeServiceEventBus; import org.testng.SkipException; import org.testng.annotations.Test; -import static org.mockito.Mockito.mock; +import static java.time.Duration.ZERO; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; +import java.time.Clock; + public class TestCaseResultListenerTest { - private final EventBus bus = new TimeServiceEventBus(TimeService.SYSTEM); + private final EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); @Test public void should_be_passed_for_passed_result() { @@ -100,27 +101,27 @@ public void should_be_skipped_for_skipped_result() { } private Result mockPassedResult() { - return new Result(Result.Type.PASSED, 0L, null); + return new Result(Result.Type.PASSED, ZERO, null); } private Result mockSkippedResult() { - return new Result(Result.Type.SKIPPED, 0L, null); + return new Result(Result.Type.SKIPPED, ZERO, null); } private Result mockUndefinedResult() { - return new Result(Result.Type.UNDEFINED, 0L, null); + return new Result(Result.Type.UNDEFINED, ZERO, null); } private Result mockFailedResult() { - return new Result(Result.Type.FAILED, 0L, new Exception()); + return new Result(Result.Type.FAILED, ZERO, new Exception()); } private Result mockAmbiguousResult() { - return new Result(Result.Type.AMBIGUOUS, 0L, new Exception()); + return new Result(Result.Type.AMBIGUOUS, ZERO, new Exception()); } private Result mockPendingResult() { - return new Result(Result.Type.PENDING, 0L, new TestPendingException()); + return new Result(Result.Type.PENDING, ZERO, new TestPendingException()); } } From fda6c4cf90a35b572eec31c1f0637e604b4287c4 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Fri, 31 May 2019 00:23:43 +0200 Subject: [PATCH 079/155] [Core] Remove StepDefinitionReporter The StepDefinitionReporter interface was deprecated in v4 #1634. Closes #1635 --- .../io/cucumber/core/api/plugin/Plugin.java | 1 - .../api/plugin/StepDefinitionReporter.java | 17 -- .../cucumber/core/backend/HookDefinition.java | 7 - .../cucumber/core/backend/StepDefinition.java | 7 - .../cucumber/core/options/PluginOption.java | 5 - .../cucumber/core/options/RuntimeOptions.java | 12 +- .../java/io/cucumber/core/plugin/Plugins.java | 16 -- .../io/cucumber/core/runner/CachingGlue.java | 11 -- .../core/runner/NoStepDefinition.java | 5 - .../java/io/cucumber/core/runner/Runner.java | 5 - .../io/cucumber/core/runtime/Runtime.java | 3 - .../options/RuntimeOptionsFactoryTest.java | 5 - .../core/options/RuntimeOptionsTest.java | 7 - .../plugin/AnyStepDefinitionReporter.java | 17 -- .../cucumber/core/runner/CachingGlueTest.java | 175 ++++++++++++++---- .../io/cucumber/core/runtime/RuntimeTest.java | 44 ----- .../core/runtime/StubStepDefinition.java | 4 - .../java/io/cucumber/junit/api/Cucumber.java | 3 - .../testng/api/TestNGCucumberRunner.java | 3 - 19 files changed, 143 insertions(+), 204 deletions(-) delete mode 100644 core/src/main/java/io/cucumber/core/api/plugin/StepDefinitionReporter.java delete mode 100644 core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java diff --git a/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java b/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java index 467a04e23e..449b415f03 100644 --- a/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java @@ -33,7 +33,6 @@ *

    • {@link StrictAware}
    • *
    • {@link EventListener}
    • *
    • {@link ConcurrentEventListener}
    • - *
    • {@link StepDefinitionReporter}
    • *
    • {@link SummaryPrinter}
    • * */ diff --git a/core/src/main/java/io/cucumber/core/api/plugin/StepDefinitionReporter.java b/core/src/main/java/io/cucumber/core/api/plugin/StepDefinitionReporter.java deleted file mode 100644 index 40ae83a845..0000000000 --- a/core/src/main/java/io/cucumber/core/api/plugin/StepDefinitionReporter.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.cucumber.core.api.plugin; - -import io.cucumber.core.api.event.StepDefinedEvent; -import io.cucumber.core.backend.StepDefinition; - -/** - * @deprecated in favor of {@link StepDefinedEvent}, as Lambda Step Definitions are not reported through this class. - */ -@Deprecated -public interface StepDefinitionReporter extends Plugin { - /** - * Called when a step definition is defined - * - * @param stepDefinition the step definition - */ - void stepDefinition(StepDefinition stepDefinition); -} diff --git a/core/src/main/java/io/cucumber/core/backend/HookDefinition.java b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java index dd1ac7fa29..6372e9dc56 100644 --- a/core/src/main/java/io/cucumber/core/backend/HookDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java @@ -20,11 +20,4 @@ public interface HookDefinition { boolean matches(Collection tags); int getOrder(); - - /** - * @deprecated replaced with {@link ScenarioScoped} - * @return true if this instance is scoped to a single scenario, or false if it can be reused across scenarios. - */ - @Deprecated - boolean isScenarioScoped(); } diff --git a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java index e46f56b21a..2cc2b48d57 100644 --- a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java @@ -50,11 +50,4 @@ public interface StepDefinition { * @return the pattern associated with this instance. Used for error reporting only. */ String getPattern(); - - /** - * @deprecated replaced with {@link cucumber.runtime.ScenarioScoped} - * @return true if this instance is scoped to a single scenario, or false if it can be reused across scenarios. - */ - @Deprecated - boolean isScenarioScoped(); } diff --git a/core/src/main/java/io/cucumber/core/options/PluginOption.java b/core/src/main/java/io/cucumber/core/options/PluginOption.java index 6564fb44c7..9003abdcc3 100644 --- a/core/src/main/java/io/cucumber/core/options/PluginOption.java +++ b/core/src/main/java/io/cucumber/core/options/PluginOption.java @@ -1,7 +1,6 @@ package io.cucumber.core.options; import io.cucumber.core.api.plugin.Plugin; -import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.api.plugin.SummaryPrinter; import io.cucumber.core.api.event.ConcurrentEventListener; import io.cucumber.core.api.event.EventListener; @@ -69,10 +68,6 @@ boolean isFormatter() { return EventListener.class.isAssignableFrom(pluginClass) || ConcurrentEventListener.class.isAssignableFrom(pluginClass); } - boolean isStepDefinitionReporter() { - return StepDefinitionReporter.class.isAssignableFrom(pluginClass); - } - boolean isSummaryPrinter() { return SummaryPrinter.class.isAssignableFrom(pluginClass); } diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 5a15c3ad72..1d4dedc121 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -68,7 +68,6 @@ public String map(String keyword) { private int threads = 1; private final List formatters = new ArrayList<>(); - private final List stepDefinitionReporters = new ArrayList<>(); private final List summaryPrinters = new ArrayList<>(); /** @@ -135,7 +134,6 @@ public RuntimeOptions noSummaryPrinter() { public List plugins() { List plugins = new ArrayList<>(); plugins.addAll(formatters); - plugins.addAll(stepDefinitionReporters); plugins.addAll(summaryPrinters); return plugins; } @@ -234,7 +232,6 @@ private void parse(List args) { } parsedPluginData.updateFormatters(formatters); - parsedPluginData.updateStepDefinitionReporters(stepDefinitionReporters); parsedPluginData.updateSummaryPrinters(summaryPrinters); } @@ -397,14 +394,11 @@ public int getThreads() { static final class ParsedPluginData { private ParsedPlugins formatters = new ParsedPlugins(); - private ParsedPlugins stepDefinitionReporters = new ParsedPlugins(); private ParsedPlugins summaryPrinters = new ParsedPlugins(); void addPluginName(String name, boolean isAddPlugin) { PluginOption pluginOption = PluginOption.parse(name); - if (pluginOption.isStepDefinitionReporter()) { - stepDefinitionReporters.addName(pluginOption, isAddPlugin); - } else if (pluginOption.isSummaryPrinter()) { + if (pluginOption.isSummaryPrinter()) { summaryPrinters.addName(pluginOption, isAddPlugin); } else if (pluginOption.isFormatter()) { formatters.addName(pluginOption, isAddPlugin); @@ -417,10 +411,6 @@ void updateFormatters(List formatter) { this.formatters.updateNameList(formatter); } - void updateStepDefinitionReporters(List stepDefintionReporter) { - stepDefinitionReporters.updateNameList(stepDefintionReporter); - } - void updateSummaryPrinters(List pluginSummaryPrinterNames) { summaryPrinters.updateNameList(pluginSummaryPrinterNames); } diff --git a/core/src/main/java/io/cucumber/core/plugin/Plugins.java b/core/src/main/java/io/cucumber/core/plugin/Plugins.java index 21c7a43060..73de404bbf 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Plugins.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugins.java @@ -1,7 +1,6 @@ package io.cucumber.core.plugin; import io.cucumber.core.api.plugin.Plugin; -import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.api.event.ConcurrentEventListener; import io.cucumber.core.api.event.Event; import io.cucumber.core.api.event.EventHandler; @@ -9,7 +8,6 @@ import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.plugin.ColorAware; import io.cucumber.core.api.plugin.StrictAware; -import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.options.PluginOptions; import java.util.ArrayList; @@ -68,20 +66,6 @@ public List getPlugins() { return plugins; } - public StepDefinitionReporter stepDefinitionReporter() { - return new StepDefinitionReporter() { - @Override - public void stepDefinition(StepDefinition stepDefinition) { - for (Plugin plugin : getPlugins()) { - if (plugin instanceof StepDefinitionReporter) { - StepDefinitionReporter stepDefinitionReporter = (StepDefinitionReporter) plugin; - stepDefinitionReporter.stepDefinition(stepDefinition); - } - } - } - }; - } - public void addPlugin(Plugin plugin) { addPlugin(plugins, plugin); } diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index bdc6df0914..02361b8f7d 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -8,7 +8,6 @@ import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.event.EventBus; import io.cucumber.core.stepexpression.Argument; -import io.cucumber.core.api.plugin.StepDefinitionReporter; import gherkin.pickles.PickleStep; import java.util.ArrayList; @@ -121,12 +120,6 @@ private List stepDefinitionMatches(String featurePath return result; } - void reportStepDefinitions(StepDefinitionReporter stepDefinitionReporter) { - for (StepDefinition stepDefinition : stepDefinitionsByPattern.values()) { - stepDefinitionReporter.stepDefinition(stepDefinition); - } - } - void removeScenarioScopedGlue() { removeScenarioScopedHooks(beforeHooks); removeScenarioScopedHooks(beforeStepHooks); @@ -143,8 +136,6 @@ private void removeScenarioScopedHooks(List beforeHooks) { if (hook instanceof ScenarioScoped) { ScenarioScoped scenarioScopedHookDefinition = (ScenarioScoped) hook; scenarioScopedHookDefinition.disposeScenarioScope(); - } - if (hook.isScenarioScoped()) { hookIterator.remove(); } } @@ -157,8 +148,6 @@ private void removeScenariosScopedStepDefinitions(Map st if (stepDefinition instanceof ScenarioScoped) { ScenarioScoped scenarioScopedStepDefinition = (ScenarioScoped) stepDefinition; scenarioScopedStepDefinition.disposeScenarioScope(); - } - if(stepDefinition.isScenarioScoped()){ stepDefinitionIterator.remove(); } } diff --git a/core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java b/core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java index aaa149812d..04ab50ca11 100644 --- a/core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java +++ b/core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java @@ -37,9 +37,4 @@ public String getPattern() { return null; } - @Override - public boolean isScenarioScoped() { - return false; - } - } diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index 8e2fe26841..aa085406f0 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -1,7 +1,6 @@ package io.cucumber.core.runner; import io.cucumber.core.api.event.HookType; -import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.api.event.SnippetsSuggestedEvent; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; @@ -55,10 +54,6 @@ public void runPickle(PickleEvent pickle) { disposeBackendWorlds(); } - public void reportStepDefinitions(StepDefinitionReporter stepDefinitionReporter) { - glue.reportStepDefinitions(stepDefinitionReporter); - } - private TestCase createTestCaseForPickle(PickleEvent pickleEvent) { List testSteps = new ArrayList<>(); List beforeHooks = new ArrayList<>(); diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 4ccc9481d1..d3cd721a2e 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -10,7 +10,6 @@ import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.api.plugin.Plugin; -import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.backend.SingletonObjectFactorySupplier; @@ -92,8 +91,6 @@ public void run() { for (CucumberFeature feature : features) { bus.send(new TestSourceRead(bus.getInstant(), feature.getUri().toString(), feature.getSource())); } - final StepDefinitionReporter stepDefinitionReporter = plugins.stepDefinitionReporter(); - runnerSupplier.get().reportStepDefinitions(stepDefinitionReporter); final List> executingPickles = new ArrayList<>(); for (CucumberFeature feature : features) { diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java index 26267c4e29..b84b7110fe 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsFactoryTest.java @@ -244,11 +244,6 @@ private static class BaseClassWithMonoChromeFalse { // empty } - @CucumberOptions(plugin = "io.cucumber.core.plugin.AnyStepDefinitionReporter") - private static class ClassWithNoFormatterPlugin { - // empty - } - @CucumberOptions(plugin = "pretty") private static class ClassWithNoSummaryPrinterPlugin { // empty diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index c263c559db..fd61cb0ec3 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -159,13 +159,6 @@ public void creates_progress_formatter_as_default() { assertThat(plugins.getPlugins().get(0).getClass().getName(), is("io.cucumber.core.plugin.ProgressFormatter")); } - @Test - public void creates_progress_formatter_when_no_formatter_plugin_is_specified() { - RuntimeOptions options = new RuntimeOptions(asList("--plugin", "io.cucumber.core.plugin.AnyStepDefinitionReporter", "--glue", "somewhere")); - Plugins plugins = new Plugins(new PluginFactory(), new TimeServiceEventBus(Clock.systemUTC()), options); - assertThat(plugins.getPlugins(), hasItem(plugin("io.cucumber.core.plugin.ProgressFormatter"))); - } - @Test public void creates_default_summary_printer_when_no_summary_printer_plugin_is_specified() { RuntimeOptions options = new RuntimeOptions(asList("--plugin", "pretty", "--glue", "somewhere")); diff --git a/core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java b/core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java deleted file mode 100644 index b7a04b0d2f..0000000000 --- a/core/src/test/java/io/cucumber/core/plugin/AnyStepDefinitionReporter.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.cucumber.core.plugin; - -import io.cucumber.core.api.plugin.StepDefinitionReporter; -import io.cucumber.core.backend.StepDefinition; - -public class AnyStepDefinitionReporter implements StepDefinitionReporter { - - public AnyStepDefinitionReporter() { - // TODO Auto-generated constructor stub - } - - @Override - public void stepDefinition(StepDefinition stepDefinition) { - // TODO Auto-generated method stub - } - -} diff --git a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index 76246bc90b..d30dedb805 100644 --- a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -1,7 +1,10 @@ package io.cucumber.core.runner; +import cucumber.runtime.ScenarioScoped; import gherkin.pickles.PickleString; import gherkin.pickles.PickleTable; +import gherkin.pickles.PickleTag; +import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.DuplicateStepDefinitionException; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; @@ -17,12 +20,11 @@ import io.cucumber.core.stepexpression.StepExpressionFactory; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.datatable.DataTable; -import org.junit.Before; import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; +import java.util.Collection; import java.util.Collections; +import java.util.List; import static java.util.Collections.singletonList; import static java.util.Locale.ENGLISH; @@ -32,6 +34,7 @@ import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -64,17 +67,14 @@ public void removes_glue_that_is_scenario_scoped() { // But it was too much hassle creating a better test without refactoring RuntimeGlue // and probably some of its immediate collaborators... Aslak. - StepDefinition sd = mock(StepDefinition.class); - when(sd.isScenarioScoped()).thenReturn(true); + StepDefinition sd = spy(new MockedScenarioScopedStepDefinition()); when(sd.getPattern()).thenReturn("pattern"); glue.addStepDefinition(sd); - HookDefinition bh = mock(HookDefinition.class); - when(bh.isScenarioScoped()).thenReturn(true); + HookDefinition bh = spy(new MockedScenarioScopedHookDefinition()); glue.addBeforeHook(bh); - HookDefinition ah = mock(HookDefinition.class); - when(ah.isScenarioScoped()).thenReturn(true); + HookDefinition ah = spy(new MockedScenarioScopedHookDefinition()); glue.addAfterHook(ah); assertEquals(1, glue.stepDefinitionsByPattern.size()); @@ -90,8 +90,7 @@ public void removes_glue_that_is_scenario_scoped() { @Test public void removes_scenario_scoped_cache_entries() { - StepDefinition sd = getStepDefinitionMockWithPattern("pattern"); - when(sd.isScenarioScoped()).thenReturn(true); + StepDefinition sd = new MockedScenarioScopedStepDefinition("pattern"); glue.addStepDefinition(sd); String featurePath = "someFeature.feature"; @@ -108,7 +107,7 @@ public void removes_scenario_scoped_cache_entries() { @Test public void returns_null_if_no_matching_steps_found() { - StepDefinition stepDefinition = getStepDefinitionMockWithPattern("pattern1"); + StepDefinition stepDefinition = spy(new MockedStepDefinition("pattern1")); glue.addStepDefinition(stepDefinition); String featurePath = "someFeature.feature"; @@ -119,8 +118,8 @@ public void returns_null_if_no_matching_steps_found() { @Test public void returns_match_from_cache_if_single_found() { - StepDefinition stepDefinition1 = getStepDefinitionMockWithPattern("^pattern1"); - StepDefinition stepDefinition2 = getStepDefinitionMockWithPattern("^pattern2"); + StepDefinition stepDefinition1 = spy(new MockedStepDefinition("^pattern1")); + StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); glue.addStepDefinition(stepDefinition1); glue.addStepDefinition(stepDefinition2); String featurePath = "someFeature.feature"; @@ -146,8 +145,8 @@ public void returns_match_from_cache_if_single_found() { @Test public void returns_match_from_cache_for_step_with_table() { - StepDefinition stepDefinition1 = getStepDefinitionMockWithPattern("^pattern1"); - StepDefinition stepDefinition2 = getStepDefinitionMockWithPattern("^pattern2"); + StepDefinition stepDefinition1 = spy(new MockedStepDefinition("^pattern1")); + StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); glue.addStepDefinition(stepDefinition1); glue.addStepDefinition(stepDefinition2); String featurePath = "someFeature.feature"; @@ -185,8 +184,8 @@ public void returns_match_from_cache_for_step_with_table() { @Test public void returns_match_from_cache_for_ste_with_doc_string() { - StepDefinition stepDefinition1 = getStepDefinitionMockWithPattern("^pattern1"); - StepDefinition stepDefinition2 = getStepDefinitionMockWithPattern("^pattern2"); + StepDefinition stepDefinition1 = spy(new MockedStepDefinition("^pattern1")); + StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); glue.addStepDefinition(stepDefinition1); glue.addStepDefinition(stepDefinition2); String featurePath = "someFeature.feature"; @@ -233,9 +232,9 @@ private static PickleStep getPickleStepWithDocString(String stepText, String doc @Test public void throws_ambiguous_steps_def_exception_when_many_patterns_match() { - StepDefinition stepDefinition1 = getStepDefinitionMockWithPattern("pattern1"); - StepDefinition stepDefinition2 = getStepDefinitionMockWithPattern("^pattern2"); - StepDefinition stepDefinition3 = getStepDefinitionMockWithPattern("^pattern[1,3]"); + StepDefinition stepDefinition1 = new MockedStepDefinition("pattern1"); + StepDefinition stepDefinition2 = new MockedStepDefinition("^pattern2"); + StepDefinition stepDefinition3 = new MockedStepDefinition("^pattern[1,3]"); glue.addStepDefinition(stepDefinition1); glue.addStepDefinition(stepDefinition2); glue.addStepDefinition(stepDefinition3); @@ -262,17 +261,127 @@ private static PickleStep getPickleStep(String text) { return new PickleStep(text, Collections.emptyList(), Collections.emptyList()); } - private static StepDefinition getStepDefinitionMockWithPattern(String pattern) { - StepExpression expression = new StepExpressionFactory(new TypeRegistry(ENGLISH)).createExpression(pattern); - final ArgumentMatcher argumentMatcher = new ExpressionArgumentMatcher(expression); - StepDefinition stepDefinition = mock(StepDefinition.class); - when(stepDefinition.getPattern()).thenReturn(pattern); - when(stepDefinition.matchedArguments(any(PickleStep.class))).then(new Answer() { - @Override - public Object answer(InvocationOnMock invocationOnMock) { - return argumentMatcher.argumentsFrom((PickleStep) invocationOnMock.getArgument(0)); - } - }); - return stepDefinition; + private static class MockedScenarioScopedStepDefinition implements StepDefinition, ScenarioScoped { + + private final String pattern; + + MockedScenarioScopedStepDefinition(String pattern) { + this.pattern = pattern; + } + + MockedScenarioScopedStepDefinition() { + this("mocked scenario scoped step definition"); + } + + @Override + public List matchedArguments(PickleStep step) { + StepExpression expression = new StepExpressionFactory(new TypeRegistry(ENGLISH)).createExpression(pattern); + final ArgumentMatcher argumentMatcher = new ExpressionArgumentMatcher(expression); + return argumentMatcher.argumentsFrom(step); + } + + boolean disposed; + + @Override + public void disposeScenarioScope() { + this.disposed = true; + } + + @Override + public String getLocation(boolean detail) { + return "mocked scenario scoped step definition"; + } + + @Override + public Integer getParameterCount() { + return 0; + } + + @Override + public void execute(Object[] args) { + + } + + @Override + public boolean isDefinedAt(StackTraceElement stackTraceElement) { + return false; + } + + @Override + public String getPattern() { + return pattern; + } + + } + + private static class MockedScenarioScopedHookDefinition implements HookDefinition, ScenarioScoped { + + boolean disposed; + + @Override + public void disposeScenarioScope() { + this.disposed = true; + } + + @Override + public String getLocation(boolean detail) { + return "mocked scenario scoped hook definition"; + } + + @Override + public void execute(Scenario scenario) { + + } + + @Override + public boolean matches(Collection tags) { + return true; + } + + @Override + public int getOrder() { + return 0; + } + } + + private static class MockedStepDefinition implements StepDefinition { + + private final String pattern; + + MockedStepDefinition(String pattern) { + this.pattern = pattern; + } + + @Override + public List matchedArguments(PickleStep step) { + StepExpression expression = new StepExpressionFactory(new TypeRegistry(ENGLISH)).createExpression(pattern); + final ArgumentMatcher argumentMatcher = new ExpressionArgumentMatcher(expression); + return argumentMatcher.argumentsFrom(step); + } + + @Override + public String getLocation(boolean detail) { + return "mocked step location"; + } + + @Override + public Integer getParameterCount() { + return 0; + } + + @Override + public void execute(Object[] args) { + + } + + @Override + public boolean isDefinedAt(StackTraceElement stackTraceElement) { + return false; + } + + @Override + public String getPattern() { + return pattern; + } } } diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index ccfa89c7d9..bdbbbd5151 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -57,7 +57,6 @@ import io.cucumber.core.api.event.TestCase; import io.cucumber.core.api.event.TestCaseFinished; import io.cucumber.core.api.plugin.Plugin; -import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; @@ -270,41 +269,6 @@ public void should_pass_if_no_features_are_found() { assertEquals(0x0, runtime.exitStatus()); } - @Test - public void reports_step_definitions_to_plugin() { - ResourceLoader resourceLoader = mock(ResourceLoader.class); - final StubStepDefinition stepDefinition = new StubStepDefinition("some pattern", new TypeRegistry(Locale.ENGLISH)); - TestBackendSupplier testBackendSupplier = new TestBackendSupplier() { - @Override - public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(stepDefinition); - } - }; - - Runtime.builder() - .withResourceLoader(resourceLoader) - .withArgs("--plugin", "io.cucumber.core.runtime.RuntimeTest$StepdefsPrinter") - .withBackendSupplier(testBackendSupplier) - .build() - .run(); - - assertSame(stepDefinition, StepdefsPrinter.instance.stepDefinition); - } - - public static class StepdefsPrinter implements StepDefinitionReporter { - static StepdefsPrinter instance; - StepDefinition stepDefinition; - - public StepdefsPrinter() { - instance = this; - } - - @Override - public void stepDefinition(StepDefinition stepDefinition) { - this.stepDefinition = stepDefinition; - } - } - @Test public void should_make_scenario_name_available_to_hooks() throws Throwable { final CucumberFeature feature = TestHelper.feature("path/test.feature", @@ -771,10 +735,6 @@ public String getPattern() { return "global scoped"; } - @Override - public boolean isScenarioScoped() { - return true; - } } private static final class MockedScenarioScopedStepDefinition implements StepDefinition, ScenarioScoped { @@ -816,9 +776,5 @@ public String getPattern() { return "scenario scoped"; } - @Override - public boolean isScenarioScoped() { - return true; - } } } diff --git a/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java b/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java index 67f65a497b..aef325e37f 100644 --- a/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java +++ b/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java @@ -63,8 +63,4 @@ public String getPattern() { return expression.getSource(); } - @Override - public boolean isScenarioScoped() { - return false; - } } diff --git a/junit/src/main/java/io/cucumber/junit/api/Cucumber.java b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java index 8238291b70..0f8dbe05c1 100644 --- a/junit/src/main/java/io/cucumber/junit/api/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/api/Cucumber.java @@ -2,7 +2,6 @@ import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.backend.ObjectFactorySupplier; @@ -143,8 +142,6 @@ public void evaluate() throws Throwable { for (CucumberFeature feature : features) { bus.send(new TestSourceRead(bus.getInstant(), feature.getUri().toString(), feature.getSource())); } - StepDefinitionReporter stepDefinitionReporter = plugins.stepDefinitionReporter(); - runnerSupplier.get().reportStepDefinitions(stepDefinitionReporter); runFeatures.evaluate(); bus.send(new TestRunFinished(bus.getInstant())); } diff --git a/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java index 7580792e04..f19292e440 100644 --- a/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java @@ -4,7 +4,6 @@ import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.api.event.TestSourceRead; -import io.cucumber.core.api.plugin.StepDefinitionReporter; import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.backend.ThreadLocalObjectFactorySupplier; import io.cucumber.core.event.EventBus; @@ -113,8 +112,6 @@ List getFeatures() { for (CucumberFeature feature : features) { bus.send(new TestSourceRead(bus.getInstant(), feature.getUri().toString(), feature.getSource())); } - StepDefinitionReporter stepDefinitionReporter = plugins.stepDefinitionReporter(); - runnerSupplier.get().reportStepDefinitions(stepDefinitionReporter); return features; } } From 858ff94fcc0f8ab2e9860b41f978d7309434697f Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Thu, 6 Jun 2019 21:05:51 +0200 Subject: [PATCH 080/155] Move ScenarioScoped to correct new package --- core/src/main/java/io/cucumber/core/runner/CachingGlue.java | 2 +- .../{cucumber => io/cucumber/core}/runtime/ScenarioScoped.java | 2 +- core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java | 2 +- core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java | 1 - java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java | 2 +- java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java | 2 +- 6 files changed, 5 insertions(+), 6 deletions(-) rename core/src/main/java/{cucumber => io/cucumber/core}/runtime/ScenarioScoped.java (82%) diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 02361b8f7d..6f093f3d02 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -1,12 +1,12 @@ package io.cucumber.core.runner; import io.cucumber.core.api.event.StepDefinedEvent; -import cucumber.runtime.ScenarioScoped; import io.cucumber.core.backend.DuplicateStepDefinitionException; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.event.EventBus; +import io.cucumber.core.runtime.ScenarioScoped; import io.cucumber.core.stepexpression.Argument; import gherkin.pickles.PickleStep; diff --git a/core/src/main/java/cucumber/runtime/ScenarioScoped.java b/core/src/main/java/io/cucumber/core/runtime/ScenarioScoped.java similarity index 82% rename from core/src/main/java/cucumber/runtime/ScenarioScoped.java rename to core/src/main/java/io/cucumber/core/runtime/ScenarioScoped.java index fd8b80e0ab..950bf8e59e 100644 --- a/core/src/main/java/cucumber/runtime/ScenarioScoped.java +++ b/core/src/main/java/io/cucumber/core/runtime/ScenarioScoped.java @@ -1,4 +1,4 @@ -package cucumber.runtime; +package io.cucumber.core.runtime; public interface ScenarioScoped { /** diff --git a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index d30dedb805..bcbea25770 100644 --- a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -1,6 +1,5 @@ package io.cucumber.core.runner; -import cucumber.runtime.ScenarioScoped; import gherkin.pickles.PickleString; import gherkin.pickles.PickleTable; import gherkin.pickles.PickleTag; @@ -14,6 +13,7 @@ import gherkin.pickles.PickleRow; import gherkin.pickles.PickleStep; import io.cucumber.core.event.EventBus; +import io.cucumber.core.runtime.ScenarioScoped; import io.cucumber.core.stepexpression.ArgumentMatcher; import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; import io.cucumber.core.stepexpression.StepExpression; diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index bdbbbd5151..542ced9f90 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -33,7 +33,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import io.cucumber.core.api.event.StepDefinedEvent; -import cucumber.runtime.ScenarioScoped; import gherkin.pickles.PickleStep; import io.cucumber.core.api.event.ConcurrentEventListener; import io.cucumber.core.api.event.EventHandler; diff --git a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java index 370974bd17..0f5bbf3ed5 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java @@ -1,11 +1,11 @@ package io.cucumber.java8; -import cucumber.runtime.ScenarioScoped; import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.filter.TagPredicate; import io.cucumber.core.runtime.Invoker; +import io.cucumber.core.runtime.ScenarioScoped; import io.cucumber.java8.api.HookBody; import io.cucumber.java8.api.HookNoArgsBody; diff --git a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java index cfb901c9e5..0c52f4ac5f 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java @@ -1,10 +1,10 @@ package io.cucumber.java8; -import cucumber.runtime.ScenarioScoped; import gherkin.pickles.PickleStep; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.runtime.Invoker; +import io.cucumber.core.runtime.ScenarioScoped; import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.ArgumentMatcher; import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; From 1808b0e938b89dc5cc60a3cc640d02024a6092cd Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Thu, 6 Jun 2019 21:50:40 +0200 Subject: [PATCH 081/155] Delete `isScenarioScoped` methods no longer in Hook/StepDefinition --- java/src/main/java/io/cucumber/java/JavaHookDefinition.java | 5 ----- java/src/main/java/io/cucumber/java/JavaStepDefinition.java | 5 ----- 2 files changed, 10 deletions(-) diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index 2c96124760..65ee9ba4df 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -67,9 +67,4 @@ public boolean matches(Collection tags) { public int getOrder() { return order; } - - @Override - public boolean isScenarioScoped() { - return false; - } } diff --git a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java index 47dd23c980..9b4edb7ca6 100644 --- a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java @@ -93,11 +93,6 @@ public String getPattern() { return expression.getSource(); } - @Override - public boolean isScenarioScoped() { - return false; - } - /** * This class composes all interesting parameter information into one object. */ From a7915bf46795d8b63f561489d936c44cb52c9f37 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Thu, 6 Jun 2019 21:54:19 +0200 Subject: [PATCH 082/155] Fix package declaration inside generate package-info.java classes --- java/src/main/groovy/generate-annotations.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/src/main/groovy/generate-annotations.groovy b/java/src/main/groovy/generate-annotations.groovy index 61bfd2c7dd..e00cd825a2 100644 --- a/java/src/main/groovy/generate-annotations.groovy +++ b/java/src/main/groovy/generate-annotations.groovy @@ -28,7 +28,7 @@ def package_info_java = """\ /** * \${locale.getDisplayLanguage()} */ -package io.cucumber.java.api.annotation.\${normalized_language}; +package io.cucumber.java.api.\${normalized_language}; """ From fa178e791309aa53fbdbfcbdf95c3c111194c172 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Thu, 6 Jun 2019 22:15:32 +0200 Subject: [PATCH 083/155] Also remove isScenarioScoped from Java8Hook/StepDefinition --- .../src/main/java/io/cucumber/java8/Java8HookDefinition.java | 5 ----- .../src/main/java/io/cucumber/java8/Java8StepDefinition.java | 5 ----- 2 files changed, 10 deletions(-) diff --git a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java index 0f5bbf3ed5..ce64555c70 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java @@ -64,11 +64,6 @@ public int getOrder() { return order; } - @Override - public boolean isScenarioScoped() { - return true; - } - @Override public void disposeScenarioScope() { this.hookBody = null; diff --git a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java index 0c52f4ac5f..0ee1e1e805 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java @@ -123,11 +123,6 @@ public String getPattern() { return expression.getSource(); } - @Override - public boolean isScenarioScoped() { - return true; - } - private final class LambdaTypeResolver implements TypeResolver { From 4f7ac0d55013d8df5da55e7ef805d0357c07280b Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Thu, 6 Jun 2019 22:54:39 +0200 Subject: [PATCH 084/155] Also remove isScenarioScoped from TestNg test StepDefinition --- .../io/cucumber/testng/api/StubBackendProviderService.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java b/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java index 54084b4137..2112948142 100644 --- a/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java +++ b/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java @@ -77,11 +77,6 @@ public boolean isDefinedAt(StackTraceElement stackTraceElement) { public String getPattern() { return pattern; } - - @Override - public boolean isScenarioScoped() { - return false; - } }; } From f2a47b9c52a18499879a53df9359afe55bab9766 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sun, 9 Jun 2019 00:17:59 +0200 Subject: [PATCH 085/155] [Build] Disable semver for v5 --- .travis.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index e61e5ab739..56e8f661b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,14 +7,15 @@ cache: jobs: include: - # 1.1 Semver check - - stage: test - jdk: oraclejdk8 - script: mvn verify -Pcheck-semantic-version -DskipTests=true - env: CHECK_SEMANTIC_VERSION=true + # 1.1 Semver check disabled for v5. We're breaking it. +# - stage: test +# jdk: oraclejdk8 +# script: mvn verify -Pcheck-semantic-version -DskipTests=true +# env: CHECK_SEMANTIC_VERSION=true # 1.2 Check JDK 8,10,ea - - jdk: oraclejdk8 + - stage: test + jdk: oraclejdk8 script: mvn -q verify after_success: - mvn clean cobertura:cobertura coveralls:report -P coveralls.io From fc5ce0fd40c1f4f310a6a2e319cb2ea92d8e46c5 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sun, 16 Jun 2019 09:49:48 +0200 Subject: [PATCH 086/155] [Core] Make Stats package private --- core/src/main/java/io/cucumber/core/plugin/Stats.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/io/cucumber/core/plugin/Stats.java b/core/src/main/java/io/cucumber/core/plugin/Stats.java index 84f687d385..a57d2f81bf 100755 --- a/core/src/main/java/io/cucumber/core/plugin/Stats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Stats.java @@ -23,7 +23,7 @@ import static java.util.concurrent.TimeUnit.SECONDS; -public class Stats implements EventListener, ColorAware, StrictAware { +class Stats implements EventListener, ColorAware, StrictAware { static final long ONE_SECOND = SECONDS.toNanos(1); static final long ONE_MINUTE = 60 * ONE_SECOND; private SubCounts scenarioSubCounts = new SubCounts(); From 160276d91f3b575fdaf0356818267f3265689859 Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sun, 16 Jun 2019 09:49:59 +0200 Subject: [PATCH 087/155] [Core] Clean up unused imports --- .../main/java/io/cucumber/core/api/plugin/SummaryPrinter.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java b/core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java index 8e0576c708..2cfb04ba9c 100644 --- a/core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java @@ -1,7 +1,5 @@ package io.cucumber.core.api.plugin; -import io.cucumber.core.api.plugin.Plugin; - /** * Interface for plugins that print a summary after test execution. * From cebf91f6e834543364233f3ec76a14b45c89269b Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sun, 16 Jun 2019 10:17:57 +0200 Subject: [PATCH 088/155] [JUnit] Replace `api` package with @API Guardian See: https://github.com/cucumber/cucumber-jvm/issues/1536 --- .../test/java/io/cucumber/cdi2/RunCukesTest.java | 2 +- .../examples/java/calculator/RunCukesTest.java | 2 +- .../cucumber/examples/java/wicket/RunCukesIT.java | 2 +- .../examples/java/calculator/RunCukesTest.java | 2 +- .../examples/spring/txn/RunCucumberTest.java | 2 +- .../cucumber/guice/integration/RunCukesTest.java | 2 +- .../io/cucumber/java/annotation/RunCukesTest.java | 2 +- .../io/cucumber/java8/lambda/RunCukesTest.java | 2 +- .../io/cucumber/junit/{api => }/Assertions.java | 2 +- .../java/io/cucumber/junit/{api => }/Cucumber.java | 4 +++- .../io/cucumber/junit/{api => }/FeatureRunner.java | 8 ++++---- .../io/cucumber/junit/{api => }/JUnitOptions.java | 2 +- .../io/cucumber/junit/{api => }/JUnitReporter.java | 8 ++++---- .../io/cucumber/junit/{api => }/PickleRunners.java | 2 +- .../cucumber/junit/{api => }/SkippedThrowable.java | 2 +- .../junit/{api => }/UndefinedThrowable.java | 3 +-- .../io/cucumber/junit/{api => }/OPTIONS.txt | 0 .../cucumber/junit/{api => }/AssertionsTest.java | 4 ++-- .../io/cucumber/junit/{api => }/CucumberTest.java | 12 ++++++------ .../junit/{api => }/DescriptionMatcher.java | 2 +- .../cucumber/junit/{api => }/FailureMatcher.java | 2 +- .../junit/{api => }/FeatureRunnerTest.java | 2 +- .../{api => }/InvokeMethodsAroundEventsTest.java | 4 ++-- .../junit/{api => }/JUnitReporterTest.java | 8 ++++---- .../PickleRunnerWithNoStepDescriptionsTest.java | 5 ++--- .../PickleRunnerWithStepDescriptionsTest.java | 6 +++--- .../io/cucumber/junit/{api => }/RunCukesTest.java | 2 +- .../{api => }/RunCukesTestNoStepNotifications.java | 2 +- .../io/cucumber/junit/{api => }/SanityChecker.java | 2 +- .../io/cucumber/junit/{api => }/SanityTest.java | 2 +- .../{api => }/StubBackendProviderService.java | 2 +- .../junit/{api => }/TestPendingException.java | 2 +- .../junit/{api => }/TestPickleBuilder.java | 2 +- ...io.cucumber.core.backend.BackendProviderService | 2 +- .../cucumber/{junit => }/error/lexer_error.feature | 0 .../io/cucumber/junit/{api => }/fa.feature | 0 .../io/cucumber/junit/{api => }/fb.feature | 0 .../test/kotlin/io/cucumber/kotlin/RunCukesTest.kt | 2 +- .../test/java/io/cucumber/needle/RunCukesTest.java | 2 +- .../java/io/cucumber/openejb/RunCukesTest.java | 2 +- .../io/cucumber/picocontainer/RunCukesTest.java | 2 +- pom.xml | 14 ++++++++------ .../spring/contextconfig/RunCucumberTest.java | 2 +- .../dirtiescontextconfig/RunCucumberTest.java | 2 +- .../spring/metaconfig/dirties/RunCucumberTest.java | 2 +- .../spring/metaconfig/general/RunCucumberTest.java | 2 +- .../spring/webappconfig/RunCucumberTest.java | 2 +- .../test/java/io/cucumber/weld/RunCukesTest.java | 2 +- 48 files changed, 72 insertions(+), 70 deletions(-) rename junit/src/main/java/io/cucumber/junit/{api => }/Assertions.java (97%) rename junit/src/main/java/io/cucumber/junit/{api => }/Cucumber.java (98%) rename junit/src/main/java/io/cucumber/junit/{api => }/FeatureRunner.java (94%) rename junit/src/main/java/io/cucumber/junit/{api => }/JUnitOptions.java (98%) rename junit/src/main/java/io/cucumber/junit/{api => }/JUnitReporter.java (97%) rename junit/src/main/java/io/cucumber/junit/{api => }/PickleRunners.java (99%) rename junit/src/main/java/io/cucumber/junit/{api => }/SkippedThrowable.java (93%) rename junit/src/main/java/io/cucumber/junit/{api => }/UndefinedThrowable.java (91%) rename junit/src/main/resources/io/cucumber/junit/{api => }/OPTIONS.txt (100%) rename junit/src/test/java/io/cucumber/junit/{api => }/AssertionsTest.java (94%) rename junit/src/test/java/io/cucumber/junit/{api => }/CucumberTest.java (95%) rename junit/src/test/java/io/cucumber/junit/{api => }/DescriptionMatcher.java (92%) rename junit/src/test/java/io/cucumber/junit/{api => }/FailureMatcher.java (92%) rename junit/src/test/java/io/cucumber/junit/{api => }/FeatureRunnerTest.java (99%) rename junit/src/test/java/io/cucumber/junit/{api => }/InvokeMethodsAroundEventsTest.java (92%) rename junit/src/test/java/io/cucumber/junit/{api => }/JUnitReporterTest.java (99%) rename junit/src/test/java/io/cucumber/junit/{api => }/PickleRunnerWithNoStepDescriptionsTest.java (94%) rename junit/src/test/java/io/cucumber/junit/{api => }/PickleRunnerWithStepDescriptionsTest.java (97%) rename junit/src/test/java/io/cucumber/junit/{api => }/RunCukesTest.java (74%) rename junit/src/test/java/io/cucumber/junit/{api => }/RunCukesTestNoStepNotifications.java (87%) rename junit/src/test/java/io/cucumber/junit/{api => }/SanityChecker.java (98%) rename junit/src/test/java/io/cucumber/junit/{api => }/SanityTest.java (93%) rename junit/src/test/java/io/cucumber/junit/{api => }/StubBackendProviderService.java (97%) rename junit/src/test/java/io/cucumber/junit/{api => }/TestPendingException.java (90%) rename junit/src/test/java/io/cucumber/junit/{api => }/TestPickleBuilder.java (98%) rename junit/src/test/resources/io/cucumber/{junit => }/error/lexer_error.feature (100%) rename junit/src/test/resources/io/cucumber/junit/{api => }/fa.feature (100%) rename junit/src/test/resources/io/cucumber/junit/{api => }/fb.feature (100%) diff --git a/cdi2/src/test/java/io/cucumber/cdi2/RunCukesTest.java b/cdi2/src/test/java/io/cucumber/cdi2/RunCukesTest.java index a53e13a5ab..fa9f7af3f3 100644 --- a/cdi2/src/test/java/io/cucumber/cdi2/RunCukesTest.java +++ b/cdi2/src/test/java/io/cucumber/cdi2/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.cdi2; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index 534ea5524d..5aebde3233 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,7 +1,7 @@ package io.cucumber.examples.java.calculator; import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java index 57edd50ce6..6a1058dfa1 100644 --- a/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java +++ b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/RunCukesIT.java @@ -1,6 +1,6 @@ package io.cucumber.examples.java.wicket; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index cbfe292145..595d71bfc3 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,7 +1,7 @@ package io.cucumber.examples.java.calculator; import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCucumberTest.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCucumberTest.java index ae0ed19cbc..361dad83a9 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCucumberTest.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCucumberTest.java @@ -1,7 +1,7 @@ package io.cucumber.examples.spring.txn; import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java b/guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java index 10ba1c347f..45f2a1c3c6 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java +++ b/guice/src/test/java/io/cucumber/guice/integration/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.guice.integration; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; /** diff --git a/java/src/test/java/io/cucumber/java/annotation/RunCukesTest.java b/java/src/test/java/io/cucumber/java/annotation/RunCukesTest.java index d0e7104291..316e6c4f97 100644 --- a/java/src/test/java/io/cucumber/java/annotation/RunCukesTest.java +++ b/java/src/test/java/io/cucumber/java/annotation/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.java.annotation; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/java8/src/test/java/io/cucumber/java8/lambda/RunCukesTest.java b/java8/src/test/java/io/cucumber/java8/lambda/RunCukesTest.java index 664b02f11b..526ccc163a 100644 --- a/java8/src/test/java/io/cucumber/java8/lambda/RunCukesTest.java +++ b/java8/src/test/java/io/cucumber/java8/lambda/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.java8.lambda; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/junit/src/main/java/io/cucumber/junit/api/Assertions.java b/junit/src/main/java/io/cucumber/junit/Assertions.java similarity index 97% rename from junit/src/main/java/io/cucumber/junit/api/Assertions.java rename to junit/src/main/java/io/cucumber/junit/Assertions.java index 4c56c9dc41..cffdfab5d1 100644 --- a/junit/src/main/java/io/cucumber/junit/api/Assertions.java +++ b/junit/src/main/java/io/cucumber/junit/Assertions.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import io.cucumber.core.exception.CucumberException; diff --git a/junit/src/main/java/io/cucumber/junit/api/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java similarity index 98% rename from junit/src/main/java/io/cucumber/junit/api/Cucumber.java rename to junit/src/main/java/io/cucumber/junit/Cucumber.java index 1d06517a9a..d6760303d3 100644 --- a/junit/src/main/java/io/cucumber/junit/api/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.api.options.CucumberOptions; @@ -23,6 +23,7 @@ import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; import io.cucumber.core.model.CucumberFeature; +import org.apiguardian.api.API; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -62,6 +63,7 @@ * * @see CucumberOptions */ +@API(status = API.Status.STABLE) public class Cucumber extends ParentRunner { private final List children = new ArrayList<>(); private final EventBus bus; diff --git a/junit/src/main/java/io/cucumber/junit/api/FeatureRunner.java b/junit/src/main/java/io/cucumber/junit/FeatureRunner.java similarity index 94% rename from junit/src/main/java/io/cucumber/junit/api/FeatureRunner.java rename to junit/src/main/java/io/cucumber/junit/FeatureRunner.java index 2ff5f3944e..537326ec9e 100644 --- a/junit/src/main/java/io/cucumber/junit/api/FeatureRunner.java +++ b/junit/src/main/java/io/cucumber/junit/FeatureRunner.java @@ -1,10 +1,10 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import gherkin.ast.Feature; import gherkin.events.PickleEvent; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.filter.Filters; -import io.cucumber.junit.api.PickleRunners.PickleRunner; +import io.cucumber.junit.PickleRunners.PickleRunner; import io.cucumber.core.model.CucumberFeature; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import org.junit.runner.Description; @@ -17,8 +17,8 @@ import java.util.ArrayList; import java.util.List; -import static io.cucumber.junit.api.PickleRunners.withNoStepDescriptions; -import static io.cucumber.junit.api.PickleRunners.withStepDescriptions; +import static io.cucumber.junit.PickleRunners.withNoStepDescriptions; +import static io.cucumber.junit.PickleRunners.withStepDescriptions; class FeatureRunner extends ParentRunner { private final List children = new ArrayList<>(); diff --git a/junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java b/junit/src/main/java/io/cucumber/junit/JUnitOptions.java similarity index 98% rename from junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java rename to junit/src/main/java/io/cucumber/junit/JUnitOptions.java index 3cc9baf7c2..0daffb2601 100644 --- a/junit/src/main/java/io/cucumber/junit/api/JUnitOptions.java +++ b/junit/src/main/java/io/cucumber/junit/JUnitOptions.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.util.FixJava; diff --git a/junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java similarity index 97% rename from junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java rename to junit/src/main/java/io/cucumber/junit/JUnitReporter.java index c419b17d5c..058f9c3376 100644 --- a/junit/src/main/java/io/cucumber/junit/api/JUnitReporter.java +++ b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.PickleStepTestStep; @@ -7,7 +7,7 @@ import io.cucumber.core.api.event.TestCaseStarted; import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.api.event.TestStepStarted; -import io.cucumber.junit.api.PickleRunners.PickleRunner; +import io.cucumber.junit.PickleRunners.PickleRunner; import io.cucumber.core.event.EventBus; import org.junit.runner.Description; import org.junit.runner.notification.Failure; @@ -16,8 +16,8 @@ import java.util.ArrayList; -import static io.cucumber.junit.api.SkippedThrowable.NotificationLevel.SCENARIO; -import static io.cucumber.junit.api.SkippedThrowable.NotificationLevel.STEP; +import static io.cucumber.junit.SkippedThrowable.NotificationLevel.SCENARIO; +import static io.cucumber.junit.SkippedThrowable.NotificationLevel.STEP; class JUnitReporter { diff --git a/junit/src/main/java/io/cucumber/junit/api/PickleRunners.java b/junit/src/main/java/io/cucumber/junit/PickleRunners.java similarity index 99% rename from junit/src/main/java/io/cucumber/junit/api/PickleRunners.java rename to junit/src/main/java/io/cucumber/junit/PickleRunners.java index 236290161d..c1a43c1417 100644 --- a/junit/src/main/java/io/cucumber/junit/api/PickleRunners.java +++ b/junit/src/main/java/io/cucumber/junit/PickleRunners.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import io.cucumber.core.runner.Runner; import io.cucumber.core.runtime.RunnerSupplier; diff --git a/junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java b/junit/src/main/java/io/cucumber/junit/SkippedThrowable.java similarity index 93% rename from junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java rename to junit/src/main/java/io/cucumber/junit/SkippedThrowable.java index e0be481e79..490ecc29a6 100644 --- a/junit/src/main/java/io/cucumber/junit/api/SkippedThrowable.java +++ b/junit/src/main/java/io/cucumber/junit/SkippedThrowable.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import static java.util.Locale.ROOT; diff --git a/junit/src/main/java/io/cucumber/junit/api/UndefinedThrowable.java b/junit/src/main/java/io/cucumber/junit/UndefinedThrowable.java similarity index 91% rename from junit/src/main/java/io/cucumber/junit/api/UndefinedThrowable.java rename to junit/src/main/java/io/cucumber/junit/UndefinedThrowable.java index 97c8c34281..9585df6f59 100644 --- a/junit/src/main/java/io/cucumber/junit/api/UndefinedThrowable.java +++ b/junit/src/main/java/io/cucumber/junit/UndefinedThrowable.java @@ -1,5 +1,4 @@ -package io.cucumber.junit.api; - +package io.cucumber.junit; class UndefinedThrowable extends Throwable { private static final long serialVersionUID = 1L; diff --git a/junit/src/main/resources/io/cucumber/junit/api/OPTIONS.txt b/junit/src/main/resources/io/cucumber/junit/OPTIONS.txt similarity index 100% rename from junit/src/main/resources/io/cucumber/junit/api/OPTIONS.txt rename to junit/src/main/resources/io/cucumber/junit/OPTIONS.txt diff --git a/junit/src/test/java/io/cucumber/junit/api/AssertionsTest.java b/junit/src/test/java/io/cucumber/junit/AssertionsTest.java similarity index 94% rename from junit/src/test/java/io/cucumber/junit/api/AssertionsTest.java rename to junit/src/test/java/io/cucumber/junit/AssertionsTest.java index b79653312c..79919765d3 100644 --- a/junit/src/test/java/io/cucumber/junit/api/AssertionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/AssertionsTest.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import io.cucumber.core.exception.CucumberException; import org.junit.Test; @@ -19,7 +19,7 @@ public class AssertionsTest { public void should_throw_cucumber_exception_when_annotated() { final Executable testMethod = () -> Assertions.assertNoCucumberAnnotatedMethods(WithCucumberMethod.class); final CucumberException expectedThrown = assertThrows(CucumberException.class, testMethod); - assertThat(expectedThrown.getMessage(), is(equalTo("\n\nClasses annotated with @RunWith(Cucumber.class) must not define any\nStep Definition or Hook methods. Their sole purpose is to serve as\nan entry point for JUnit. Step Definitions and Hooks should be defined\nin their own classes. This allows them to be reused across features.\nOffending class: class io.cucumber.junit.api.AssertionsTest$WithCucumberMethod\n"))); + assertThat(expectedThrown.getMessage(), is(equalTo("\n\nClasses annotated with @RunWith(Cucumber.class) must not define any\nStep Definition or Hook methods. Their sole purpose is to serve as\nan entry point for JUnit. Step Definitions and Hooks should be defined\nin their own classes. This allows them to be reused across features.\nOffending class: class io.cucumber.junit.AssertionsTest$WithCucumberMethod\n"))); } @RunWith(Cucumber.class) diff --git a/junit/src/test/java/io/cucumber/junit/api/CucumberTest.java b/junit/src/test/java/io/cucumber/junit/CucumberTest.java similarity index 95% rename from junit/src/test/java/io/cucumber/junit/api/CucumberTest.java rename to junit/src/test/java/io/cucumber/junit/CucumberTest.java index 011d1bd479..6903b29b41 100644 --- a/junit/src/test/java/io/cucumber/junit/api/CucumberTest.java +++ b/junit/src/test/java/io/cucumber/junit/CucumberTest.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import gherkin.ParserException.CompositeParserException; import io.cucumber.core.api.options.CucumberOptions; @@ -152,7 +152,7 @@ public void cucumber_can_run_pickles_in_parallel() throws Exception { public void cucumber_returns_description_tree_with_features_and_pickles() throws InitializationError { Description description = new Cucumber(RunCukesTestValidEmpty.class).getDescription(); - assertThat(description.getDisplayName(), is("io.cucumber.junit.api.CucumberTest$RunCukesTestValidEmpty")); + assertThat(description.getDisplayName(), is("io.cucumber.junit.CucumberTest$RunCukesTestValidEmpty")); Description feature = description.getChildren().get(0); assertThat(feature.getDisplayName(), is("Feature: Feature A")); Description pickle = feature.getChildren().get(0); @@ -187,13 +187,13 @@ public void no_stepdefs_in_cucumber_runner_valid() { public void no_stepdefs_in_cucumber_runner_invalid() { final Executable testMethod = () -> Assertions.assertNoCucumberAnnotatedMethods(RunCukesTestInvalid.class); final CucumberException expectedThrown = assertThrows(CucumberException.class, testMethod); - assertThat(expectedThrown.getMessage(), is(equalTo("\n\nClasses annotated with @RunWith(Cucumber.class) must not define any\nStep Definition or Hook methods. Their sole purpose is to serve as\nan entry point for JUnit. Step Definitions and Hooks should be defined\nin their own classes. This allows them to be reused across features.\nOffending class: class io.cucumber.junit.api.CucumberTest$RunCukesTestInvalid\n"))); + assertThat(expectedThrown.getMessage(), is(equalTo("\n\nClasses annotated with @RunWith(Cucumber.class) must not define any\nStep Definition or Hook methods. Their sole purpose is to serve as\nan entry point for JUnit. Step Definitions and Hooks should be defined\nin their own classes. This allows them to be reused across features.\nOffending class: class io.cucumber.junit.CucumberTest$RunCukesTestInvalid\n"))); } public class ImplicitFeatureAndGluePath { } - @CucumberOptions(features = {"classpath:io/cucumber/junit/api"}) + @CucumberOptions(features = {"classpath:io/cucumber/junit"}) public class ExplicitFeaturePath { } @@ -201,12 +201,12 @@ public class ExplicitFeaturePath { public class ExplicitFeaturePathWithNoFeatures { } - @CucumberOptions(features = {"classpath:io/cucumber/junit/error/lexer_error.feature"}) + @CucumberOptions(features = {"classpath:io/cucumber/error/lexer_error.feature"}) public class LexerErrorFeature { } - @CucumberOptions(features = {"classpath:io/cucumber/junit/error/lexer_error.feature"}, plugin = {"json:target/lexor_error_feature.json"}) + @CucumberOptions(features = {"classpath:io/cucumber/error/lexer_error.feature"}, plugin = {"json:target/lexor_error_feature.json"}) public class FormatterWithLexerErrorFeature { } diff --git a/junit/src/test/java/io/cucumber/junit/api/DescriptionMatcher.java b/junit/src/test/java/io/cucumber/junit/DescriptionMatcher.java similarity index 92% rename from junit/src/test/java/io/cucumber/junit/api/DescriptionMatcher.java rename to junit/src/test/java/io/cucumber/junit/DescriptionMatcher.java index 70c18cf4a7..bd41aa4fb0 100644 --- a/junit/src/test/java/io/cucumber/junit/api/DescriptionMatcher.java +++ b/junit/src/test/java/io/cucumber/junit/DescriptionMatcher.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import org.junit.runner.Description; import org.mockito.ArgumentMatcher; diff --git a/junit/src/test/java/io/cucumber/junit/api/FailureMatcher.java b/junit/src/test/java/io/cucumber/junit/FailureMatcher.java similarity index 92% rename from junit/src/test/java/io/cucumber/junit/api/FailureMatcher.java rename to junit/src/test/java/io/cucumber/junit/FailureMatcher.java index 8dc1876ac3..7ff6ae5f87 100644 --- a/junit/src/test/java/io/cucumber/junit/api/FailureMatcher.java +++ b/junit/src/test/java/io/cucumber/junit/FailureMatcher.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import org.junit.runner.notification.Failure; import org.mockito.ArgumentMatcher; diff --git a/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java similarity index 99% rename from junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java rename to junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index 6399db5e0e..69a7689c04 100644 --- a/junit/src/test/java/io/cucumber/junit/api/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.backend.SingletonObjectFactorySupplier; diff --git a/junit/src/test/java/io/cucumber/junit/api/InvokeMethodsAroundEventsTest.java b/junit/src/test/java/io/cucumber/junit/InvokeMethodsAroundEventsTest.java similarity index 92% rename from junit/src/test/java/io/cucumber/junit/api/InvokeMethodsAroundEventsTest.java rename to junit/src/test/java/io/cucumber/junit/InvokeMethodsAroundEventsTest.java index 56b0f56aab..89d4237b30 100644 --- a/junit/src/test/java/io/cucumber/junit/api/InvokeMethodsAroundEventsTest.java +++ b/junit/src/test/java/io/cucumber/junit/InvokeMethodsAroundEventsTest.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import io.cucumber.core.api.event.ConcurrentEventListener; import io.cucumber.core.api.event.EventPublisher; @@ -33,7 +33,7 @@ public void invoke_methods_around_events() throws InitializationError { assertThat(events, contains("BeforeClass", "TestRunStarted", "TestRunFinished", "AfterClass")); } - @CucumberOptions(plugin = {"io.cucumber.junit.api.InvokeMethodsAroundEventsTest$TestRunStartedFinishedListener"}) + @CucumberOptions(plugin = {"io.cucumber.junit.InvokeMethodsAroundEventsTest$TestRunStartedFinishedListener"}) public static class BeforeAfterClass { @BeforeClass diff --git a/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java similarity index 99% rename from junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java rename to junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java index e1aac968b2..93ab5c37e2 100644 --- a/junit/src/test/java/io/cucumber/junit/api/JUnitReporterTest.java +++ b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java @@ -1,11 +1,11 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.PickleStepTestStep; import io.cucumber.core.event.EventBus; -import io.cucumber.junit.api.JUnitReporter.EachTestNotifier; -import io.cucumber.junit.api.JUnitReporter.NoTestNotifier; -import io.cucumber.junit.api.PickleRunners.PickleRunner; +import io.cucumber.junit.JUnitReporter.EachTestNotifier; +import io.cucumber.junit.JUnitReporter.NoTestNotifier; +import io.cucumber.junit.PickleRunners.PickleRunner; import gherkin.pickles.PickleStep; import org.junit.AssumptionViolatedException; import org.junit.Test; diff --git a/junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithNoStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java similarity index 94% rename from junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithNoStepDescriptionsTest.java rename to junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java index d421220c6a..63471a447b 100644 --- a/junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithNoStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java @@ -1,9 +1,8 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import gherkin.events.PickleEvent; import io.cucumber.core.runtime.RunnerSupplier; -import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; -import io.cucumber.junit.api.PickleRunners.PickleRunner; +import io.cucumber.junit.PickleRunners.PickleRunner; import org.junit.Test; import java.util.Arrays; diff --git a/junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java similarity index 97% rename from junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithStepDescriptionsTest.java rename to junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java index cdc73faa1b..003f2a0a66 100644 --- a/junit/src/test/java/io/cucumber/junit/api/PickleRunnerWithStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java @@ -1,12 +1,12 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.mockito.Mockito.mock; import io.cucumber.core.runtime.RunnerSupplier; -import io.cucumber.junit.api.PickleRunners.PickleRunner; -import io.cucumber.junit.api.PickleRunners.WithStepDescriptions; +import io.cucumber.junit.PickleRunners.PickleRunner; +import io.cucumber.junit.PickleRunners.WithStepDescriptions; import io.cucumber.core.model.CucumberFeature; import gherkin.events.PickleEvent; import gherkin.pickles.Compiler; diff --git a/junit/src/test/java/io/cucumber/junit/api/RunCukesTest.java b/junit/src/test/java/io/cucumber/junit/RunCukesTest.java similarity index 74% rename from junit/src/test/java/io/cucumber/junit/api/RunCukesTest.java rename to junit/src/test/java/io/cucumber/junit/RunCukesTest.java index 5aee36340d..da8d74f428 100644 --- a/junit/src/test/java/io/cucumber/junit/api/RunCukesTest.java +++ b/junit/src/test/java/io/cucumber/junit/RunCukesTest.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import org.junit.runner.RunWith; diff --git a/junit/src/test/java/io/cucumber/junit/api/RunCukesTestNoStepNotifications.java b/junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java similarity index 87% rename from junit/src/test/java/io/cucumber/junit/api/RunCukesTestNoStepNotifications.java rename to junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java index ec8973b566..344571ecbd 100644 --- a/junit/src/test/java/io/cucumber/junit/api/RunCukesTestNoStepNotifications.java +++ b/junit/src/test/java/io/cucumber/junit/RunCukesTestNoStepNotifications.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import io.cucumber.core.api.options.CucumberOptions; import org.junit.runner.RunWith; diff --git a/junit/src/test/java/io/cucumber/junit/api/SanityChecker.java b/junit/src/test/java/io/cucumber/junit/SanityChecker.java similarity index 98% rename from junit/src/test/java/io/cucumber/junit/api/SanityChecker.java rename to junit/src/test/java/io/cucumber/junit/SanityChecker.java index b9e05fc0a3..7884d46221 100644 --- a/junit/src/test/java/io/cucumber/junit/api/SanityChecker.java +++ b/junit/src/test/java/io/cucumber/junit/SanityChecker.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import junit.framework.AssertionFailedError; import junit.framework.JUnit4TestAdapter; diff --git a/junit/src/test/java/io/cucumber/junit/api/SanityTest.java b/junit/src/test/java/io/cucumber/junit/SanityTest.java similarity index 93% rename from junit/src/test/java/io/cucumber/junit/api/SanityTest.java rename to junit/src/test/java/io/cucumber/junit/SanityTest.java index dd1c3a24cf..f0ca993f79 100644 --- a/junit/src/test/java/io/cucumber/junit/api/SanityTest.java +++ b/junit/src/test/java/io/cucumber/junit/SanityTest.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import org.junit.Test; diff --git a/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java b/junit/src/test/java/io/cucumber/junit/StubBackendProviderService.java similarity index 97% rename from junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java rename to junit/src/test/java/io/cucumber/junit/StubBackendProviderService.java index 7c68e8d456..e533f53c17 100644 --- a/junit/src/test/java/io/cucumber/junit/api/StubBackendProviderService.java +++ b/junit/src/test/java/io/cucumber/junit/StubBackendProviderService.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import gherkin.pickles.PickleStep; diff --git a/junit/src/test/java/io/cucumber/junit/api/TestPendingException.java b/junit/src/test/java/io/cucumber/junit/TestPendingException.java similarity index 90% rename from junit/src/test/java/io/cucumber/junit/api/TestPendingException.java rename to junit/src/test/java/io/cucumber/junit/TestPendingException.java index fc4a2bf45e..eaa5ca54ac 100644 --- a/junit/src/test/java/io/cucumber/junit/api/TestPendingException.java +++ b/junit/src/test/java/io/cucumber/junit/TestPendingException.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import io.cucumber.core.backend.Pending; diff --git a/junit/src/test/java/io/cucumber/junit/api/TestPickleBuilder.java b/junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java similarity index 98% rename from junit/src/test/java/io/cucumber/junit/api/TestPickleBuilder.java rename to junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java index 0938d68c61..0aa399a4c2 100644 --- a/junit/src/test/java/io/cucumber/junit/api/TestPickleBuilder.java +++ b/junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java @@ -1,4 +1,4 @@ -package io.cucumber.junit.api; +package io.cucumber.junit; import io.cucumber.core.model.FeatureParser; import gherkin.events.PickleEvent; diff --git a/junit/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService b/junit/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService index fb092f3236..86415bfe75 100644 --- a/junit/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService +++ b/junit/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService @@ -1 +1 @@ -io.cucumber.junit.api.StubBackendProviderService \ No newline at end of file +io.cucumber.junit.StubBackendProviderService \ No newline at end of file diff --git a/junit/src/test/resources/io/cucumber/junit/error/lexer_error.feature b/junit/src/test/resources/io/cucumber/error/lexer_error.feature similarity index 100% rename from junit/src/test/resources/io/cucumber/junit/error/lexer_error.feature rename to junit/src/test/resources/io/cucumber/error/lexer_error.feature diff --git a/junit/src/test/resources/io/cucumber/junit/api/fa.feature b/junit/src/test/resources/io/cucumber/junit/fa.feature similarity index 100% rename from junit/src/test/resources/io/cucumber/junit/api/fa.feature rename to junit/src/test/resources/io/cucumber/junit/fa.feature diff --git a/junit/src/test/resources/io/cucumber/junit/api/fb.feature b/junit/src/test/resources/io/cucumber/junit/fb.feature similarity index 100% rename from junit/src/test/resources/io/cucumber/junit/api/fb.feature rename to junit/src/test/resources/io/cucumber/junit/fb.feature diff --git a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt index a8c72e1abe..030c347b4f 100644 --- a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/RunCukesTest.kt @@ -1,6 +1,6 @@ package io.cucumber.runtime.kotlin.test -import io.cucumber.junit.api.Cucumber +import io.cucumber.junit.Cucumber import org.junit.runner.RunWith @RunWith(Cucumber::class) diff --git a/needle/src/test/java/io/cucumber/needle/RunCukesTest.java b/needle/src/test/java/io/cucumber/needle/RunCukesTest.java index bcb819351b..6e160ff30f 100755 --- a/needle/src/test/java/io/cucumber/needle/RunCukesTest.java +++ b/needle/src/test/java/io/cucumber/needle/RunCukesTest.java @@ -2,7 +2,7 @@ import org.junit.runner.RunWith; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; @RunWith(Cucumber.class) public class RunCukesTest { diff --git a/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java b/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java index e07b04d9da..214bfbdfa6 100644 --- a/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java +++ b/openejb/src/test/java/io/cucumber/openejb/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.openejb; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java b/picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java index 8a2ebd6f49..af32c1c048 100644 --- a/picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.picocontainer; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/pom.xml b/pom.xml index cedce7513d..b37ca613e0 100644 --- a/pom.xml +++ b/pom.xml @@ -38,12 +38,13 @@ + + 1.1.0 5.1.0 7.0.2 1.1.14 1.1.1 - 0.2.7 4.12 @@ -66,6 +67,12 @@ + + org.apiguardian + apiguardian-api + ${apiguardian-api.version} + + io.cucumber gherkin @@ -132,11 +139,6 @@ cucumber-picocontainer ${project.version} - - io.cucumber - cucumber-html - ${cucumber-html.version} - io.cucumber cucumber-kotlin-java8 diff --git a/spring/src/test/java/io/cucumber/spring/contextconfig/RunCucumberTest.java b/spring/src/test/java/io/cucumber/spring/contextconfig/RunCucumberTest.java index 2f424c29a8..900204c68d 100644 --- a/spring/src/test/java/io/cucumber/spring/contextconfig/RunCucumberTest.java +++ b/spring/src/test/java/io/cucumber/spring/contextconfig/RunCucumberTest.java @@ -1,7 +1,7 @@ package io.cucumber.spring.contextconfig; import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCucumberTest.java b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCucumberTest.java index c60316bdb7..522d6dd8c6 100644 --- a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCucumberTest.java +++ b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/RunCucumberTest.java @@ -1,7 +1,7 @@ package io.cucumber.spring.dirtiescontextconfig; import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCucumberTest.java b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCucumberTest.java index dad9ee015d..912cb679a8 100644 --- a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCucumberTest.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/RunCucumberTest.java @@ -1,7 +1,7 @@ package io.cucumber.spring.metaconfig.dirties; import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCucumberTest.java b/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCucumberTest.java index 9ed4d248fa..1a0c5b1707 100644 --- a/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCucumberTest.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/general/RunCucumberTest.java @@ -1,7 +1,7 @@ package io.cucumber.spring.metaconfig.general; import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/spring/src/test/java/io/cucumber/spring/webappconfig/RunCucumberTest.java b/spring/src/test/java/io/cucumber/spring/webappconfig/RunCucumberTest.java index f29422ce68..57ccf67a8e 100644 --- a/spring/src/test/java/io/cucumber/spring/webappconfig/RunCucumberTest.java +++ b/spring/src/test/java/io/cucumber/spring/webappconfig/RunCucumberTest.java @@ -1,7 +1,7 @@ package io.cucumber.spring.webappconfig; import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/weld/src/test/java/io/cucumber/weld/RunCukesTest.java b/weld/src/test/java/io/cucumber/weld/RunCukesTest.java index c926b94d96..3817ef07fe 100644 --- a/weld/src/test/java/io/cucumber/weld/RunCukesTest.java +++ b/weld/src/test/java/io/cucumber/weld/RunCukesTest.java @@ -1,6 +1,6 @@ package io.cucumber.weld; -import io.cucumber.junit.api.Cucumber; +import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) From 51e5c9078e56ebcce0ef63dcb86c1cada65be81c Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sun, 16 Jun 2019 16:02:59 +0200 Subject: [PATCH 089/155] [TestNG] Replace `api` package with @API Guardian See: https://github.com/cucumber/cucumber-jvm/issues/1536 --- .../calculator/RunCukesByCompositionTest.java | 10 +++---- .../java/calculator/RunCukesTest.java | 2 +- .../main/java/io/cucumber/junit/Cucumber.java | 2 +- testng/README.md | 6 ++-- testng/pom.xml | 5 ++++ .../AbstractTestNGCucumberTests.java | 11 ++++--- .../{api => }/CucumberExceptionWrapper.java | 2 +- .../{api => }/CucumberFeatureWrapper.java | 5 +++- .../{api => }/CucumberFeatureWrapperImpl.java | 2 +- .../testng/{api => }/PickleEventWrapper.java | 4 ++- .../{api => }/PickleEventWrapperImpl.java | 2 +- .../{api => }/TestCaseResultListener.java | 6 ++-- .../{api => }/TestNGCucumberRunner.java | 6 ++-- .../AbstractTestNGCucumberTestsTest.java | 2 +- .../{api => }/InvokedMethodListener.java | 6 ++-- .../testng/{api => }/RunCukesTest.java | 2 +- .../RunFeatureWithThreeScenariosTest.java | 9 ++++++ .../{api => }/StubBackendProviderService.java | 2 +- .../{api => }/TestCaseResultListenerTest.java | 4 +-- .../{api => }/TestNGCucumberRunnerTest.java | 29 ++++++------------- .../{api => }/TestPendingException.java | 2 +- .../api/RunFeatureWithThreeScenariosTest.java | 10 ------- ...cumber.core.backend.BackendProviderService | 2 +- .../io/cucumber/error/parse-error.feature | 1 + .../io/cucumber/testng/{api => }/fa.feature | 0 .../io/cucumber/testng/{api => }/fb.feature | 0 ..._same_steps_in_different_scenarios.feature | 0 .../testng/{api => }/three_scenarios.feature | 0 .../testng/{api => }/undefined_steps.feature | 0 29 files changed, 68 insertions(+), 64 deletions(-) rename testng/src/main/java/io/cucumber/testng/{api => }/AbstractTestNGCucumberTests.java (86%) rename testng/src/main/java/io/cucumber/testng/{api => }/CucumberExceptionWrapper.java (94%) rename testng/src/main/java/io/cucumber/testng/{api => }/CucumberFeatureWrapper.java (75%) rename testng/src/main/java/io/cucumber/testng/{api => }/CucumberFeatureWrapperImpl.java (93%) rename testng/src/main/java/io/cucumber/testng/{api => }/PickleEventWrapper.java (79%) rename testng/src/main/java/io/cucumber/testng/{api => }/PickleEventWrapperImpl.java (93%) rename testng/src/main/java/io/cucumber/testng/{api => }/TestCaseResultListener.java (92%) rename testng/src/main/java/io/cucumber/testng/{api => }/TestNGCucumberRunner.java (97%) rename testng/src/test/java/io/cucumber/testng/{api => }/AbstractTestNGCucumberTestsTest.java (97%) rename testng/src/test/java/io/cucumber/testng/{api => }/InvokedMethodListener.java (94%) rename testng/src/test/java/io/cucumber/testng/{api => }/RunCukesTest.java (67%) create mode 100644 testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java rename testng/src/test/java/io/cucumber/testng/{api => }/StubBackendProviderService.java (98%) rename testng/src/test/java/io/cucumber/testng/{api => }/TestCaseResultListenerTest.java (96%) rename testng/src/test/java/io/cucumber/testng/{api => }/TestNGCucumberRunnerTest.java (76%) rename testng/src/test/java/io/cucumber/testng/{api => }/TestPendingException.java (89%) delete mode 100644 testng/src/test/java/io/cucumber/testng/api/RunFeatureWithThreeScenariosTest.java create mode 100644 testng/src/test/resources/io/cucumber/error/parse-error.feature rename testng/src/test/resources/io/cucumber/testng/{api => }/fa.feature (100%) rename testng/src/test/resources/io/cucumber/testng/{api => }/fb.feature (100%) rename testng/src/test/resources/io/cucumber/testng/{api => }/feature_with_same_steps_in_different_scenarios.feature (100%) rename testng/src/test/resources/io/cucumber/testng/{api => }/three_scenarios.feature (100%) rename testng/src/test/resources/io/cucumber/testng/{api => }/undefined_steps.feature (100%) diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java index 24c7ce1aa8..6aa3b58f33 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesByCompositionTest.java @@ -1,9 +1,9 @@ package io.cucumber.examples.java.calculator; import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.testng.api.CucumberFeatureWrapper; -import io.cucumber.testng.api.PickleEventWrapper; -import io.cucumber.testng.api.TestNGCucumberRunner; +import io.cucumber.testng.CucumberFeatureWrapper; +import io.cucumber.testng.PickleEventWrapper; +import io.cucumber.testng.TestNGCucumberRunner; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; @@ -19,7 +19,7 @@ public class RunCukesByCompositionTest extends RunCukesByCompositionBase { private TestNGCucumberRunner testNGCucumberRunner; @BeforeClass(alwaysRun = true) - public void setUpClass() throws Exception { + public void setUpClass() { testNGCucumberRunner = new TestNGCucumberRunner(this.getClass()); } @@ -34,7 +34,7 @@ public Object[][] scenarios() { } @AfterClass(alwaysRun = true) - public void tearDownClass() throws Exception { + public void tearDownClass() { testNGCucumberRunner.finish(); } } diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java index e6f225b4a9..7eb0684f77 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RunCukesTest.java @@ -1,7 +1,7 @@ package io.cucumber.examples.java.calculator; import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.testng.api.AbstractTestNGCucumberTests; +import io.cucumber.testng.AbstractTestNGCucumberTests; import org.testng.annotations.DataProvider; @CucumberOptions(plugin = "json:target/cucumber-report.json") diff --git a/junit/src/main/java/io/cucumber/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java index 4087371ebe..38a4ec1d3a 100644 --- a/junit/src/main/java/io/cucumber/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java @@ -64,7 +64,7 @@ * @see CucumberOptions */ @API(status = API.Status.STABLE) -public class Cucumber extends ParentRunner { +public final class Cucumber extends ParentRunner { private final List children = new ArrayList<>(); private final EventBus bus; private final List features; diff --git a/testng/README.md b/testng/README.md index f250a51639..88ae6ab16c 100644 --- a/testng/README.md +++ b/testng/README.md @@ -23,8 +23,8 @@ Create an empty class that extends the `AbstractTestNGCucumberTests`. ```java package io.cucumber.runtime.testng; -import cucumber.api.CucumberOptions; -import io.cucumber.testng.api.AbstractTestNGCucumberTests; +import io.cucumber.core.api.options.CucumberOptions; +import io.cucumber.testng.AbstractTestNGCucumberTests; @CucumberOptions(plugin = "json:target/cucumber-report.json") public class RunCukesTest extends AbstractTestNGCucumberTests { @@ -54,7 +54,7 @@ as skipped. Cucumber TestNG supports parallel execution of scenarios. Override the `scenarios` method to enable parallel execution. ```java -public class RunCukesTest extends AbstractTestNGCucumberTests { +public class RunCucumberTest extends AbstractTestNGCucumberTests { @Override @DataProvider(parallel = true) diff --git a/testng/pom.xml b/testng/pom.xml index 0eff937980..59fe11af64 100644 --- a/testng/pom.xml +++ b/testng/pom.xml @@ -17,6 +17,11 @@ + + org.apiguardian + apiguardian-api + + io.cucumber cucumber-core diff --git a/testng/src/main/java/io/cucumber/testng/api/AbstractTestNGCucumberTests.java b/testng/src/main/java/io/cucumber/testng/AbstractTestNGCucumberTests.java similarity index 86% rename from testng/src/main/java/io/cucumber/testng/api/AbstractTestNGCucumberTests.java rename to testng/src/main/java/io/cucumber/testng/AbstractTestNGCucumberTests.java index 8161135d36..6428ef885e 100644 --- a/testng/src/main/java/io/cucumber/testng/api/AbstractTestNGCucumberTests.java +++ b/testng/src/main/java/io/cucumber/testng/AbstractTestNGCucumberTests.java @@ -1,5 +1,6 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; +import org.apiguardian.api.API; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; @@ -8,11 +9,12 @@ /** * Runs each cucumber scenario found in the features as separated test */ +@API(status = API.Status.STABLE) public abstract class AbstractTestNGCucumberTests { private TestNGCucumberRunner testNGCucumberRunner; @BeforeClass(alwaysRun = true) - public void setUpClass() throws Exception { + public void setUpClass() { testNGCucumberRunner = new TestNGCucumberRunner(this.getClass()); } @@ -23,7 +25,8 @@ public void runScenario(PickleEventWrapper pickleWrapper, CucumberFeatureWrapper } /** - * Returns two dimensional array of PickleEventWrapper scenarios with their associated CucumberFeatureWrapper feature. + * Returns two dimensional array of PickleEventWrapper scenarios + * with their associated CucumberFeatureWrapper feature. * * @return a two dimensional array of scenarios features. */ @@ -36,7 +39,7 @@ public Object[][] scenarios() { } @AfterClass(alwaysRun = true) - public void tearDownClass() throws Exception { + public void tearDownClass() { if (testNGCucumberRunner == null) { return; } diff --git a/testng/src/main/java/io/cucumber/testng/api/CucumberExceptionWrapper.java b/testng/src/main/java/io/cucumber/testng/CucumberExceptionWrapper.java similarity index 94% rename from testng/src/main/java/io/cucumber/testng/api/CucumberExceptionWrapper.java rename to testng/src/main/java/io/cucumber/testng/CucumberExceptionWrapper.java index d77fff8db1..f98d09484f 100644 --- a/testng/src/main/java/io/cucumber/testng/api/CucumberExceptionWrapper.java +++ b/testng/src/main/java/io/cucumber/testng/CucumberExceptionWrapper.java @@ -1,4 +1,4 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; import io.cucumber.core.exception.CucumberException; import gherkin.events.PickleEvent; diff --git a/testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapper.java b/testng/src/main/java/io/cucumber/testng/CucumberFeatureWrapper.java similarity index 75% rename from testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapper.java rename to testng/src/main/java/io/cucumber/testng/CucumberFeatureWrapper.java index aa72c46a44..768971bee1 100644 --- a/testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapper.java +++ b/testng/src/main/java/io/cucumber/testng/CucumberFeatureWrapper.java @@ -1,4 +1,6 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; + +import org.apiguardian.api.API; /** * The only purpose of this interface is to be able to provide a custom @@ -6,6 +8,7 @@ * * @see AbstractTestNGCucumberTests#runScenario(PickleEventWrapper, CucumberFeatureWrapper) */ +@API(status = API.Status.STABLE) public interface CucumberFeatureWrapper { } diff --git a/testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapperImpl.java b/testng/src/main/java/io/cucumber/testng/CucumberFeatureWrapperImpl.java similarity index 93% rename from testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapperImpl.java rename to testng/src/main/java/io/cucumber/testng/CucumberFeatureWrapperImpl.java index 53dc4b2330..5a034444d9 100644 --- a/testng/src/main/java/io/cucumber/testng/api/CucumberFeatureWrapperImpl.java +++ b/testng/src/main/java/io/cucumber/testng/CucumberFeatureWrapperImpl.java @@ -1,4 +1,4 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; import io.cucumber.core.model.CucumberFeature; diff --git a/testng/src/main/java/io/cucumber/testng/api/PickleEventWrapper.java b/testng/src/main/java/io/cucumber/testng/PickleEventWrapper.java similarity index 79% rename from testng/src/main/java/io/cucumber/testng/api/PickleEventWrapper.java rename to testng/src/main/java/io/cucumber/testng/PickleEventWrapper.java index 265a6dbb61..b229a97656 100644 --- a/testng/src/main/java/io/cucumber/testng/api/PickleEventWrapper.java +++ b/testng/src/main/java/io/cucumber/testng/PickleEventWrapper.java @@ -1,6 +1,7 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; import gherkin.events.PickleEvent; +import org.apiguardian.api.API; /** * The only purpose of this interface is to be able to provide a custom @@ -8,6 +9,7 @@ * * @see AbstractTestNGCucumberTests#runScenario(PickleEventWrapper, CucumberFeatureWrapper) */ +@API(status = API.Status.STABLE) public interface PickleEventWrapper { PickleEvent getPickleEvent(); diff --git a/testng/src/main/java/io/cucumber/testng/api/PickleEventWrapperImpl.java b/testng/src/main/java/io/cucumber/testng/PickleEventWrapperImpl.java similarity index 93% rename from testng/src/main/java/io/cucumber/testng/api/PickleEventWrapperImpl.java rename to testng/src/main/java/io/cucumber/testng/PickleEventWrapperImpl.java index ccdebd4f7a..d884911991 100644 --- a/testng/src/main/java/io/cucumber/testng/api/PickleEventWrapperImpl.java +++ b/testng/src/main/java/io/cucumber/testng/PickleEventWrapperImpl.java @@ -1,4 +1,4 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; import gherkin.events.PickleEvent; diff --git a/testng/src/main/java/io/cucumber/testng/api/TestCaseResultListener.java b/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java similarity index 92% rename from testng/src/main/java/io/cucumber/testng/api/TestCaseResultListener.java rename to testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java index 1d1d869c83..991cff8130 100644 --- a/testng/src/main/java/io/cucumber/testng/api/TestCaseResultListener.java +++ b/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java @@ -1,4 +1,4 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.EventHandler; @@ -8,8 +8,8 @@ import org.testng.SkipException; class TestCaseResultListener { - static final String UNDEFINED_MESSAGE = "There are undefined steps"; - static final String SKIPPED_MESSAGE = "This scenario is skipped"; + private static final String UNDEFINED_MESSAGE = "There are undefined steps"; + private static final String SKIPPED_MESSAGE = "This scenario is skipped"; private final EventBus bus; private boolean strict; private Result result; diff --git a/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java similarity index 97% rename from testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java rename to testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java index 4783f7bb5b..34a6b81bfb 100644 --- a/testng/src/main/java/io/cucumber/testng/api/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java @@ -1,4 +1,4 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; import gherkin.events.PickleEvent; import io.cucumber.core.api.event.TestRunFinished; @@ -24,6 +24,7 @@ import io.cucumber.core.runtime.BackendServiceLoader; import io.cucumber.core.runtime.FeaturePathFeatureSupplier; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; +import org.apiguardian.api.API; import java.time.Clock; import java.util.ArrayList; @@ -32,7 +33,8 @@ /** * Glue code for running Cucumber via TestNG. */ -public class TestNGCucumberRunner { +@API(status = API.Status.STABLE) +public final class TestNGCucumberRunner { private final EventBus bus; private final Filters filters; private final ThreadLocalRunnerSupplier runnerSupplier; diff --git a/testng/src/test/java/io/cucumber/testng/api/AbstractTestNGCucumberTestsTest.java b/testng/src/test/java/io/cucumber/testng/AbstractTestNGCucumberTestsTest.java similarity index 97% rename from testng/src/test/java/io/cucumber/testng/api/AbstractTestNGCucumberTestsTest.java rename to testng/src/test/java/io/cucumber/testng/AbstractTestNGCucumberTestsTest.java index 49b3f2a749..7974054e92 100644 --- a/testng/src/test/java/io/cucumber/testng/api/AbstractTestNGCucumberTestsTest.java +++ b/testng/src/test/java/io/cucumber/testng/AbstractTestNGCucumberTestsTest.java @@ -1,4 +1,4 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; import java.util.Collections; import java.util.List; diff --git a/testng/src/test/java/io/cucumber/testng/api/InvokedMethodListener.java b/testng/src/test/java/io/cucumber/testng/InvokedMethodListener.java similarity index 94% rename from testng/src/test/java/io/cucumber/testng/api/InvokedMethodListener.java rename to testng/src/test/java/io/cucumber/testng/InvokedMethodListener.java index 0d7e684ea8..65d1a16676 100644 --- a/testng/src/test/java/io/cucumber/testng/api/InvokedMethodListener.java +++ b/testng/src/test/java/io/cucumber/testng/InvokedMethodListener.java @@ -1,4 +1,4 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; import java.util.*; @@ -8,8 +8,8 @@ public final class InvokedMethodListener implements IInvokedMethodListener { - private Set invokedConfigurationMethodNames = new HashSet(); - private List invokedTestMethodNames = new ArrayList(); + private Set invokedConfigurationMethodNames = new HashSet<>(); + private List invokedTestMethodNames = new ArrayList<>(); @Override public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { diff --git a/testng/src/test/java/io/cucumber/testng/api/RunCukesTest.java b/testng/src/test/java/io/cucumber/testng/RunCukesTest.java similarity index 67% rename from testng/src/test/java/io/cucumber/testng/api/RunCukesTest.java rename to testng/src/test/java/io/cucumber/testng/RunCukesTest.java index 093d601b9f..42e4b11a76 100644 --- a/testng/src/test/java/io/cucumber/testng/api/RunCukesTest.java +++ b/testng/src/test/java/io/cucumber/testng/RunCukesTest.java @@ -1,4 +1,4 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; public class RunCukesTest extends AbstractTestNGCucumberTests { } diff --git a/testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java b/testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java new file mode 100644 index 0000000000..724c212c61 --- /dev/null +++ b/testng/src/test/java/io/cucumber/testng/RunFeatureWithThreeScenariosTest.java @@ -0,0 +1,9 @@ +package io.cucumber.testng; + +import io.cucumber.core.api.options.CucumberOptions; + +@CucumberOptions( + features = "classpath:io/cucumber/testng/three_scenarios.feature" +) +public class RunFeatureWithThreeScenariosTest extends AbstractTestNGCucumberTests { +} diff --git a/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java b/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java similarity index 98% rename from testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java rename to testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java index 2112948142..6afdf68450 100644 --- a/testng/src/test/java/io/cucumber/testng/api/StubBackendProviderService.java +++ b/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java @@ -1,4 +1,4 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; import gherkin.pickles.PickleStep; diff --git a/testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java b/testng/src/test/java/io/cucumber/testng/TestCaseResultListenerTest.java similarity index 96% rename from testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java rename to testng/src/test/java/io/cucumber/testng/TestCaseResultListenerTest.java index 08d5e007eb..c54576a5ef 100644 --- a/testng/src/test/java/io/cucumber/testng/api/TestCaseResultListenerTest.java +++ b/testng/src/test/java/io/cucumber/testng/TestCaseResultListenerTest.java @@ -1,4 +1,4 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; import io.cucumber.core.api.event.Result; import io.cucumber.core.event.EventBus; @@ -67,7 +67,7 @@ public void should_not_be_skipped_for_undefined_result_in_strict_mode() { resultListener.receiveResult(mockUndefinedResult()); assertFalse(resultListener.isPassed()); - assertEquals(resultListener.getError().getMessage(), TestCaseResultListener.UNDEFINED_MESSAGE); + assertEquals(resultListener.getError().getMessage(), "There are undefined steps"); } @Test diff --git a/testng/src/test/java/io/cucumber/testng/api/TestNGCucumberRunnerTest.java b/testng/src/test/java/io/cucumber/testng/TestNGCucumberRunnerTest.java similarity index 76% rename from testng/src/test/java/io/cucumber/testng/api/TestNGCucumberRunnerTest.java rename to testng/src/test/java/io/cucumber/testng/TestNGCucumberRunnerTest.java index b2f77e6656..c619fba974 100644 --- a/testng/src/test/java/io/cucumber/testng/api/TestNGCucumberRunnerTest.java +++ b/testng/src/test/java/io/cucumber/testng/TestNGCucumberRunnerTest.java @@ -1,19 +1,16 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; import io.cucumber.core.api.options.CucumberOptions; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.model.CucumberFeature; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import java.util.List; - public class TestNGCucumberRunnerTest { private TestNGCucumberRunner testNGCucumberRunner; @BeforeMethod - public void setUp() throws Exception { + public void setUp() { testNGCucumberRunner = new TestNGCucumberRunner(RunCukesTest.class); } @@ -42,30 +39,18 @@ public void runScenarioWithUndefinedStepsStrict() throws Throwable { @Test public void parse_error_propagated_to_testng_test_execution() throws Exception { - testNGCucumberRunner = new ParseErrorCucumberRunner(RunCukesTest.class); + testNGCucumberRunner = new TestNGCucumberRunner(ParseError.class); Object[][] scenarios = testNGCucumberRunner.provideScenarios(); // a CucumberException is caught try { ((PickleEventWrapper) scenarios[0][0]).getPickleEvent(); Assert.fail("CucumberException not thrown"); } catch (CucumberException e) { - Assert.assertEquals(e.getMessage(), "parse error"); - } - } - - - static class ParseErrorCucumberRunner extends TestNGCucumberRunner { - public ParseErrorCucumberRunner(Class clazz) { - super(clazz); - } - - @Override - List getFeatures() { - throw new CucumberException("parse error"); + Assert.assertEquals(e.getMessage(), "Failed to parse resource at: classpath:io/cucumber/error/parse-error.feature"); } } @CucumberOptions( - features = "classpath:io/cucumber/testng/api/undefined_steps.feature", + features = "classpath:io/cucumber/testng/undefined_steps.feature", strict = true ) static class RunScenarioWithUndefinedStepsStrict extends AbstractTestNGCucumberTests { @@ -74,4 +59,8 @@ static class RunScenarioWithUndefinedStepsStrict extends AbstractTestNGCucumberT @CucumberOptions(strict = true) static class RunCukesStrict extends AbstractTestNGCucumberTests { } + + @CucumberOptions(features = "classpath:io/cucumber/error/parse-error.feature") + static class ParseError extends AbstractTestNGCucumberTests { + } } diff --git a/testng/src/test/java/io/cucumber/testng/api/TestPendingException.java b/testng/src/test/java/io/cucumber/testng/TestPendingException.java similarity index 89% rename from testng/src/test/java/io/cucumber/testng/api/TestPendingException.java rename to testng/src/test/java/io/cucumber/testng/TestPendingException.java index db488025b0..354cdbcf1a 100644 --- a/testng/src/test/java/io/cucumber/testng/api/TestPendingException.java +++ b/testng/src/test/java/io/cucumber/testng/TestPendingException.java @@ -1,4 +1,4 @@ -package io.cucumber.testng.api; +package io.cucumber.testng; import io.cucumber.core.backend.Pending; diff --git a/testng/src/test/java/io/cucumber/testng/api/RunFeatureWithThreeScenariosTest.java b/testng/src/test/java/io/cucumber/testng/api/RunFeatureWithThreeScenariosTest.java deleted file mode 100644 index f35eadc230..0000000000 --- a/testng/src/test/java/io/cucumber/testng/api/RunFeatureWithThreeScenariosTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.cucumber.testng.api; - -import io.cucumber.core.api.options.CucumberOptions; -import io.cucumber.testng.api.AbstractTestNGCucumberTests; - -@CucumberOptions( - features = "classpath:io/cucumber/testng/api/three_scenarios.feature" -) -public class RunFeatureWithThreeScenariosTest extends AbstractTestNGCucumberTests { -} diff --git a/testng/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService b/testng/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService index 23a2329136..a4f2c224f8 100644 --- a/testng/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService +++ b/testng/src/test/resources/META-INF/services/io.cucumber.core.backend.BackendProviderService @@ -1 +1 @@ -io.cucumber.testng.api.StubBackendProviderService \ No newline at end of file +io.cucumber.testng.StubBackendProviderService \ No newline at end of file diff --git a/testng/src/test/resources/io/cucumber/error/parse-error.feature b/testng/src/test/resources/io/cucumber/error/parse-error.feature new file mode 100644 index 0000000000..cd0ff03584 --- /dev/null +++ b/testng/src/test/resources/io/cucumber/error/parse-error.feature @@ -0,0 +1 @@ +Invalid syntax \ No newline at end of file diff --git a/testng/src/test/resources/io/cucumber/testng/api/fa.feature b/testng/src/test/resources/io/cucumber/testng/fa.feature similarity index 100% rename from testng/src/test/resources/io/cucumber/testng/api/fa.feature rename to testng/src/test/resources/io/cucumber/testng/fa.feature diff --git a/testng/src/test/resources/io/cucumber/testng/api/fb.feature b/testng/src/test/resources/io/cucumber/testng/fb.feature similarity index 100% rename from testng/src/test/resources/io/cucumber/testng/api/fb.feature rename to testng/src/test/resources/io/cucumber/testng/fb.feature diff --git a/testng/src/test/resources/io/cucumber/testng/api/feature_with_same_steps_in_different_scenarios.feature b/testng/src/test/resources/io/cucumber/testng/feature_with_same_steps_in_different_scenarios.feature similarity index 100% rename from testng/src/test/resources/io/cucumber/testng/api/feature_with_same_steps_in_different_scenarios.feature rename to testng/src/test/resources/io/cucumber/testng/feature_with_same_steps_in_different_scenarios.feature diff --git a/testng/src/test/resources/io/cucumber/testng/api/three_scenarios.feature b/testng/src/test/resources/io/cucumber/testng/three_scenarios.feature similarity index 100% rename from testng/src/test/resources/io/cucumber/testng/api/three_scenarios.feature rename to testng/src/test/resources/io/cucumber/testng/three_scenarios.feature diff --git a/testng/src/test/resources/io/cucumber/testng/api/undefined_steps.feature b/testng/src/test/resources/io/cucumber/testng/undefined_steps.feature similarity index 100% rename from testng/src/test/resources/io/cucumber/testng/api/undefined_steps.feature rename to testng/src/test/resources/io/cucumber/testng/undefined_steps.feature From ddf74813fb366790d150d1e817e3f03a74abfe2b Mon Sep 17 00:00:00 2001 From: mpkorstanje Date: Sun, 16 Jun 2019 19:49:02 +0200 Subject: [PATCH 090/155] [All] Make ObjectFactory implementations final --- .../java/io/cucumber/needle/NeedleFactory.java | 10 +++++----- .../cucumber/openejb/OpenEJBObjectFactory.java | 2 +- .../io/cucumber/picocontainer/PicoFactory.java | 4 ++-- .../java/io/cucumber/spring/SpringFactory.java | 16 +++++++--------- .../java/io/cucumber/weld/WeldFactory.java | 15 ++++----------- .../java/io/cucumber/weld/WeldFactoryTest.java | 18 ++---------------- 6 files changed, 21 insertions(+), 44 deletions(-) diff --git a/needle/src/main/java/io/cucumber/needle/NeedleFactory.java b/needle/src/main/java/io/cucumber/needle/NeedleFactory.java index ba27a5cba0..824fcf9be1 100644 --- a/needle/src/main/java/io/cucumber/needle/NeedleFactory.java +++ b/needle/src/main/java/io/cucumber/needle/NeedleFactory.java @@ -14,9 +14,9 @@ /** * Needle factory for object resolution inside of cucumber tests. */ -public class NeedleFactory extends NeedleTestcase implements ObjectFactory { +public final class NeedleFactory extends NeedleTestcase implements ObjectFactory { - private final Map, Object> cachedStepsInstances = new LinkedHashMap, Object>(); + private final Map, Object> cachedStepsInstances = new LinkedHashMap<>(); private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final CreateInstanceByDefaultConstructor createInstanceByDefaultConstructor = CreateInstanceByDefaultConstructor.INSTANCE; private final CollectInjectionProvidersFromStepsInstance collectInjectionProvidersFromStepsInstance = CollectInjectionProvidersFromStepsInstance.INSTANCE; @@ -27,7 +27,7 @@ public NeedleFactory() { @Override public T getInstance(final Class type) { - logger.trace("getInstance: " + type.getCanonicalName()); + logger.trace("getInstance: {}", type.getCanonicalName()); assertTypeHasBeenAdded(type); return nullSafeGetInstance(type); } @@ -63,7 +63,7 @@ public void stop() { @Override public boolean addClass(final Class type) { - logger.trace("addClass(): " + type.getCanonicalName()); + logger.trace("addClass(): {}", type.getCanonicalName()); // build up cache keys ... if (!cachedStepsInstances.containsKey(type)) { @@ -88,7 +88,7 @@ private T nullSafeGetInstance(final Class type) { return (T) instance; } - private T createStepsInstance(final Class type) throws Exception { + private T createStepsInstance(final Class type) { logger.trace("createInstance(): " + type.getCanonicalName()); return createInstanceByDefaultConstructor.apply(type); } diff --git a/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java b/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java index e4a2298058..f44cd383aa 100644 --- a/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java +++ b/openejb/src/main/java/io/cucumber/openejb/OpenEJBObjectFactory.java @@ -12,7 +12,7 @@ import java.util.Map; import java.util.Properties; -public class OpenEJBObjectFactory implements ObjectFactory { +public final class OpenEJBObjectFactory implements ObjectFactory { private final List classes = new ArrayList(); private final Map, Object> instances = new HashMap, Object>(); private EJBContainer container; diff --git a/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java b/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java index 4b8d177440..ba52030e83 100644 --- a/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java +++ b/picocontainer/src/main/java/io/cucumber/picocontainer/PicoFactory.java @@ -9,9 +9,9 @@ import java.util.HashSet; import java.util.Set; -public class PicoFactory implements ObjectFactory { +public final class PicoFactory implements ObjectFactory { private MutablePicoContainer pico; - private final Set> classes = new HashSet>(); + private final Set> classes = new HashSet<>(); public void start() { pico = new PicoBuilder() diff --git a/spring/src/main/java/io/cucumber/spring/SpringFactory.java b/spring/src/main/java/io/cucumber/spring/SpringFactory.java index f735df5f03..2c6c58d12e 100644 --- a/spring/src/main/java/io/cucumber/spring/SpringFactory.java +++ b/spring/src/main/java/io/cucumber/spring/SpringFactory.java @@ -17,11 +17,12 @@ import org.springframework.test.context.TestContextManager; import java.lang.annotation.Annotation; +import java.util.ArrayDeque; import java.util.Collection; import java.util.Collections; +import java.util.Deque; import java.util.HashSet; import java.util.Set; -import java.util.Stack; import static io.cucumber.spring.FixBootstrapUtils.createBootstrapContext; import static io.cucumber.spring.FixBootstrapUtils.resolveTestContextBootstrapper; @@ -59,17 +60,14 @@ * * */ -public class SpringFactory implements ObjectFactory { +public final class SpringFactory implements ObjectFactory { private ConfigurableListableBeanFactory beanFactory; private CucumberTestContextManager testContextManager; - private final Collection> stepClasses = new HashSet>(); + private final Collection> stepClasses = new HashSet<>(); private Class stepClassWithSpringContext = null; - public SpringFactory() { - } - @Override public boolean addClass(final Class stepClass) { if (!stepClasses.contains(stepClass)) { @@ -101,12 +99,12 @@ private static void checkNoComponentAnnotations(Class type) { } private static boolean hasComponentAnnotation(Annotation annotation) { - return hasAnnotation(annotation, Collections.>singleton(Component.class)); + return hasAnnotation(annotation, Collections.singleton(Component.class)); } private static boolean hasAnnotation(Annotation annotation, Collection> desired) { - Set> seen = new HashSet>(); - Stack> toCheck = new Stack>(); + Set> seen = new HashSet<>(); + Deque> toCheck = new ArrayDeque<>(); toCheck.add(annotation.annotationType()); while (!toCheck.isEmpty()) { diff --git a/weld/src/main/java/io/cucumber/weld/WeldFactory.java b/weld/src/main/java/io/cucumber/weld/WeldFactory.java index e794d4dc04..f6d12a4c46 100644 --- a/weld/src/main/java/io/cucumber/weld/WeldFactory.java +++ b/weld/src/main/java/io/cucumber/weld/WeldFactory.java @@ -7,11 +7,11 @@ import org.jboss.weld.environment.se.Weld; import org.jboss.weld.environment.se.WeldContainer; -public class WeldFactory implements ObjectFactory { +public final class WeldFactory implements ObjectFactory { private static final Logger log = LoggerFactory.getLogger(WeldFactory.class); - static final String START_EXCEPTION_MESSAGE = "\n" + + private static final String START_EXCEPTION_MESSAGE = "\n" + "It looks like you're running on a single-core machine, and Weld doesn't like that. See:\n" + "* http://in.relation.to/Bloggers/Weld200Alpha2Released\n" + "* https://issues.jboss.org/browse/WELD-1119\n" + @@ -22,7 +22,7 @@ public class WeldFactory implements ObjectFactory { "not rethrown. It's the best Cucumber-JVM can do until this bug is fixed in Weld.\n" + "\n"; - static final String STOP_EXCEPTION_MESSAGE = "\n" + + private static final String STOP_EXCEPTION_MESSAGE = "\n" + "If you have set enabled=false in org.jboss.weld.executor.properties and you are seeing\n" + "this message, it means your weld container didn't shut down properly. It's a Weld bug\n" + "and we can't do much to fix it in Cucumber-JVM.\n"; @@ -31,15 +31,8 @@ public class WeldFactory implements ObjectFactory { @Override public void start() { - start(null); - } - - protected void start(Weld weld) { try { - if (weld == null) { - weld = new Weld(); - } - containerInstance = weld.initialize(); + containerInstance = new Weld().initialize(); } catch (IllegalArgumentException e) { throw new CucumberException(START_EXCEPTION_MESSAGE, e); } diff --git a/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java b/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java index 4f1e8df4fb..62cb62be5b 100644 --- a/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java +++ b/weld/src/test/java/io/cucumber/weld/WeldFactoryTest.java @@ -59,25 +59,11 @@ public void shouldGiveUsNewInstancesForEachScenario() { assertNotSame(o1, o2); } - @Test - public void startStopCalledWithoutStart() { - - final Weld weld = mock(Weld.class); - when(weld.initialize()) - .thenThrow(new IllegalArgumentException()); - - final WeldFactory factory = new WeldFactory(); - - this.expectedException.expect(CucumberException.class); - this.expectedException.expectMessage(is(equalTo(WeldFactory.START_EXCEPTION_MESSAGE))); - - factory.start(weld); - } - @Test public void stopCalledWithoutStart() { ObjectFactory factory = new WeldFactory(); factory.stop(); - assertThat(logRecordListener.getLogRecords().get(0).getMessage(), containsString(WeldFactory.STOP_EXCEPTION_MESSAGE)); + assertThat(logRecordListener.getLogRecords().get(0).getMessage(), + containsString("your weld container didn't shut down properly")); } } From 02c1dfff75deb2d69feae2514f4acd4fe4e3160d Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Thu, 20 Jun 2019 13:47:43 +0200 Subject: [PATCH 091/155] [Java8] Remove `io.cucumber.java8.api` package --- .../calculator/RpnCalculatorStepdefs.java | 2 +- .../java/calculator/ShoppingStepdefs.java | 2 +- .../main/groovy/generate-interfaces.groovy | 2 +- java8/src/main/groovy/lambda.java.gsp | 22 +++++----- .../io/cucumber/java8/{api => }/HookBody.java | 2 +- .../java8/{api => }/HookNoArgsBody.java | 2 +- .../java/io/cucumber/java8/Java8Backend.java | 18 ++++---- .../java8/Java8BackendProviderService.java | 2 +- .../cucumber/java8/Java8HookDefinition.java | 4 +- .../java/io/cucumber/java8/Java8Snippet.java | 2 +- .../cucumber/java8/Java8StepDefinition.java | 3 +- .../java/io/cucumber/java8/LambdaGlue.java | 3 -- .../io/cucumber/java8/LambdaGlueRegistry.java | 2 +- .../java8/{api => }/PendingException.java | 2 +- .../java/io/cucumber/java8/StepdefBody.java | 44 +++++++++++++++++++ .../io/cucumber/java8/api/StepdefBody.java | 43 ------------------ .../{lambda => }/AnonInnerClassStepdefs.java | 12 ++--- ...Java8AnonInnerClassStepDefinitionTest.java | 1 - ...efinitionMarksCorrectStackElementTest.java | 2 +- .../java8/Java8LambdaStepDefinitionTest.java | 1 - .../io/cucumber/java8/Java8SnippetTest.java | 2 +- .../java8/{lambda => }/LambdaStepdefs.java | 4 +- .../java8/{lambda => }/RunCucumberTest.java | 2 +- .../TypeRegistryConfiguration.java | 2 +- .../io/cucumber/java8/stepdefs/Stepdefs.java | 2 +- .../anon-inner-class-step-definitions.feature | 0 .../lambda-step-definitions.feature | 0 .../io/cucumber/kotlin/LambdaStepdefs.kt | 4 +- pom.xml | 2 +- 29 files changed, 88 insertions(+), 101 deletions(-) rename java8/src/main/java/io/cucumber/java8/{api => }/HookBody.java (82%) rename java8/src/main/java/io/cucumber/java8/{api => }/HookNoArgsBody.java (75%) rename java8/src/main/java/io/cucumber/java8/{api => }/PendingException.java (92%) create mode 100644 java8/src/main/java/io/cucumber/java8/StepdefBody.java delete mode 100644 java8/src/main/java/io/cucumber/java8/api/StepdefBody.java rename java8/src/test/java/io/cucumber/java8/{lambda => }/AnonInnerClassStepdefs.java (83%) rename java8/src/test/java/io/cucumber/java8/{lambda => }/LambdaStepdefs.java (97%) rename java8/src/test/java/io/cucumber/java8/{lambda => }/RunCucumberTest.java (79%) rename java8/src/test/java/io/cucumber/java8/{lambda => }/TypeRegistryConfiguration.java (96%) rename java8/src/test/resources/io/cucumber/java8/{lambda => }/anon-inner-class-step-definitions.feature (100%) rename java8/src/test/resources/io/cucumber/java8/{lambda => }/lambda-step-definitions.feature (100%) diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index 41f6b2faba..33530e5cb7 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.Scenario; import io.cucumber.datatable.DataTable; -import io.cucumber.java8.api.En; +import io.cucumber.java8.En; import java.util.List; diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index d2624fa288..b445e154ef 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,7 +1,7 @@ package io.cucumber.examples.java.calculator; import io.cucumber.datatable.DataTable; -import io.cucumber.java8.api.En; +import io.cucumber.java8.En; import java.util.List; diff --git a/java8/src/main/groovy/generate-interfaces.groovy b/java8/src/main/groovy/generate-interfaces.groovy index 5163ca55aa..8166a716e7 100644 --- a/java8/src/main/groovy/generate-interfaces.groovy +++ b/java8/src/main/groovy/generate-interfaces.groovy @@ -24,7 +24,7 @@ GherkinDialectProvider.DIALECTS.keySet().each { language -> def locale = localeFor(dialect.language) def binding = [ "i18n":dialect, "className":className, "locale": locale ] def template = engine.createTemplate(templateSource).make(binding) - def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java8/api/${className}.java") + def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java8/${className}.java") file.parentFile.mkdirs() file.write(template.toString(), "UTF-8") } diff --git a/java8/src/main/groovy/lambda.java.gsp b/java8/src/main/groovy/lambda.java.gsp index 61feadc3c7..609cbde879 100644 --- a/java8/src/main/groovy/lambda.java.gsp +++ b/java8/src/main/groovy/lambda.java.gsp @@ -1,15 +1,15 @@ -package io.cucumber.java8.api; +package io.cucumber.java8; -import io.cucumber.java8.api.StepdefBody.A0; -import io.cucumber.java8.api.StepdefBody.A1; -import io.cucumber.java8.api.StepdefBody.A2; -import io.cucumber.java8.api.StepdefBody.A3; -import io.cucumber.java8.api.StepdefBody.A4; -import io.cucumber.java8.api.StepdefBody.A5; -import io.cucumber.java8.api.StepdefBody.A6; -import io.cucumber.java8.api.StepdefBody.A7; -import io.cucumber.java8.api.StepdefBody.A8; -import io.cucumber.java8.api.StepdefBody.A9; +import io.cucumber.java8.StepdefBody.A0; +import io.cucumber.java8.StepdefBody.A1; +import io.cucumber.java8.StepdefBody.A2; +import io.cucumber.java8.StepdefBody.A3; +import io.cucumber.java8.StepdefBody.A4; +import io.cucumber.java8.StepdefBody.A5; +import io.cucumber.java8.StepdefBody.A6; +import io.cucumber.java8.StepdefBody.A7; +import io.cucumber.java8.StepdefBody.A8; +import io.cucumber.java8.StepdefBody.A9; import io.cucumber.java8.LambdaGlueRegistry; import io.cucumber.java8.Java8StepDefinition; diff --git a/java8/src/main/java/io/cucumber/java8/api/HookBody.java b/java8/src/main/java/io/cucumber/java8/HookBody.java similarity index 82% rename from java8/src/main/java/io/cucumber/java8/api/HookBody.java rename to java8/src/main/java/io/cucumber/java8/HookBody.java index a15f0fc6c5..5e612e321b 100644 --- a/java8/src/main/java/io/cucumber/java8/api/HookBody.java +++ b/java8/src/main/java/io/cucumber/java8/HookBody.java @@ -1,4 +1,4 @@ -package io.cucumber.java8.api; +package io.cucumber.java8; import io.cucumber.core.api.Scenario; diff --git a/java8/src/main/java/io/cucumber/java8/api/HookNoArgsBody.java b/java8/src/main/java/io/cucumber/java8/HookNoArgsBody.java similarity index 75% rename from java8/src/main/java/io/cucumber/java8/api/HookNoArgsBody.java rename to java8/src/main/java/io/cucumber/java8/HookNoArgsBody.java index 8c5e947506..5d5eb907b9 100644 --- a/java8/src/main/java/io/cucumber/java8/api/HookNoArgsBody.java +++ b/java8/src/main/java/io/cucumber/java8/HookNoArgsBody.java @@ -1,4 +1,4 @@ -package io.cucumber.java8.api; +package io.cucumber.java8; @FunctionalInterface public interface HookNoArgsBody { diff --git a/java8/src/main/java/io/cucumber/java8/Java8Backend.java b/java8/src/main/java/io/cucumber/java8/Java8Backend.java index 47a5e24c63..f17478f843 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8Backend.java +++ b/java8/src/main/java/io/cucumber/java8/Java8Backend.java @@ -21,7 +21,7 @@ import static java.lang.Thread.currentThread; -public class Java8Backend implements Backend, LambdaGlueRegistry { +final class Java8Backend implements Backend, LambdaGlueRegistry { private final TypeRegistry typeRegistry; private final SnippetGenerator lambdaSnippetGenerator; @@ -43,18 +43,16 @@ public class Java8Backend implements Backend, LambdaGlueRegistry { public void loadGlue(Glue glue, List gluePaths) { this.glue = glue; // Scan for Java8 style glue (lambdas) - for (final URI packageName : gluePaths) { - Collection> glueDefinerClasses = classFinder.getDescendants(LambdaGlue.class, packageName); - for (final Class glueClass : glueDefinerClasses) { - if (glueClass.isInterface()) { - continue; - } - + gluePaths.stream() + .map(packageName -> classFinder.getDescendants(LambdaGlue.class, packageName)) + .flatMap(Collection::stream) + .filter(glueClass -> !glueClass.isInterface()) + .filter(glueClass -> glueClass.getConstructors().length > 0) + .forEach(glueClass -> { if (container.addClass(glueClass)) { lambdaGlueClasses.add(glueClass); } - } - } + }); } @Override diff --git a/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java b/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java index 26a23a6fb7..1a4977bdb6 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java +++ b/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java @@ -6,7 +6,7 @@ import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.TypeRegistry; -public class Java8BackendProviderService implements BackendProviderService { +public final class Java8BackendProviderService implements BackendProviderService { @Override public Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { diff --git a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java index ce64555c70..e988426249 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java @@ -6,12 +6,10 @@ import io.cucumber.core.filter.TagPredicate; import io.cucumber.core.runtime.Invoker; import io.cucumber.core.runtime.ScenarioScoped; -import io.cucumber.java8.api.HookBody; -import io.cucumber.java8.api.HookNoArgsBody; import java.util.Collection; -public class Java8HookDefinition implements HookDefinition, ScenarioScoped { +final class Java8HookDefinition implements HookDefinition, ScenarioScoped { private final TagPredicate tagPredicate; private final int order; private final long timeoutMillis; diff --git a/java8/src/main/java/io/cucumber/java8/Java8Snippet.java b/java8/src/main/java/io/cucumber/java8/Java8Snippet.java index 60e69dd68f..91c54dc47e 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8Snippet.java +++ b/java8/src/main/java/io/cucumber/java8/Java8Snippet.java @@ -7,7 +7,7 @@ public String template() { return "" + "{0}(\"{1}\", ({3}) -> '{'\n" + " // {4}\n" + - "{5} throw new io.cucumber.java8.api.PendingException();\n" + + "{5} throw new io.cucumber.java8.PendingException();\n" + "'}');\n"; } } diff --git a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java index 0ee1e1e805..a800f6ee8b 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java @@ -12,7 +12,6 @@ import io.cucumber.core.stepexpression.StepExpressionFactory; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.stepexpression.TypeResolver; -import io.cucumber.java8.api.StepdefBody; import net.jodah.typetools.TypeResolver.Unknown; import java.lang.reflect.Method; @@ -25,7 +24,7 @@ import static java.lang.String.format; import static net.jodah.typetools.TypeResolver.resolveRawArguments; -public class Java8StepDefinition implements StepDefinition, ScenarioScoped { +final class Java8StepDefinition implements StepDefinition, ScenarioScoped { public static Java8StepDefinition create( String expression, Class bodyClass, T body, TypeRegistry typeRegistry) { diff --git a/java8/src/main/java/io/cucumber/java8/LambdaGlue.java b/java8/src/main/java/io/cucumber/java8/LambdaGlue.java index 9c6b5ab3cd..283acb7a0b 100644 --- a/java8/src/main/java/io/cucumber/java8/LambdaGlue.java +++ b/java8/src/main/java/io/cucumber/java8/LambdaGlue.java @@ -1,8 +1,5 @@ package io.cucumber.java8; -import io.cucumber.java8.api.HookBody; -import io.cucumber.java8.api.HookNoArgsBody; - public interface LambdaGlue { String EMPTY_TAG_EXPRESSIONS = ""; diff --git a/java8/src/main/java/io/cucumber/java8/LambdaGlueRegistry.java b/java8/src/main/java/io/cucumber/java8/LambdaGlueRegistry.java index 7450d45e9b..960997e02f 100644 --- a/java8/src/main/java/io/cucumber/java8/LambdaGlueRegistry.java +++ b/java8/src/main/java/io/cucumber/java8/LambdaGlueRegistry.java @@ -6,7 +6,7 @@ import java.util.function.Function; -public interface LambdaGlueRegistry { +interface LambdaGlueRegistry { ThreadLocal INSTANCE = new ThreadLocal<>(); void addStepDefinition(Function stepDefinition); diff --git a/java8/src/main/java/io/cucumber/java8/api/PendingException.java b/java8/src/main/java/io/cucumber/java8/PendingException.java similarity index 92% rename from java8/src/main/java/io/cucumber/java8/api/PendingException.java rename to java8/src/main/java/io/cucumber/java8/PendingException.java index e51afe5350..23f87c5fef 100644 --- a/java8/src/main/java/io/cucumber/java8/api/PendingException.java +++ b/java8/src/main/java/io/cucumber/java8/PendingException.java @@ -1,4 +1,4 @@ -package io.cucumber.java8.api; +package io.cucumber.java8; import io.cucumber.core.backend.Pending; diff --git a/java8/src/main/java/io/cucumber/java8/StepdefBody.java b/java8/src/main/java/io/cucumber/java8/StepdefBody.java new file mode 100644 index 0000000000..c1d9f906f8 --- /dev/null +++ b/java8/src/main/java/io/cucumber/java8/StepdefBody.java @@ -0,0 +1,44 @@ +package io.cucumber.java8; + +public interface StepdefBody { + @FunctionalInterface + interface A0 extends StepdefBody { + void accept() throws Throwable; + } + @FunctionalInterface + interface A1 extends StepdefBody { + void accept(T1 p1) throws Throwable; + } + @FunctionalInterface + interface A2 extends StepdefBody { + void accept(T1 p1, T2 p2) throws Throwable; + } + @FunctionalInterface + interface A3 extends StepdefBody { + void accept(T1 p1, T2 p2, T3 p3) throws Throwable; + } + @FunctionalInterface + interface A4 extends StepdefBody { + void accept(T1 p1, T2 p2, T3 p3, T4 p4) throws Throwable; + } + @FunctionalInterface + interface A5 extends StepdefBody { + void accept(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) throws Throwable; + } + @FunctionalInterface + interface A6 extends StepdefBody { + void accept(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) throws Throwable; + } + @FunctionalInterface + interface A7 extends StepdefBody { + void accept(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) throws Throwable; + } + @FunctionalInterface + interface A8 extends StepdefBody { + void accept(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8) throws Throwable; + } + @FunctionalInterface + interface A9 extends StepdefBody { + void accept(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9) throws Throwable; + } +} diff --git a/java8/src/main/java/io/cucumber/java8/api/StepdefBody.java b/java8/src/main/java/io/cucumber/java8/api/StepdefBody.java deleted file mode 100644 index 15f7f01b55..0000000000 --- a/java8/src/main/java/io/cucumber/java8/api/StepdefBody.java +++ /dev/null @@ -1,43 +0,0 @@ -package io.cucumber.java8.api; - -public interface StepdefBody { - public static interface A0 extends StepdefBody { - void accept() throws Throwable; - } - - public static interface A1 extends StepdefBody { - void accept(T1 p1) throws Throwable; - } - - public static interface A2 extends StepdefBody { - void accept(T1 p1, T2 p2) throws Throwable; - } - - public static interface A3 extends StepdefBody { - void accept(T1 p1, T2 p2, T3 p3) throws Throwable; - } - - public static interface A4 extends StepdefBody { - void accept(T1 p1, T2 p2, T3 p3, T4 p4) throws Throwable; - } - - public static interface A5 extends StepdefBody { - void accept(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) throws Throwable; - } - - public static interface A6 extends StepdefBody { - void accept(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) throws Throwable; - } - - public static interface A7 extends StepdefBody { - void accept(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) throws Throwable; - } - - public static interface A8 extends StepdefBody { - void accept(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8) throws Throwable; - } - - public static interface A9 extends StepdefBody { - void accept(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9) throws Throwable; - } -} diff --git a/java8/src/test/java/io/cucumber/java8/lambda/AnonInnerClassStepdefs.java b/java8/src/test/java/io/cucumber/java8/AnonInnerClassStepdefs.java similarity index 83% rename from java8/src/test/java/io/cucumber/java8/lambda/AnonInnerClassStepdefs.java rename to java8/src/test/java/io/cucumber/java8/AnonInnerClassStepdefs.java index 630800d914..ca31a61f23 100644 --- a/java8/src/test/java/io/cucumber/java8/lambda/AnonInnerClassStepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/AnonInnerClassStepdefs.java @@ -1,16 +1,12 @@ -package io.cucumber.java8.lambda; +package io.cucumber.java8; -import static org.junit.Assert.assertEquals; - -import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.java8.Java8StepDefinition; -import io.cucumber.java8.Java8Backend; -import io.cucumber.java8.LambdaGlue; -import io.cucumber.java8.api.StepdefBody; import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.TypeRegistry; import java.util.function.Function; +import static org.junit.Assert.assertEquals; + public class AnonInnerClassStepdefs implements LambdaGlue { public AnonInnerClassStepdefs() { diff --git a/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java b/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java index 8741b60f13..6979183dcc 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java @@ -3,7 +3,6 @@ import static org.junit.Assert.assertEquals; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.java8.api.StepdefBody; import org.junit.Test; import java.util.List; diff --git a/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java index 921ecf8e43..c45a871f9c 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java @@ -3,7 +3,7 @@ import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.java8.api.En; +import io.cucumber.java8.En; import org.hamcrest.CustomTypeSafeMatcher; import org.junit.Rule; import org.junit.Test; diff --git a/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java index c3208e83e8..ad1bd70c9f 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java @@ -9,7 +9,6 @@ import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.datatable.DataTable; -import io.cucumber.java8.api.StepdefBody; import org.junit.Test; import java.util.List; diff --git a/java8/src/test/java/io/cucumber/java8/Java8SnippetTest.java b/java8/src/test/java/io/cucumber/java8/Java8SnippetTest.java index 36021214dc..8a44ccb82f 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8SnippetTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8SnippetTest.java @@ -20,7 +20,7 @@ public void generatesPlainSnippet() { String expected = "" + "Given(\"I have {int} cukes in my {string} belly\", (Integer int1, String string) -> {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java8.api.PendingException();\n" + + " throw new io.cucumber.java8.PendingException();\n" + "});\n"; System.out.println(expected); assertEquals(expected, snippetFor("I have 4 cukes in my \"big\" belly")); diff --git a/java8/src/test/java/io/cucumber/java8/lambda/LambdaStepdefs.java b/java8/src/test/java/io/cucumber/java8/LambdaStepdefs.java similarity index 97% rename from java8/src/test/java/io/cucumber/java8/lambda/LambdaStepdefs.java rename to java8/src/test/java/io/cucumber/java8/LambdaStepdefs.java index 69075c8586..543150d58e 100644 --- a/java8/src/test/java/io/cucumber/java8/lambda/LambdaStepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/LambdaStepdefs.java @@ -1,4 +1,4 @@ -package io.cucumber.java8.lambda; +package io.cucumber.java8; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; @@ -10,7 +10,7 @@ import java.util.List; -public class LambdaStepdefs implements io.cucumber.java8.api.En{ +public class LambdaStepdefs implements io.cucumber.java8.En { private static LambdaStepdefs lastInstance; private final int outside = 41; diff --git a/java8/src/test/java/io/cucumber/java8/lambda/RunCucumberTest.java b/java8/src/test/java/io/cucumber/java8/RunCucumberTest.java similarity index 79% rename from java8/src/test/java/io/cucumber/java8/lambda/RunCucumberTest.java rename to java8/src/test/java/io/cucumber/java8/RunCucumberTest.java index 59c483191c..836469dd6a 100644 --- a/java8/src/test/java/io/cucumber/java8/lambda/RunCucumberTest.java +++ b/java8/src/test/java/io/cucumber/java8/RunCucumberTest.java @@ -1,4 +1,4 @@ -package io.cucumber.java8.lambda; +package io.cucumber.java8; import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; diff --git a/java8/src/test/java/io/cucumber/java8/lambda/TypeRegistryConfiguration.java b/java8/src/test/java/io/cucumber/java8/TypeRegistryConfiguration.java similarity index 96% rename from java8/src/test/java/io/cucumber/java8/lambda/TypeRegistryConfiguration.java rename to java8/src/test/java/io/cucumber/java8/TypeRegistryConfiguration.java index e4686d675b..16a15cdd7a 100644 --- a/java8/src/test/java/io/cucumber/java8/lambda/TypeRegistryConfiguration.java +++ b/java8/src/test/java/io/cucumber/java8/TypeRegistryConfiguration.java @@ -1,4 +1,4 @@ -package io.cucumber.java8.lambda; +package io.cucumber.java8; import io.cucumber.core.api.TypeRegistry; import io.cucumber.core.api.TypeRegistryConfigurer; diff --git a/java8/src/test/java/io/cucumber/java8/stepdefs/Stepdefs.java b/java8/src/test/java/io/cucumber/java8/stepdefs/Stepdefs.java index 07b6ddfa4d..e6c80cbe41 100644 --- a/java8/src/test/java/io/cucumber/java8/stepdefs/Stepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/stepdefs/Stepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.java8.stepdefs; -import io.cucumber.java8.api.En; +import io.cucumber.java8.En; public class Stepdefs implements En { diff --git a/java8/src/test/resources/io/cucumber/java8/lambda/anon-inner-class-step-definitions.feature b/java8/src/test/resources/io/cucumber/java8/anon-inner-class-step-definitions.feature similarity index 100% rename from java8/src/test/resources/io/cucumber/java8/lambda/anon-inner-class-step-definitions.feature rename to java8/src/test/resources/io/cucumber/java8/anon-inner-class-step-definitions.feature diff --git a/java8/src/test/resources/io/cucumber/java8/lambda/lambda-step-definitions.feature b/java8/src/test/resources/io/cucumber/java8/lambda-step-definitions.feature similarity index 100% rename from java8/src/test/resources/io/cucumber/java8/lambda/lambda-step-definitions.feature rename to java8/src/test/resources/io/cucumber/java8/lambda-step-definitions.feature diff --git a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt index 3d3c856ab8..b58170dfa4 100644 --- a/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt +++ b/kotlin-java8/src/test/kotlin/io/cucumber/kotlin/LambdaStepdefs.kt @@ -1,8 +1,8 @@ -package io.cucumber.kotlin; +package io.cucumber.kotlin import io.cucumber.core.api.Scenario import io.cucumber.datatable.DataTable -import io.cucumber.java8.api.En +import io.cucumber.java8.En import org.junit.Assert.* var lastInstance : LambdaStepdefs? = null diff --git a/pom.xml b/pom.xml index d2e56affca..6a73785231 100644 --- a/pom.xml +++ b/pom.xml @@ -353,7 +353,7 @@ I18n - io.cucumber.java8.api.lambda:io.cucumber.java8.api.annotation.* + io.cucumber.java8.*:io.cucumber.java.* Dependency Injection Providers From 936be1aec77400f73e0aec298a84b2ef89e3f5e0 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Thu, 20 Jun 2019 15:20:54 +0200 Subject: [PATCH 092/155] [Core] Reduce visibility in plugin package --- .../io/cucumber/core/plugin/AnsiEscapes.java | 34 +++++++++---------- .../java/io/cucumber/core/plugin/Format.java | 2 +- .../java/io/cucumber/core/plugin/Formats.java | 2 +- .../cucumber/core/plugin/PluginFactory.java | 2 +- .../java/io/cucumber/core/plugin/Stats.java | 4 +-- .../core/plugin/TimelineFormatter.java | 1 - 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/plugin/AnsiEscapes.java b/core/src/main/java/io/cucumber/core/plugin/AnsiEscapes.java index b4db85d6b8..eeb675e8c2 100644 --- a/core/src/main/java/io/cucumber/core/plugin/AnsiEscapes.java +++ b/core/src/main/java/io/cucumber/core/plugin/AnsiEscapes.java @@ -4,25 +4,25 @@ final class AnsiEscapes { private static final char ESC = 27; private static final char BRACKET = '['; - public static AnsiEscapes RESET = color(0); - public static AnsiEscapes BLACK = color(30); - public static AnsiEscapes RED = color(31); - public static AnsiEscapes GREEN = color(32); - public static AnsiEscapes YELLOW = color(33); - public static AnsiEscapes BLUE = color(34); - public static AnsiEscapes MAGENTA = color(35); - public static AnsiEscapes CYAN = color(36); - public static AnsiEscapes WHITE = color(37); - public static AnsiEscapes DEFAULT = color(9); - public static AnsiEscapes GREY = color(90); - public static AnsiEscapes INTENSITY_BOLD = color(1); + static AnsiEscapes RESET = color(0); + static AnsiEscapes BLACK = color(30); + static AnsiEscapes RED = color(31); + static AnsiEscapes GREEN = color(32); + static AnsiEscapes YELLOW = color(33); + static AnsiEscapes BLUE = color(34); + static AnsiEscapes MAGENTA = color(35); + static AnsiEscapes CYAN = color(36); + static AnsiEscapes WHITE = color(37); + static AnsiEscapes DEFAULT = color(9); + static AnsiEscapes GREY = color(90); + static AnsiEscapes INTENSITY_BOLD = color(1); private static AnsiEscapes color(int code) { - return new AnsiEscapes(String.valueOf(code) + "m"); + return new AnsiEscapes(code + "m"); } - public static AnsiEscapes up(int count) { - return new AnsiEscapes(String.valueOf(count) + "A"); + static AnsiEscapes up(int count) { + return new AnsiEscapes(count + "A"); } private final String value; @@ -31,11 +31,11 @@ private AnsiEscapes(String value) { this.value = value; } - public void appendTo(NiceAppendable a) { + void appendTo(NiceAppendable a) { a.append(ESC).append(BRACKET).append(value); } - public void appendTo(StringBuilder a) { + void appendTo(StringBuilder a) { a.append(ESC).append(BRACKET).append(value); } diff --git a/core/src/main/java/io/cucumber/core/plugin/Format.java b/core/src/main/java/io/cucumber/core/plugin/Format.java index 73a9c52b13..272c39c075 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Format.java +++ b/core/src/main/java/io/cucumber/core/plugin/Format.java @@ -1,5 +1,5 @@ package io.cucumber.core.plugin; -public interface Format { +interface Format { String text(String text); } diff --git a/core/src/main/java/io/cucumber/core/plugin/Formats.java b/core/src/main/java/io/cucumber/core/plugin/Formats.java index ad777901fe..3d4e046928 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Formats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Formats.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -public interface Formats { +interface Formats { Format get(String key); String up(int n); diff --git a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java index 308029d538..f7a474fd84 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java +++ b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java @@ -50,7 +50,7 @@ static URL toURL(String pathOrUrl) { } } - public Plugin create(Options.Plugin plugin) { + Plugin create(Options.Plugin plugin) { try { return instantiate(plugin.pluginString(), plugin.pluginClass(), plugin.argument()); } catch (IOException | URISyntaxException e) { diff --git a/core/src/main/java/io/cucumber/core/plugin/Stats.java b/core/src/main/java/io/cucumber/core/plugin/Stats.java index a57d2f81bf..c6f77008c8 100755 --- a/core/src/main/java/io/cucumber/core/plugin/Stats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Stats.java @@ -24,8 +24,8 @@ import static java.util.concurrent.TimeUnit.SECONDS; class Stats implements EventListener, ColorAware, StrictAware { - static final long ONE_SECOND = SECONDS.toNanos(1); - static final long ONE_MINUTE = 60 * ONE_SECOND; + private static final long ONE_SECOND = SECONDS.toNanos(1); + private static final long ONE_MINUTE = 60 * ONE_SECOND; private SubCounts scenarioSubCounts = new SubCounts(); private SubCounts stepSubCounts = new SubCounts(); private Instant startTime = Instant.EPOCH; diff --git a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index 2e457a6ef9..4a29ab4097 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -31,7 +31,6 @@ public final class TimelineFormatter implements ConcurrentEventListener { - //TODO: if accepted then should move resources out into own project as per HTML report private static final String[] TEXT_ASSETS = new String[]{ "/io/cucumber/core/plugin/timeline/index.html", "/io/cucumber/core/plugin/timeline/formatter.js", From a39c51a7a869a67ca45a010ada998df7853bee39 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Thu, 20 Jun 2019 15:26:05 +0200 Subject: [PATCH 093/155] [Java] Remove `api` package --- .../java/io/cucumber/cdi2/BellyStepdefs.java | 2 +- .../io/cucumber/cdi2/CDIBellyStepdefs.java | 2 +- .../java/io/cucumber/cdi2/UnusedGlue.java | 4 +-- .../java/calculator/DateStepdefs.java | 6 ++-- .../calculator/RpnCalculatorStepdefs.java | 10 +++--- .../java/calculator/ShoppingStepdefs.java | 6 ++-- .../java/calculator/DateStepdefs.java | 6 ++-- .../calculator/RpnCalculatorStepdefs.java | 10 +++--- .../java/calculator/ShoppingStepdefs.java | 6 ++-- .../java/wicket/steps/RentStepdefs.java | 6 ++-- .../txn/CucumberContextConfiguration.java | 2 +- .../spring/txn/SeeMessagesStepdefs.java | 6 ++-- .../spring/txn/SpringTransactionHooks.java | 4 +-- .../examples/spring/txn/UserStepdefs.java | 2 +- .../guice/integration/HelloWorldSteps.java | 2 +- .../integration/ScenarioScopedSteps.java | 6 ++-- .../integration/SingletonScopedSteps.java | 6 ++-- .../guice/integration/UnScopedSteps.java | 6 ++-- .../guice/integration/UnusedGlue.java | 4 +-- java/src/main/groovy/annotation.java.gsp | 2 +- .../main/groovy/generate-annotations.groovy | 6 ++-- .../io/cucumber/java/{api => }/After.java | 2 +- .../io/cucumber/java/{api => }/AfterStep.java | 2 +- .../io/cucumber/java/{api => }/Before.java | 2 +- .../cucumber/java/{api => }/BeforeStep.java | 2 +- .../java/io/cucumber/java/JavaBackend.java | 6 +--- .../java/JavaBackendProviderService.java | 2 +- .../io/cucumber/java/JavaHookDefinition.java | 2 +- .../java/io/cucumber/java/JavaSnippet.java | 2 +- .../io/cucumber/java/JavaStepDefinition.java | 3 +- .../java/io/cucumber/java/MethodScanner.java | 6 +--- .../java/{api => }/PendingException.java | 2 +- .../io/cucumber/java/{api => }/Transpose.java | 2 +- .../java/io/cucumber/java/JavaHookTest.java | 4 --- .../io/cucumber/java/JavaSnippetTest.java | 36 +++++++++---------- .../cucumber/java/JavaStepDefinitionTest.java | 2 +- .../java/JavaStepDefinitionTransposeTest.java | 1 - .../io/cucumber/java/MethodScannerTest.java | 2 +- .../io/cucumber/java/annotation/Authors.java | 4 +-- .../java/annotation/ScenarioStepDefs.java | 8 ++--- .../io/cucumber/java/annotation/Stepdefs.java | 2 +- .../java/annotation/SubstitutionStepdefs.java | 6 ++-- .../cucumber/java/annotation/UnusedGlue.java | 4 +-- .../io/cucumber/java/repeatable/Stepdefs.java | 2 +- .../io/cucumber/java/stepdefs/Stepdefs.java | 2 +- .../needle/test/AtmWithdrawalGlue.java | 2 +- .../needle/test/AtmWithdrawalSteps.java | 8 ++--- .../io/cucumber/needle/test/MoreSteps.java | 4 +-- .../io/cucumber/openejb/BellyStepdefs.java | 4 +-- .../java/io/cucumber/openejb/UnusedGlue.java | 4 +-- .../io/cucumber/picocontainer/StepDefs.java | 10 +++--- .../io/cucumber/picocontainer/UnusedGlue.java | 4 +-- .../spring/commonglue/AnotherStepDef.java | 2 +- .../spring/commonglue/OneStepDef.java | 4 +-- .../spring/commonglue/ThirdStepDef.java | 2 +- .../spring/commonglue/UnusedGlue.java | 4 +-- .../spring/contextconfig/BellyStepdefs.java | 2 +- .../DirtiesContextBellyStepDefs.java | 4 +-- .../DirtiesContextBellyMetaStepDefs.java | 4 +-- .../metaconfig/general/BellyMetaStepdefs.java | 2 +- .../spring/threading/ThreadingStepDefs.java | 6 ++-- .../webappconfig/SpringInjectionStepDefs.java | 6 ++-- .../java/io/cucumber/weld/BellyStepdefs.java | 4 +-- .../java/io/cucumber/weld/UnusedGlue.java | 4 +-- 64 files changed, 138 insertions(+), 152 deletions(-) rename java/src/main/java/io/cucumber/java/{api => }/After.java (97%) rename java/src/main/java/io/cucumber/java/{api => }/AfterStep.java (97%) rename java/src/main/java/io/cucumber/java/{api => }/Before.java (97%) rename java/src/main/java/io/cucumber/java/{api => }/BeforeStep.java (97%) rename java/src/main/java/io/cucumber/java/{api => }/PendingException.java (92%) rename java/src/main/java/io/cucumber/java/{api => }/Transpose.java (97%) diff --git a/cdi2/src/test/java/io/cucumber/cdi2/BellyStepdefs.java b/cdi2/src/test/java/io/cucumber/cdi2/BellyStepdefs.java index 9d134dc4e2..30ab970d44 100644 --- a/cdi2/src/test/java/io/cucumber/cdi2/BellyStepdefs.java +++ b/cdi2/src/test/java/io/cucumber/cdi2/BellyStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.cdi2; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.en.Given; import javax.enterprise.inject.Vetoed; import javax.inject.Inject; diff --git a/cdi2/src/test/java/io/cucumber/cdi2/CDIBellyStepdefs.java b/cdi2/src/test/java/io/cucumber/cdi2/CDIBellyStepdefs.java index 2d5891f267..e873e368b0 100644 --- a/cdi2/src/test/java/io/cucumber/cdi2/CDIBellyStepdefs.java +++ b/cdi2/src/test/java/io/cucumber/cdi2/CDIBellyStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.cdi2; -import io.cucumber.java.api.en.Then; +import io.cucumber.java.en.Then; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; diff --git a/cdi2/src/test/java/io/cucumber/cdi2/UnusedGlue.java b/cdi2/src/test/java/io/cucumber/cdi2/UnusedGlue.java index 41319295dc..9434eb94e8 100644 --- a/cdi2/src/test/java/io/cucumber/cdi2/UnusedGlue.java +++ b/cdi2/src/test/java/io/cucumber/cdi2/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.cdi2; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; public class UnusedGlue { public UnusedGlue() { diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java index b8ce1a1f4a..02f84d6a80 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.calculator; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import java.util.Date; diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index ad8155336b..d845698a1e 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,11 +1,11 @@ package io.cucumber.examples.java.calculator; import io.cucumber.core.api.Scenario; -import io.cucumber.java.api.After; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.After; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import java.util.List; diff --git a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index ef6c95443d..f69342da8f 100644 --- a/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java-calculator-testng/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.calculator; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import java.util.List; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java index 606a6d5e8f..a4e5bf3c23 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/DateStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.calculator; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import java.util.Date; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java index 6601c238f8..15322a4cb6 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/RpnCalculatorStepdefs.java @@ -1,11 +1,11 @@ package io.cucumber.examples.java.calculator; import io.cucumber.core.api.Scenario; -import io.cucumber.java.api.After; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.After; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import java.util.List; diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java index 6f6c69879e..204d76f26b 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/calculator/ShoppingStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.calculator; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import java.util.List; diff --git a/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java index a6153f2770..bb140d2b3f 100644 --- a/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java +++ b/examples/java-wicket/java-wicket-test/src/test/java/io/cucumber/examples/java/wicket/steps/RentStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.java.wicket.steps; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java index cf9fadd087..334e4570d1 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/CucumberContextConfiguration.java @@ -1,6 +1,6 @@ package io.cucumber.examples.spring.txn; -import io.cucumber.java.api.Before; +import io.cucumber.java.Before; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java index 56614f6480..4ed4358dbc 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SeeMessagesStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.examples.spring.txn; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SpringTransactionHooks.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SpringTransactionHooks.java index 748232a31d..1eb80dcd16 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SpringTransactionHooks.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/SpringTransactionHooks.java @@ -1,7 +1,7 @@ package io.cucumber.examples.spring.txn; -import io.cucumber.java.api.After; -import io.cucumber.java.api.Before; +import io.cucumber.java.After; +import io.cucumber.java.Before; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java index 227dfb8ec8..39f1d0dc2f 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/UserStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.examples.spring.txn; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.en.Given; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.support.TransactionSynchronizationManager; diff --git a/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java index a6fdd1707e..483a188313 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java @@ -1,6 +1,6 @@ package io.cucumber.guice.integration; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.en.Given; import io.cucumber.guice.api.ScenarioScoped; @ScenarioScoped diff --git a/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java index f7d4977477..e0558831c8 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java @@ -1,8 +1,8 @@ package io.cucumber.guice.integration; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import io.cucumber.guice.api.ScenarioScoped; import javax.inject.Inject; diff --git a/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java index 67d9a22855..ebc82ab198 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java @@ -1,8 +1,8 @@ package io.cucumber.guice.integration; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import io.cucumber.guice.api.ScenarioScoped; import javax.inject.Inject; diff --git a/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java index 87b383aff1..3405e2af1d 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/UnScopedSteps.java @@ -1,8 +1,8 @@ package io.cucumber.guice.integration; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import javax.inject.Inject; import javax.inject.Provider; diff --git a/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java b/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java index 5755f6d79c..8370bdeb79 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java +++ b/guice/src/test/java/io/cucumber/guice/integration/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.guice.integration; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; public class UnusedGlue { public UnusedGlue() { diff --git a/java/src/main/groovy/annotation.java.gsp b/java/src/main/groovy/annotation.java.gsp index f13909bc65..670ad8977c 100644 --- a/java/src/main/groovy/annotation.java.gsp +++ b/java/src/main/groovy/annotation.java.gsp @@ -1,4 +1,4 @@ -package io.cucumber.java.api.${lang}; +package io.cucumber.java.${lang}; import io.cucumber.java.StepDefAnnotation; import io.cucumber.java.StepDefAnnotations; diff --git a/java/src/main/groovy/generate-annotations.groovy b/java/src/main/groovy/generate-annotations.groovy index e00cd825a2..0d716d1dfe 100644 --- a/java/src/main/groovy/generate-annotations.groovy +++ b/java/src/main/groovy/generate-annotations.groovy @@ -28,7 +28,7 @@ def package_info_java = """\ /** * \${locale.getDisplayLanguage()} */ -package io.cucumber.java.api.\${normalized_language}; +package io.cucumber.java.\${normalized_language}; """ @@ -43,7 +43,7 @@ GherkinDialectProvider.DIALECTS.keySet().each { language -> def normalized_kw = normalize(kw.replaceAll("[\\s',!\u00AD]", "")) def binding = ["lang": normalized_language, "kw": normalized_kw] def template = engine.createTemplate(templateSource).make(binding) - def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/${normalized_language}/${normalized_kw}.java") + def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/${normalized_language}/${normalized_kw}.java") if (!file.exists()) { // Haitian has two translations that only differ by case - Sipozeke and SipozeKe // Some file systems are unable to distiguish between them and overwrite the other one :-( @@ -56,7 +56,7 @@ GherkinDialectProvider.DIALECTS.keySet().each { language -> def locale = localeFor(dialect.language) def binding = [ "locale": locale, "normalized_language": normalized_language ] def html = engine.createTemplate(package_info_java).make(binding).toString() - def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/api/${normalized_language}/package-info.java") + def file = new File(project.baseDir, "target/generated-sources/i18n/java/io/cucumber/java/${normalized_language}/package-info.java") file.write(html, "UTF-8") } } \ No newline at end of file diff --git a/java/src/main/java/io/cucumber/java/api/After.java b/java/src/main/java/io/cucumber/java/After.java similarity index 97% rename from java/src/main/java/io/cucumber/java/api/After.java rename to java/src/main/java/io/cucumber/java/After.java index 7eedd2b877..2301eb7ea8 100644 --- a/java/src/main/java/io/cucumber/java/api/After.java +++ b/java/src/main/java/io/cucumber/java/After.java @@ -1,4 +1,4 @@ -package io.cucumber.java.api; +package io.cucumber.java; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/main/java/io/cucumber/java/api/AfterStep.java b/java/src/main/java/io/cucumber/java/AfterStep.java similarity index 97% rename from java/src/main/java/io/cucumber/java/api/AfterStep.java rename to java/src/main/java/io/cucumber/java/AfterStep.java index 29f29aa052..2f2aeb1d33 100644 --- a/java/src/main/java/io/cucumber/java/api/AfterStep.java +++ b/java/src/main/java/io/cucumber/java/AfterStep.java @@ -1,4 +1,4 @@ -package io.cucumber.java.api; +package io.cucumber.java; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/main/java/io/cucumber/java/api/Before.java b/java/src/main/java/io/cucumber/java/Before.java similarity index 97% rename from java/src/main/java/io/cucumber/java/api/Before.java rename to java/src/main/java/io/cucumber/java/Before.java index c575f4e77a..5540f672b0 100644 --- a/java/src/main/java/io/cucumber/java/api/Before.java +++ b/java/src/main/java/io/cucumber/java/Before.java @@ -1,4 +1,4 @@ -package io.cucumber.java.api; +package io.cucumber.java; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/main/java/io/cucumber/java/api/BeforeStep.java b/java/src/main/java/io/cucumber/java/BeforeStep.java similarity index 97% rename from java/src/main/java/io/cucumber/java/api/BeforeStep.java rename to java/src/main/java/io/cucumber/java/BeforeStep.java index 9f3d9db68d..2ac0b6f550 100644 --- a/java/src/main/java/io/cucumber/java/api/BeforeStep.java +++ b/java/src/main/java/io/cucumber/java/BeforeStep.java @@ -1,4 +1,4 @@ -package io.cucumber.java.api; +package io.cucumber.java; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index db22d1dbd8..97c0ffa8e4 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -12,10 +12,6 @@ import io.cucumber.core.runtime.Invoker; import io.cucumber.core.snippets.SnippetGenerator; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.java.api.After; -import io.cucumber.java.api.AfterStep; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.BeforeStep; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -24,7 +20,7 @@ import static java.lang.Thread.currentThread; -public class JavaBackend implements Backend { +final class JavaBackend implements Backend { private final TypeRegistry typeRegistry; private final SnippetGenerator annotationSnippetGenerator; diff --git a/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java b/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java index d4e949dc2d..6971022886 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java +++ b/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java @@ -6,7 +6,7 @@ import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.TypeRegistry; -public class JavaBackendProviderService implements BackendProviderService { +public final class JavaBackendProviderService implements BackendProviderService { @Override public Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index 65ee9ba4df..a46996d300 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -12,7 +12,7 @@ import java.lang.reflect.Method; import java.util.Collection; -class JavaHookDefinition implements HookDefinition { +final class JavaHookDefinition implements HookDefinition { private final Method method; private final long timeoutMillis; diff --git a/java/src/main/java/io/cucumber/java/JavaSnippet.java b/java/src/main/java/io/cucumber/java/JavaSnippet.java index 0add3e594d..eaa1e3039b 100644 --- a/java/src/main/java/io/cucumber/java/JavaSnippet.java +++ b/java/src/main/java/io/cucumber/java/JavaSnippet.java @@ -8,7 +8,7 @@ public String template() { "@{0}(\"{1}\")\n" + "public void {2}({3}) '{'\n" + " // {4}\n" + - "{5} throw new io.cucumber.java.api.PendingException();\n" + + "{5} throw new io.cucumber.java.PendingException();\n" + "'}'\n"; } } diff --git a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java index 9b4edb7ca6..88b8a4c2a3 100644 --- a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java @@ -11,7 +11,6 @@ import io.cucumber.core.stepexpression.StepExpression; import io.cucumber.core.stepexpression.StepExpressionFactory; import gherkin.pickles.PickleStep; -import io.cucumber.java.api.Transpose; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -19,7 +18,7 @@ import java.util.ArrayList; import java.util.List; -class JavaStepDefinition implements StepDefinition { +final class JavaStepDefinition implements StepDefinition { private final Method method; private final StepExpression expression; private final long timeoutMillis; diff --git a/java/src/main/java/io/cucumber/java/MethodScanner.java b/java/src/main/java/io/cucumber/java/MethodScanner.java index 478dbf73f3..8727333206 100644 --- a/java/src/main/java/io/cucumber/java/MethodScanner.java +++ b/java/src/main/java/io/cucumber/java/MethodScanner.java @@ -2,10 +2,6 @@ import io.cucumber.core.reflection.Reflections; import io.cucumber.core.runtime.Invoker; -import io.cucumber.java.api.After; -import io.cucumber.java.api.AfterStep; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.BeforeStep; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.exception.CucumberException; @@ -14,7 +10,7 @@ import java.net.URI; import java.util.List; -class MethodScanner { +final class MethodScanner { private final ClassFinder classFinder; diff --git a/java/src/main/java/io/cucumber/java/api/PendingException.java b/java/src/main/java/io/cucumber/java/PendingException.java similarity index 92% rename from java/src/main/java/io/cucumber/java/api/PendingException.java rename to java/src/main/java/io/cucumber/java/PendingException.java index f3a98f56e6..2e1f11d51e 100644 --- a/java/src/main/java/io/cucumber/java/api/PendingException.java +++ b/java/src/main/java/io/cucumber/java/PendingException.java @@ -1,4 +1,4 @@ -package io.cucumber.java.api; +package io.cucumber.java; import io.cucumber.core.backend.Pending; diff --git a/java/src/main/java/io/cucumber/java/api/Transpose.java b/java/src/main/java/io/cucumber/java/Transpose.java similarity index 97% rename from java/src/main/java/io/cucumber/java/api/Transpose.java rename to java/src/main/java/io/cucumber/java/Transpose.java index 9dee0cbd29..9e3137724a 100644 --- a/java/src/main/java/io/cucumber/java/api/Transpose.java +++ b/java/src/main/java/io/cucumber/java/Transpose.java @@ -1,4 +1,4 @@ -package io.cucumber.java.api; +package io.cucumber.java; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/java/src/test/java/io/cucumber/java/JavaHookTest.java b/java/src/test/java/io/cucumber/java/JavaHookTest.java index 18d0775953..b029f4d137 100644 --- a/java/src/test/java/io/cucumber/java/JavaHookTest.java +++ b/java/src/test/java/io/cucumber/java/JavaHookTest.java @@ -1,10 +1,6 @@ package io.cucumber.java; import io.cucumber.core.api.Scenario; -import io.cucumber.java.api.After; -import io.cucumber.java.api.AfterStep; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.BeforeStep; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; diff --git a/java/src/test/java/io/cucumber/java/JavaSnippetTest.java b/java/src/test/java/io/cucumber/java/JavaSnippetTest.java index 93af9d8f41..3ce53d3890 100644 --- a/java/src/test/java/io/cucumber/java/JavaSnippetTest.java +++ b/java/src/test/java/io/cucumber/java/JavaSnippetTest.java @@ -35,7 +35,7 @@ public void generatesPlainSnippet() { "@Given(\"I have {int} cukes in my {string} belly\")\n" + "public void i_have_cukes_in_my_belly(Integer int1, String string) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 4 cukes in my \"big\" belly")); } @@ -58,7 +58,7 @@ public Size transform(String... strings) { "@Given(\"I have {double} cukes in my {size} belly\")\n" + "public void i_have_cukes_in_my_belly(Double double1, Size size) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 4.2 cukes in my large belly", customParameterType)); } @@ -83,7 +83,7 @@ public List transform(String... strings) { "@Given(\"I have {sizes} bellies\")\n" + "public void i_have_bellies(java.util.List sizes) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have large and small bellies", customParameterType)); } @@ -94,7 +94,7 @@ public void generatesCopyPasteReadyStepSnippetForNumberParameters() { "@Given(\"before {int} after\")\n" + "public void before_after(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("before 5 after")); } @@ -105,7 +105,7 @@ public void generatesCopyPasteReadySnippetWhenStepHasIllegalJavaIdentifierChars( "@Given(\"I have {int} cukes in: my {string} red-belly!\")\n" + "public void i_have_cukes_in_my_red_belly(Integer int1, String string) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 4 cukes in: my \"big\" red-belly!")); } @@ -116,7 +116,7 @@ public void generatesCopyPasteReadySnippetWhenStepHasIntegersInsideStringParamet "@Given(\"the DI system receives a message saying {string}\")\n" + "public void the_DI_system_receives_a_message_saying(String string) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("the DI system receives a message saying \"{ dataIngestion: { feeds: [ feed: { merchantId: 666, feedId: 1, feedFileLocation: feed.csv } ] }\"")); } @@ -127,7 +127,7 @@ public void generatesSnippetWithDollarSigns() { "@Given(\"I have ${int}\")\n" + "public void i_have_$(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have $5")); } @@ -138,7 +138,7 @@ public void generatesSnippetWithQuestionMarks() { "@Given(\"is there an error?:\")\n" + "public void is_there_an_error() {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("is there an error?:")); } @@ -149,7 +149,7 @@ public void generatesSnippetWithLotsOfNonIdentifierCharacters() { "@Given(\"\\\\([a-z]*)?.+\")\n" + "public void a_z() {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("([a-z]*)?.+")); } @@ -160,7 +160,7 @@ public void generatesSnippetWithParentheses() { "@Given(\"I have {int} cukes \\\\(maybe more)\")\n" + "public void i_have_cukes_maybe_more(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 5 cukes (maybe more)")); } @@ -171,7 +171,7 @@ public void generatesSnippetWithBrackets() { "@Given(\"I have {int} cukes [maybe more]\")\n" + "public void i_have_cukes_maybe_more(Integer int1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("I have 5 cukes [maybe more]")); } @@ -182,7 +182,7 @@ public void generatesSnippetWithDocString() { "@Given(\"I have:\")\n" + "public void i_have(String docString) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetForDocString("I have:", new PickleString(null, "hello"))); } @@ -206,13 +206,13 @@ public String transform(String... strings) { "@Given(\"I have a {docString}:\")\n" + "public void i_have_a(String docString, String docString1) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n" + "\n" + "@Given(\"I have a {string}:\")\n" + "public void i_have_a(String string, String docString) {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetForDocString("I have a \"Documentation String\":", new PickleString(null, "hello"), customParameterType)); } @@ -241,7 +241,7 @@ public void generatesSnippetWithDataTable() { " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + " //\n" + " // For other transformations you can register a DataTableType.\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; PickleTable dataTable = new PickleTable(asList(new PickleRow(asList(new PickleCell(null, "col1"))))); assertEquals(expected, snippetForDataTable("I have:", dataTable)); @@ -273,7 +273,7 @@ public String transform(String... strings) { " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + " //\n" + " // For other transformations you can register a DataTableType.\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n" + "\n" + "@Given(\"I have in table {string}:\")\n" + @@ -285,7 +285,7 @@ public String transform(String... strings) { " // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" + " //\n" + " // For other transformations you can register a DataTableType.\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; PickleTable dataTable = new PickleTable(asList(new PickleRow(asList(new PickleCell(null, "col1"))))); assertEquals(expected, snippetForDataTable("I have in table \"M6\":", dataTable, customParameterType)); @@ -297,7 +297,7 @@ public void generateSnippetWithOutlineParam() { "@Given(\"Then it responds \")\n" + "public void then_it_responds_param() {\n" + " // Write code here that turns the phrase above into concrete actions\n" + - " throw new io.cucumber.java.api.PendingException();\n" + + " throw new io.cucumber.java.PendingException();\n" + "}\n"; assertEquals(expected, snippetFor("Then it responds ")); diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 0c29145dba..7cd3722672 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -4,7 +4,7 @@ import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.en.Given; import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java index 548ba7d87e..d570e1bc71 100755 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java @@ -1,7 +1,6 @@ package io.cucumber.java; import io.cucumber.core.backend.Lookup; -import io.cucumber.java.api.Transpose; import io.cucumber.core.backend.StepDefinition; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleLocation; diff --git a/java/src/test/java/io/cucumber/java/MethodScannerTest.java b/java/src/test/java/io/cucumber/java/MethodScannerTest.java index 8222515c47..ed4a01d116 100644 --- a/java/src/test/java/io/cucumber/java/MethodScannerTest.java +++ b/java/src/test/java/io/cucumber/java/MethodScannerTest.java @@ -85,7 +85,7 @@ public interface Interface1 { } public static class BaseStepDefs { - @io.cucumber.java.api.Before + @io.cucumber.java.Before public void m() { } } diff --git a/java/src/test/java/io/cucumber/java/annotation/Authors.java b/java/src/test/java/io/cucumber/java/annotation/Authors.java index 7536ca0902..4023b23aea 100644 --- a/java/src/test/java/io/cucumber/java/annotation/Authors.java +++ b/java/src/test/java/io/cucumber/java/annotation/Authors.java @@ -1,7 +1,7 @@ package io.cucumber.java.annotation; -import io.cucumber.java.api.Transpose; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.Transpose; +import io.cucumber.java.en.Given; import java.util.List; diff --git a/java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java b/java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java index cc6ff5813c..8f14e02aef 100644 --- a/java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java @@ -1,10 +1,10 @@ package io.cucumber.java.annotation; import io.cucumber.core.api.Scenario; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import static org.junit.Assert.assertEquals; diff --git a/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java b/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java index 34b1c86487..6c5d99f38f 100644 --- a/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.java.annotation; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.en.Given; import java.util.List; diff --git a/java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java b/java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java index 4f68da98c4..c87293a36d 100644 --- a/java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java @@ -1,8 +1,8 @@ package io.cucumber.java.annotation; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import java.util.HashMap; import java.util.Map; diff --git a/java/src/test/java/io/cucumber/java/annotation/UnusedGlue.java b/java/src/test/java/io/cucumber/java/annotation/UnusedGlue.java index 907e5d46a8..ffa9d1f650 100644 --- a/java/src/test/java/io/cucumber/java/annotation/UnusedGlue.java +++ b/java/src/test/java/io/cucumber/java/annotation/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.java.annotation; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; public class UnusedGlue { public UnusedGlue() { diff --git a/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java b/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java index 488b26c675..7f25d583d7 100644 --- a/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.java.repeatable; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.en.Given; public class Stepdefs { diff --git a/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java b/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java index f8503766b5..e8e50648ab 100644 --- a/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.java.stepdefs; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.en.Given; public class Stepdefs { diff --git a/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java index d081bc8350..736b97c97e 100755 --- a/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java +++ b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalGlue.java @@ -5,7 +5,7 @@ import javax.inject.Inject; -import io.cucumber.java.api.Before; +import io.cucumber.java.Before; import io.cucumber.needle.test.injectionprovider.NameGetter; import io.cucumber.needle.test.injectionprovider.SimpleNameGetterProvider; diff --git a/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java index 74743e281b..2dfec1e0e0 100755 --- a/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java +++ b/needle/src/test/java/io/cucumber/needle/test/AtmWithdrawalSteps.java @@ -2,10 +2,10 @@ import de.akquinet.jbosscc.needle.annotation.ObjectUnderTest; import de.akquinet.jbosscc.needle.injection.InjectionProvider; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import io.cucumber.needle.DefaultInstanceInjectionProvider; import io.cucumber.needle.InjectionProviderInstancesSupplier; import io.cucumber.needle.NeedleInjectionProvider; diff --git a/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java b/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java index 0ef0f045f3..f2df1e54d0 100644 --- a/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java +++ b/needle/src/test/java/io/cucumber/needle/test/MoreSteps.java @@ -1,8 +1,8 @@ package io.cucumber.needle.test; import de.akquinet.jbosscc.needle.injection.InjectionProvider; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; import io.cucumber.needle.DefaultInstanceInjectionProvider; import io.cucumber.needle.NeedleInjectionProvider; diff --git a/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java b/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java index d87124f108..8e1e8852b3 100644 --- a/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java +++ b/openejb/src/test/java/io/cucumber/openejb/BellyStepdefs.java @@ -1,7 +1,7 @@ package io.cucumber.openejb; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; import javax.inject.Inject; diff --git a/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java b/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java index 678e2941c0..e0e1c410a4 100644 --- a/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java +++ b/openejb/src/test/java/io/cucumber/openejb/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.openejb; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; public class UnusedGlue { public UnusedGlue() { diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java b/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java index d2c6c56671..e3b9e5293f 100644 --- a/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/StepDefs.java @@ -1,11 +1,11 @@ package io.cucumber.picocontainer; -import io.cucumber.java.api.PendingException; +import io.cucumber.java.PendingException; import io.cucumber.core.api.Scenario; -import io.cucumber.java.api.After; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; +import io.cucumber.java.After; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; import java.util.Collections; import java.util.List; diff --git a/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java b/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java index d8ae28ebc5..0b453b4abb 100644 --- a/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java +++ b/picocontainer/src/test/java/io/cucumber/picocontainer/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.picocontainer; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; public class UnusedGlue { diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java index 5ad252d5f4..cef6140e19 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/AnotherStepDef.java @@ -1,6 +1,6 @@ package io.cucumber.spring.commonglue; -import io.cucumber.java.api.en.Then; +import io.cucumber.java.en.Then; import org.springframework.beans.factory.annotation.Autowired; import static org.junit.Assert.assertEquals; diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java index b02e4a3305..42fdbe07b2 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/OneStepDef.java @@ -2,8 +2,8 @@ import org.springframework.beans.factory.annotation.Autowired; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.When; public class OneStepDef { int cucumbers; diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java b/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java index c293b687d3..2decab06dc 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/ThirdStepDef.java @@ -1,6 +1,6 @@ package io.cucumber.spring.commonglue; -import io.cucumber.java.api.en.Then; +import io.cucumber.java.en.Then; import static org.junit.Assert.assertEquals; diff --git a/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java b/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java index fb7a657c30..b92237cbd7 100644 --- a/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java +++ b/spring/src/test/java/io/cucumber/spring/commonglue/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.spring.commonglue; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; public class UnusedGlue { public UnusedGlue() { diff --git a/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java b/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java index 371437a170..5837bad6ff 100644 --- a/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java +++ b/spring/src/test/java/io/cucumber/spring/contextconfig/BellyStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.spring.contextconfig; -import io.cucumber.java.api.en.Then; +import io.cucumber.java.en.Then; import io.cucumber.spring.beans.Belly; import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java index 0a67ddc56a..64ce604401 100644 --- a/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java @@ -1,7 +1,7 @@ package io.cucumber.spring.dirtiescontextconfig; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; import io.cucumber.spring.beans.Belly; import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java index 563d100643..5ff3bcefe8 100644 --- a/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/dirties/DirtiesContextBellyMetaStepDefs.java @@ -1,7 +1,7 @@ package io.cucumber.spring.metaconfig.dirties; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; import io.cucumber.spring.beans.Belly; import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java b/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java index 1159383dad..11d2d9fe8b 100644 --- a/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java +++ b/spring/src/test/java/io/cucumber/spring/metaconfig/general/BellyMetaStepdefs.java @@ -1,6 +1,6 @@ package io.cucumber.spring.metaconfig.general; -import io.cucumber.java.api.en.Then; +import io.cucumber.java.en.Then; import io.cucumber.spring.beans.Belly; import io.cucumber.spring.beans.BellyBean; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java b/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java index c072feef9f..c7c8397f11 100644 --- a/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/threading/ThreadingStepDefs.java @@ -5,9 +5,9 @@ import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; diff --git a/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java b/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java index 85dfa59506..8863b020bb 100644 --- a/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java +++ b/spring/src/test/java/io/cucumber/spring/webappconfig/SpringInjectionStepDefs.java @@ -1,8 +1,8 @@ package io.cucumber.spring.webappconfig; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; -import io.cucumber.java.api.en.When; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; diff --git a/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java b/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java index b0adae2fdf..c4d5bb95f0 100644 --- a/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java +++ b/weld/src/test/java/io/cucumber/weld/BellyStepdefs.java @@ -1,7 +1,7 @@ package io.cucumber.weld; -import io.cucumber.java.api.en.Given; -import io.cucumber.java.api.en.Then; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; import javax.inject.Inject; import javax.inject.Singleton; diff --git a/weld/src/test/java/io/cucumber/weld/UnusedGlue.java b/weld/src/test/java/io/cucumber/weld/UnusedGlue.java index fe16838c0a..e40b377fb2 100644 --- a/weld/src/test/java/io/cucumber/weld/UnusedGlue.java +++ b/weld/src/test/java/io/cucumber/weld/UnusedGlue.java @@ -1,7 +1,7 @@ package io.cucumber.weld; -import io.cucumber.java.api.Before; -import io.cucumber.java.api.en.Given; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; public class UnusedGlue { public UnusedGlue() { From 940d99dfb0cb011d80269478fc7372d778055a57 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 23 Jun 2019 00:52:58 +0200 Subject: [PATCH 094/155] [Core] Remove CucumberOptions annotation from core --- .../io/cucumber/core/api/plugin/Plugin.java | 3 +- .../CucumberOptionsAnnotationParser.java | 87 +---- .../core}/options/CucumberOptions.java | 7 +- .../CucumberOptionsAnnotationParserTest.java | 362 ++++++++++++++++++ .../io/cucumber/core/runtime/RuntimeTest.java | 3 +- .../examples/spring/txn/RunCucumberTest.java | 2 +- .../main/java/io/cucumber/junit/Cucumber.java | 1 - .../java/io/cucumber/junit/CucumberTest.java | 1 - .../junit/InvokeMethodsAroundEventsTest.java | 1 - .../testng/TestNGCucumberRunnerTest.java | 1 - 10 files changed, 375 insertions(+), 93 deletions(-) rename core/src/{main/java/io/cucumber/core/api => test/java/io/cucumber/core}/options/CucumberOptions.java (96%) create mode 100644 core/src/test/java/io/cucumber/core/options/CucumberOptionsAnnotationParserTest.java diff --git a/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java b/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java index 449b415f03..70074530a4 100644 --- a/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java @@ -1,6 +1,5 @@ package io.cucumber.core.api.plugin; -import io.cucumber.core.api.options.CucumberOptions; import io.cucumber.core.api.event.ConcurrentEventListener; import io.cucumber.core.api.event.EventListener; @@ -14,7 +13,7 @@ * A plugin can be added to the runtime to listen in on step definition, summary printing and test * execution. *

      - * Plugins are added to the runtime from the command line or @{@link CucumberOptions} and may be provided with a + * Plugins are added to the runtime from the command line or @{@link io.cucumber.core.options.CucumberOptionsAnnotationParser.CucumberOptions} and may be provided with a * parameter. To accept this parameter the plugin must have a public constructor that accepts one of the following * arguments: *

        diff --git a/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java b/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java index 4bacea5fd2..bfddbdb4db 100644 --- a/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java +++ b/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java @@ -11,14 +11,16 @@ import io.cucumber.core.model.RerunLoader; import java.net.URI; +import java.util.Objects; import java.util.regex.Pattern; +import static java.util.Objects.requireNonNull; + public final class CucumberOptionsAnnotationParser { private final RerunLoader rerunLoader; private boolean featuresSpecified = false; private boolean overridingGlueSpecified = false; private OptionsProvider optionsProvider; - private CoreCucumberOptionsProvider coreCucumberOptionsProvider = new CoreCucumberOptionsProvider(); public CucumberOptionsAnnotationParser() { this(new MultiLoader(CucumberOptionsAnnotationParser.class.getClassLoader())); @@ -37,13 +39,8 @@ public RuntimeOptionsBuilder parse(Class clazz) { RuntimeOptionsBuilder args = new RuntimeOptionsBuilder(); for (Class classWithOptions = clazz; hasSuperClass(classWithOptions); classWithOptions = classWithOptions.getSuperclass()) { - CucumberOptions options = null; - if (optionsProvider != null) { - options = optionsProvider.getOptions(classWithOptions); - } - if(options == null){ - options = coreCucumberOptionsProvider.getOptions(classWithOptions); - } + CucumberOptions options = requireNonNull(optionsProvider).getOptions(classWithOptions); + if (options != null) { addDryRun(options, args); addMonochrome(options, args); @@ -218,78 +215,4 @@ public interface CucumberOptions { String[] junit(); } - - private static class CoreCucumberOptions implements CucumberOptions { - private final io.cucumber.core.api.options.CucumberOptions annotation; - - CoreCucumberOptions(io.cucumber.core.api.options.CucumberOptions annotation) { - this.annotation = annotation; - } - - @Override - public boolean dryRun() { - return annotation.dryRun(); - } - - @Override - public boolean strict() { - return annotation.strict(); - } - - @Override - public String[] features() { - return annotation.features(); - } - - @Override - public String[] glue() { - return annotation.glue(); - } - - @Override - public String[] extraGlue() { - return annotation.extraGlue(); - } - - @Override - public String[] tags() { - return annotation.tags(); - } - - @Override - public String[] plugin() { - return annotation.plugin(); - } - - @Override - public boolean monochrome() { - return annotation.monochrome(); - } - - @Override - public String[] name() { - return annotation.name(); - } - - @Override - public SnippetType snippets() { - return annotation.snippets(); - } - - @Override - public String[] junit() { - return annotation.junit(); - } - } - - private static class CoreCucumberOptionsProvider implements OptionsProvider { - @Override - public CucumberOptions getOptions(Class clazz) { - final io.cucumber.core.api.options.CucumberOptions annotation = clazz.getAnnotation(io.cucumber.core.api.options.CucumberOptions.class); - if (annotation == null) { - return null; - } - return new CoreCucumberOptions(annotation); - } - } } diff --git a/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java b/core/src/test/java/io/cucumber/core/options/CucumberOptions.java similarity index 96% rename from core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java rename to core/src/test/java/io/cucumber/core/options/CucumberOptions.java index cdc984a48b..0d51f11be9 100644 --- a/core/src/main/java/io/cucumber/core/api/options/CucumberOptions.java +++ b/core/src/test/java/io/cucumber/core/options/CucumberOptions.java @@ -1,4 +1,6 @@ -package io.cucumber.core.api.options; +package io.cucumber.core.options; + +import io.cucumber.core.api.options.SnippetType; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -6,13 +8,12 @@ import java.lang.annotation.Target; /** - * This annotation provides the same options as the cucumber command line, {@link io.cucumber.core.api.cli.Main}. + * This annotation provides the same options as the cucumber command line, {@link io.cucumber.core.cli.Main}. * * @deprecated use either {@code io.cucumber.junit.CucumberOptions} or {@code io.cucumber.testng.CucumberOptions}. */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) -@Deprecated public @interface CucumberOptions { /** diff --git a/core/src/test/java/io/cucumber/core/options/CucumberOptionsAnnotationParserTest.java b/core/src/test/java/io/cucumber/core/options/CucumberOptionsAnnotationParserTest.java new file mode 100644 index 0000000000..56d4ef3eec --- /dev/null +++ b/core/src/test/java/io/cucumber/core/options/CucumberOptionsAnnotationParserTest.java @@ -0,0 +1,362 @@ +package io.cucumber.core.options; + +import io.cucumber.core.api.options.SnippetType; +import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.plugin.PluginFactory; +import io.cucumber.core.plugin.Plugins; +import io.cucumber.core.runner.TimeServiceEventBus; +import org.junit.Test; + +import java.net.URI; +import java.time.Clock; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Pattern; + +import static java.util.Arrays.asList; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +public class CucumberOptionsAnnotationParserTest { + @Test + public void create_strict() { + RuntimeOptions runtimeOptions = parser().parse(Strict.class).build(); + assertTrue(runtimeOptions.isStrict()); + } + + private CucumberOptionsAnnotationParser parser() { + return new CucumberOptionsAnnotationParser() + .withOptionsProvider(new CoreCucumberOptionsProvider()); + } + + @Test + public void create_non_strict() { + RuntimeOptions runtimeOptions = parser().parse(NotStrict.class).build(); + assertFalse(runtimeOptions.isStrict()); + } + + @Test + public void create_without_options() { + RuntimeOptions runtimeOptions = parser() + .parse(WithoutOptions.class) + .addDefaultSummaryPrinterIfNotPresent() + .addDefaultFormatterIfNotPresent() + .build(); + assertFalse(runtimeOptions.isStrict()); + assertThat(runtimeOptions.getFeaturePaths(), contains(uri("classpath:io/cucumber/core/options"))); + assertThat(runtimeOptions.getGlue(), contains(uri("classpath:io/cucumber/core/options"))); + Plugins plugins = new Plugins(new PluginFactory(), runtimeOptions); + plugins.setEventBusOnEventListenerPlugins(new TimeServiceEventBus(Clock.systemUTC())); + + assertThat(plugins.getPlugins(), hasSize(2)); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.ProgressFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); + } + + public static URI uri(String str) { + return URI.create(str); + } + + @Test + public void create_without_options_with_base_class_without_options() { + Class subClassWithMonoChromeTrueClass = WithoutOptionsWithBaseClassWithoutOptions.class; + RuntimeOptions runtimeOptions = parser() + .parse(subClassWithMonoChromeTrueClass) + .addDefaultFormatterIfNotPresent() + .addDefaultSummaryPrinterIfNotPresent() + .build(); + Plugins plugins = new Plugins(new PluginFactory(), runtimeOptions); + plugins.setEventBusOnEventListenerPlugins(new TimeServiceEventBus(Clock.systemUTC())); + + assertThat(runtimeOptions.getFeaturePaths(), contains(uri("classpath:io/cucumber/core/options"))); + assertThat(runtimeOptions.getGlue(), contains(uri("classpath:io/cucumber/core/options"))); + + assertThat(plugins.getPlugins(), hasSize(2)); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.ProgressFormatter"); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); + } + + @Test + public void create_with_no_name() { + RuntimeOptions runtimeOptions = parser().parse(NoName.class).build(); + assertTrue(runtimeOptions.getTagExpressions().isEmpty()); + assertTrue(runtimeOptions.getNameFilters().isEmpty()); + assertTrue(runtimeOptions.getLineFilters().isEmpty()); + } + + @Test + public void create_with_multiple_names() { + RuntimeOptions runtimeOptions = parser().parse(MultipleNames.class).build(); + + List filters = runtimeOptions.getNameFilters(); + assertEquals(2, filters.size()); + Iterator iterator = filters.iterator(); + assertEquals("name1", getRegexpPattern(iterator.next())); + assertEquals("name2", getRegexpPattern(iterator.next())); + } + + @Test + public void create_with_snippets() { + RuntimeOptions runtimeOptions = parser().parse(Snippets.class).build(); + assertEquals(SnippetType.CAMELCASE, runtimeOptions.getSnippetType()); + } + + private String getRegexpPattern(Object pattern) { + return ((Pattern) pattern).pattern(); + } + + @Test + public void create_default_summary_printer_when_no_summary_printer_plugin_is_defined() { + RuntimeOptions runtimeOptions = parser() + .parse(ClassWithNoSummaryPrinterPlugin.class) + .addDefaultSummaryPrinterIfNotPresent() + .build(); + Plugins plugins = new Plugins(new PluginFactory(), runtimeOptions); + plugins.setEventBusOnEventListenerPlugins(new TimeServiceEventBus(Clock.systemUTC())); + assertPluginExists(plugins.getPlugins(), "io.cucumber.core.plugin.DefaultSummaryPrinter"); + } + + @Test + public void inherit_plugin_from_baseclass() { + RuntimeOptions runtimeOptions = parser().parse(SubClassWithFormatter.class).build(); + Plugins plugins = new Plugins(new PluginFactory(), runtimeOptions); + plugins.setEventBusOnEventListenerPlugins(new TimeServiceEventBus(Clock.systemUTC())); + List pluginList = plugins.getPlugins(); + assertPluginExists(pluginList, "io.cucumber.core.plugin.JSONFormatter"); + assertPluginExists(pluginList, "io.cucumber.core.plugin.PrettyFormatter"); + } + + @Test + public void override_monochrome_flag_from_baseclass() { + RuntimeOptions runtimeOptions = parser().parse(SubClassWithMonoChromeTrue.class).build(); + + assertTrue(runtimeOptions.isMonochrome()); + } + + @Test + public void create_with_junit_options() { + RuntimeOptions runtimeOptions = parser().parse(ClassWithJunitOption.class).build(); + + assertEquals(asList("option1", "option2=value"), runtimeOptions.getJunitOptions()); + } + + private void assertPluginExists(List plugins, String pluginName) { + boolean found = false; + for (Plugin plugin : plugins) { + if (plugin.getClass().getName().equals(pluginName)) { + found = true; + } + } + assertTrue(pluginName + " not found among the plugins", found); + } + + @Test + public void create_with_glue() { + RuntimeOptions runtimeOptions = parser().parse(ClassWithGlue.class).build(); + + assertThat(runtimeOptions.getGlue(), contains(uri("classpath:app/features/user/registration"), uri("classpath:app/features/hooks"))); + } + + @Test + public void create_with_extra_glue() { + RuntimeOptions runtimeOptions = parser().parse(ClassWithExtraGlue.class).build(); + + assertThat(runtimeOptions.getGlue(), contains(uri("classpath:app/features/hooks"), uri("classpath:io/cucumber/core/options"))); + + } + + @Test + public void create_with_extra_glue_in_subclass_of_extra_glue() { + RuntimeOptions runtimeOptions = parser() + .parse(SubClassWithExtraGlueOfExtraGlue.class) + .build(); + + assertThat(runtimeOptions.getGlue(), + contains(uri("classpath:app/features/user/hooks"), uri("classpath:app/features/hooks"), uri("classpath:io/cucumber/core/options"))); + } + + @Test + public void create_with_extra_glue_in_subclass_of_glue() { + RuntimeOptions runtimeOptions = parser().parse(SubClassWithExtraGlueOfGlue.class).build(); + + assertThat(runtimeOptions.getGlue(), contains(uri("classpath:app/features/user/hooks"), uri("classpath:app/features/user/registration"), uri("classpath:app/features/hooks"))); + } + + @Test(expected = CucumberException.class) + public void cannot_create_with_glue_and_extra_glue() { + parser().parse(ClassWithGlueAndExtraGlue.class).build(); + } + + + @CucumberOptions(snippets = SnippetType.CAMELCASE) + private static class Snippets { + // empty + } + + @CucumberOptions(strict = true) + private static class Strict { + // empty + } + + @CucumberOptions + private static class NotStrict { + // empty + } + + @CucumberOptions(name = {"name1", "name2"}) + private static class MultipleNames { + // empty + } + + @CucumberOptions + private static class NoName { + // empty + } + private static class WithoutOptions { + // empty + } + + private static class WithoutOptionsWithBaseClassWithoutOptions extends WithoutOptions { + // empty + } + + @CucumberOptions(plugin = "pretty") + private static class SubClassWithFormatter extends BaseClassWithFormatter { + // empty + } + + @CucumberOptions(plugin = "json:target/test-json-report.json") + private static class BaseClassWithFormatter { + // empty + } + + @CucumberOptions(monochrome = true) + private static class SubClassWithMonoChromeTrue extends BaseClassWithMonoChromeFalse { + // empty + } + + @CucumberOptions(monochrome = false) + private static class BaseClassWithMonoChromeFalse { + // empty + } + + @CucumberOptions(plugin = "io.cucumber.core.plugin.AnyStepDefinitionReporter") + private static class ClassWithNoFormatterPlugin { + // empty + } + + @CucumberOptions(plugin = "pretty") + private static class ClassWithNoSummaryPrinterPlugin { + // empty + } + + @CucumberOptions(junit = {"option1", "option2=value"}) + private static class ClassWithJunitOption { + // empty + } + + @CucumberOptions(glue = {"app.features.user.registration", "app.features.hooks"}) + private static class ClassWithGlue { + // empty + } + + @CucumberOptions(extraGlue = {"app.features.hooks"}) + private static class ClassWithExtraGlue { + // empty + } + + @CucumberOptions(extraGlue = {"app.features.user.hooks"}) + private static class SubClassWithExtraGlueOfExtraGlue extends ClassWithExtraGlue { + // empty + } + + @CucumberOptions(extraGlue = {"app.features.user.hooks"}) + private static class SubClassWithExtraGlueOfGlue extends ClassWithGlue { + // empty + } + + @CucumberOptions(extraGlue = {"app.features.hooks"}, glue = {"app.features.user.registration"}) + private static class ClassWithGlueAndExtraGlue { + // empty + } + + + private static class CoreCucumberOptions implements CucumberOptionsAnnotationParser.CucumberOptions { + private final CucumberOptions annotation; + + CoreCucumberOptions(CucumberOptions annotation) { + this.annotation = annotation; + } + + @Override + public boolean dryRun() { + return annotation.dryRun(); + } + + @Override + public boolean strict() { + return annotation.strict(); + } + + @Override + public String[] features() { + return annotation.features(); + } + + @Override + public String[] glue() { + return annotation.glue(); + } + + @Override + public String[] extraGlue() { + return annotation.extraGlue(); + } + + @Override + public String[] tags() { + return annotation.tags(); + } + + @Override + public String[] plugin() { + return annotation.plugin(); + } + + @Override + public boolean monochrome() { + return annotation.monochrome(); + } + + @Override + public String[] name() { + return annotation.name(); + } + + @Override + public SnippetType snippets() { + return annotation.snippets(); + } + + @Override + public String[] junit() { + return annotation.junit(); + } + } + + private static class CoreCucumberOptionsProvider implements CucumberOptionsAnnotationParser.OptionsProvider { + @Override + public CucumberOptionsAnnotationParser.CucumberOptions getOptions(Class clazz) { + final CucumberOptions annotation = clazz.getAnnotation(CucumberOptions.class); + if (annotation == null) { + return null; + } + return new CoreCucumberOptions(annotation); + } + } +} diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index cb08b0a91d..984a79ee78 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -58,6 +58,7 @@ import static java.time.Duration.ZERO; import static java.util.Collections.singletonList; import static java.util.concurrent.TimeUnit.HOURS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; import static org.hamcrest.CoreMatchers.equalTo; @@ -540,7 +541,7 @@ public void run() { }); thread.start(); do { - SECONDS.sleep(5); + MILLISECONDS.sleep(1); } while (!threadBlocked.get()); thread.interrupt(); MINUTES.timedJoin(thread, 1); diff --git a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCucumberTest.java b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCucumberTest.java index 9851fa0f45..924c3f912e 100644 --- a/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCucumberTest.java +++ b/examples/spring-txn/src/test/java/io/cucumber/examples/spring/txn/RunCucumberTest.java @@ -1,7 +1,7 @@ package io.cucumber.examples.spring.txn; -import io.cucumber.core.api.options.CucumberOptions; import io.cucumber.junit.Cucumber; +import io.cucumber.junit.CucumberOptions; import org.junit.runner.RunWith; @RunWith(Cucumber.class) diff --git a/junit/src/main/java/io/cucumber/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java index c3412c9a5f..a64c88d325 100644 --- a/junit/src/main/java/io/cucumber/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java @@ -1,7 +1,6 @@ package io.cucumber.junit; import io.cucumber.core.api.event.TestSourceRead; -import io.cucumber.core.api.options.CucumberOptions; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.backend.ObjectFactorySupplier; diff --git a/junit/src/test/java/io/cucumber/junit/CucumberTest.java b/junit/src/test/java/io/cucumber/junit/CucumberTest.java index 8dbdc31785..abe6d50732 100644 --- a/junit/src/test/java/io/cucumber/junit/CucumberTest.java +++ b/junit/src/test/java/io/cucumber/junit/CucumberTest.java @@ -1,7 +1,6 @@ package io.cucumber.junit; import gherkin.ParserException.CompositeParserException; -import io.cucumber.core.api.options.CucumberOptions; import io.cucumber.core.exception.CucumberException; import org.junit.After; import org.junit.Before; diff --git a/junit/src/test/java/io/cucumber/junit/InvokeMethodsAroundEventsTest.java b/junit/src/test/java/io/cucumber/junit/InvokeMethodsAroundEventsTest.java index 89d4237b30..3822a6c13c 100644 --- a/junit/src/test/java/io/cucumber/junit/InvokeMethodsAroundEventsTest.java +++ b/junit/src/test/java/io/cucumber/junit/InvokeMethodsAroundEventsTest.java @@ -4,7 +4,6 @@ import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; -import io.cucumber.core.api.options.CucumberOptions; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/testng/src/test/java/io/cucumber/testng/TestNGCucumberRunnerTest.java b/testng/src/test/java/io/cucumber/testng/TestNGCucumberRunnerTest.java index 3e45e824d5..8c6de1c916 100644 --- a/testng/src/test/java/io/cucumber/testng/TestNGCucumberRunnerTest.java +++ b/testng/src/test/java/io/cucumber/testng/TestNGCucumberRunnerTest.java @@ -1,6 +1,5 @@ package io.cucumber.testng; -import io.cucumber.core.api.options.CucumberOptions; import io.cucumber.core.exception.CucumberException; import org.testng.Assert; import org.testng.annotations.BeforeMethod; From 65a603119685234c992171eefe425b19f196292b Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 23 Jun 2019 12:03:41 +0200 Subject: [PATCH 095/155] [Core] Remove cycles between packages --- .../core/api/event/StepDefinedEvent.java | 2 - .../core/api/event/StepDefinition.java | 23 +++++++++++ .../cucumber/core/backend/StepDefinition.java | 22 +---------- .../{model => feature}/CucumberFeature.java | 2 +- .../core/{model => feature}/Encoding.java | 2 +- .../{model => feature}/FeatureBuilder.java | 2 +- .../{model => feature}/FeatureIdentifier.java | 2 +- .../{model => feature}/FeatureLoader.java | 2 +- .../{model => feature}/FeatureParser.java | 2 +- .../core/{model => feature}/FeaturePath.java | 6 +-- .../{model => feature}/FeatureWithLines.java | 2 +- .../core/{model => feature}/GluePath.java | 7 ++-- .../core/{runtime => feature}/Options.java | 2 +- .../core/{model => feature}/RerunLoader.java | 2 +- .../core/{model => io}/Classpath.java | 4 +- .../core/io/ClasspathResourceIterable.java | 2 +- .../io/cucumber/core/io/FileResource.java | 2 +- .../java/io/cucumber/core/io/MultiLoader.java | 2 +- .../core/io/ResourceLoaderClassFinder.java | 2 - .../java/io/cucumber/core/io/ZipResource.java | 2 +- .../options/CommandlineOptionsParser.java | 2 +- .../CucumberOptionsAnnotationParser.java | 10 ++--- .../options/EnvironmentOptionsParser.java | 2 +- .../cucumber/core/options/RuntimeOptions.java | 2 +- .../core/options/RuntimeOptionsBuilder.java | 2 +- .../core/options/RuntimeOptionsParser.java | 8 ++-- .../java/io/cucumber/core/plugin/Plugins.java | 5 +-- .../cucumber/core/plugin/RerunFormatter.java | 2 +- .../io/cucumber/core/runner/CachingGlue.java | 1 - .../{runtime => runner}/ScenarioScoped.java | 2 +- .../runtime/FeaturePathFeatureSupplier.java | 5 ++- .../core/runtime/FeatureSupplier.java | 2 +- .../io/cucumber/core/runtime/Runtime.java | 6 +-- .../CucumberFeatureTest.java | 2 +- .../core/{model => feature}/EncodingTest.java | 6 +-- .../FeatureBuilderTest.java | 2 +- .../FeatureIdentifierTest.java | 2 +- .../{model => feature}/FeaturePathTest.java | 2 +- .../FeatureWithLinesTest.java | 2 +- .../core/{model => feature}/GluePathTest.java | 2 +- .../cucumber/core/io/ResourceLoaderTest.java | 2 +- .../core/options/CucumberOptions.java | 4 +- .../core/plugin/HTMLFormatterTest.java | 2 +- .../core/plugin/JSONFormatterTest.java | 2 +- .../core/plugin/JUnitFormatterTest.java | 2 +- .../core/plugin/PrettyFormatterTest.java | 2 +- .../core/plugin/RerunFormatterTest.java | 2 +- .../core/plugin/TestNGFormatterTest.java | 2 +- .../core/plugin/TimelineFormatterTest.java | 2 +- .../plugin/UndefinedStepsTrackerTest.java | 2 +- .../cucumber/core/runner/CachingGlueTest.java | 1 - .../io/cucumber/core/runner/TestHelper.java | 6 +-- .../FeaturePathFeatureSupplierTest.java | 5 ++- .../io/cucumber/core/runtime/RuntimeTest.java | 38 ++++++++++--------- .../core/runtime/TestFeatureSupplier.java | 2 +- .../UTF_8_BOM_Encoded.feature | 0 .../{model => feature}/UTF_8_Encoded.feature | 0 .../cucumber/java8/Java8HookDefinition.java | 2 +- .../cucumber/java8/Java8StepDefinition.java | 2 +- .../main/java/io/cucumber/junit/Cucumber.java | 4 +- .../io/cucumber/junit/CucumberOptions.java | 4 +- .../java/io/cucumber/junit/FeatureRunner.java | 2 +- .../io/cucumber/junit/FeatureRunnerTest.java | 5 +-- .../PickleRunnerWithStepDescriptionsTest.java | 3 +- .../io/cucumber/junit/TestPickleBuilder.java | 4 +- .../testng/CucumberFeatureWrapperImpl.java | 2 +- .../io/cucumber/testng/CucumberOptions.java | 4 +- .../cucumber/testng/TestNGCucumberRunner.java | 4 +- 68 files changed, 134 insertions(+), 135 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/api/event/StepDefinition.java rename core/src/main/java/io/cucumber/core/{model => feature}/CucumberFeature.java (97%) rename core/src/main/java/io/cucumber/core/{model => feature}/Encoding.java (98%) rename core/src/main/java/io/cucumber/core/{model => feature}/FeatureBuilder.java (97%) rename core/src/main/java/io/cucumber/core/{model => feature}/FeatureIdentifier.java (96%) rename core/src/main/java/io/cucumber/core/{model => feature}/FeatureLoader.java (97%) rename core/src/main/java/io/cucumber/core/{model => feature}/FeatureParser.java (98%) rename core/src/main/java/io/cucumber/core/{model => feature}/FeaturePath.java (95%) rename core/src/main/java/io/cucumber/core/{model => feature}/FeatureWithLines.java (99%) rename core/src/main/java/io/cucumber/core/{model => feature}/GluePath.java (95%) rename core/src/main/java/io/cucumber/core/{runtime => feature}/Options.java (76%) rename core/src/main/java/io/cucumber/core/{model => feature}/RerunLoader.java (98%) rename core/src/main/java/io/cucumber/core/{model => io}/Classpath.java (90%) rename core/src/main/java/io/cucumber/core/{runtime => runner}/ScenarioScoped.java (82%) rename core/src/test/java/io/cucumber/core/{model => feature}/CucumberFeatureTest.java (98%) rename core/src/test/java/io/cucumber/core/{model => feature}/EncodingTest.java (84%) rename core/src/test/java/io/cucumber/core/{model => feature}/FeatureBuilderTest.java (98%) rename core/src/test/java/io/cucumber/core/{model => feature}/FeatureIdentifierTest.java (96%) rename core/src/test/java/io/cucumber/core/{model => feature}/FeaturePathTest.java (99%) rename core/src/test/java/io/cucumber/core/{model => feature}/FeatureWithLinesTest.java (97%) rename core/src/test/java/io/cucumber/core/{model => feature}/GluePathTest.java (98%) rename core/src/test/resources/io/cucumber/core/{model => feature}/UTF_8_BOM_Encoded.feature (100%) rename core/src/test/resources/io/cucumber/core/{model => feature}/UTF_8_Encoded.feature (100%) diff --git a/core/src/main/java/io/cucumber/core/api/event/StepDefinedEvent.java b/core/src/main/java/io/cucumber/core/api/event/StepDefinedEvent.java index 145e6966fe..f3b5f8fd80 100644 --- a/core/src/main/java/io/cucumber/core/api/event/StepDefinedEvent.java +++ b/core/src/main/java/io/cucumber/core/api/event/StepDefinedEvent.java @@ -1,8 +1,6 @@ package io.cucumber.core.api.event; -import io.cucumber.core.backend.StepDefinition; - import java.time.Instant; public class StepDefinedEvent extends TimeStampedEvent { diff --git a/core/src/main/java/io/cucumber/core/api/event/StepDefinition.java b/core/src/main/java/io/cucumber/core/api/event/StepDefinition.java new file mode 100644 index 0000000000..c2f69dcb58 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/api/event/StepDefinition.java @@ -0,0 +1,23 @@ +package io.cucumber.core.api.event; + +public interface StepDefinition { + + /** + * The source line where the step definition is defined. + * Example: foo/bar/Zap.brainfuck:42 + * + * @param detail true if extra detailed location information should be included. + * @return The source line of the step definition. + */ + String getLocation(boolean detail); + + /** + * @return How many declared parameters this step definition has. Returns null if unknown. + */ + Integer getParameterCount(); + + /** + * @return the pattern associated with this instance. Used for error reporting only. + */ + String getPattern(); +} diff --git a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java index 2cc2b48d57..feb8f88cb6 100644 --- a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java @@ -5,7 +5,7 @@ import java.util.List; -public interface StepDefinition { +public interface StepDefinition extends io.cucumber.core.api.event.StepDefinition { /** * Returns a list of arguments. Return null if the step definition * doesn't match at all. Return an empty List if it matches with 0 arguments @@ -16,26 +16,12 @@ public interface StepDefinition { */ List matchedArguments(PickleStep step); - /** - * The source line where the step definition is defined. - * Example: foo/bar/Zap.brainfuck:42 - * - * @param detail true if extra detailed location information should be included. - * @return The source line of the step definition. - */ - String getLocation(boolean detail); - - /** - * @return How many declared parameters this step definition has. Returns null if unknown. - */ - Integer getParameterCount(); - /** * Invokes the step definition. The method should raise a Throwable * if the invocation fails, which will cause the step to fail. * * @param args The arguments for the step - * @throws The throwable in case of step failure. + * @throws Throwable in case of step failure. */ void execute(Object[] args) throws Throwable; @@ -46,8 +32,4 @@ public interface StepDefinition { */ boolean isDefinedAt(StackTraceElement stackTraceElement); // TODO: redundant with getLocation? - /** - * @return the pattern associated with this instance. Used for error reporting only. - */ - String getPattern(); } diff --git a/core/src/main/java/io/cucumber/core/model/CucumberFeature.java b/core/src/main/java/io/cucumber/core/feature/CucumberFeature.java similarity index 97% rename from core/src/main/java/io/cucumber/core/model/CucumberFeature.java rename to core/src/main/java/io/cucumber/core/feature/CucumberFeature.java index 7029ec03bd..a51e79f412 100644 --- a/core/src/main/java/io/cucumber/core/model/CucumberFeature.java +++ b/core/src/main/java/io/cucumber/core/feature/CucumberFeature.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import gherkin.ast.GherkinDocument; import gherkin.events.PickleEvent; diff --git a/core/src/main/java/io/cucumber/core/model/Encoding.java b/core/src/main/java/io/cucumber/core/feature/Encoding.java similarity index 98% rename from core/src/main/java/io/cucumber/core/model/Encoding.java rename to core/src/main/java/io/cucumber/core/feature/Encoding.java index 2538b0124a..fe855e5126 100644 --- a/core/src/main/java/io/cucumber/core/model/Encoding.java +++ b/core/src/main/java/io/cucumber/core/feature/Encoding.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import io.cucumber.core.io.Resource; import io.cucumber.core.util.FixJava; diff --git a/core/src/main/java/io/cucumber/core/model/FeatureBuilder.java b/core/src/main/java/io/cucumber/core/feature/FeatureBuilder.java similarity index 97% rename from core/src/main/java/io/cucumber/core/model/FeatureBuilder.java rename to core/src/main/java/io/cucumber/core/feature/FeatureBuilder.java index 4d079ce81a..b128ea6f5f 100644 --- a/core/src/main/java/io/cucumber/core/model/FeatureBuilder.java +++ b/core/src/main/java/io/cucumber/core/feature/FeatureBuilder.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import io.cucumber.core.io.Resource; import io.cucumber.core.logging.Logger; diff --git a/core/src/main/java/io/cucumber/core/model/FeatureIdentifier.java b/core/src/main/java/io/cucumber/core/feature/FeatureIdentifier.java similarity index 96% rename from core/src/main/java/io/cucumber/core/model/FeatureIdentifier.java rename to core/src/main/java/io/cucumber/core/feature/FeatureIdentifier.java index 5f3b4a1cb4..9d782ba67c 100644 --- a/core/src/main/java/io/cucumber/core/model/FeatureIdentifier.java +++ b/core/src/main/java/io/cucumber/core/feature/FeatureIdentifier.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import java.net.URI; /** diff --git a/core/src/main/java/io/cucumber/core/model/FeatureLoader.java b/core/src/main/java/io/cucumber/core/feature/FeatureLoader.java similarity index 97% rename from core/src/main/java/io/cucumber/core/model/FeatureLoader.java rename to core/src/main/java/io/cucumber/core/feature/FeatureLoader.java index 7e250007c0..1f0636ab40 100644 --- a/core/src/main/java/io/cucumber/core/model/FeatureLoader.java +++ b/core/src/main/java/io/cucumber/core/feature/FeatureLoader.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; diff --git a/core/src/main/java/io/cucumber/core/model/FeatureParser.java b/core/src/main/java/io/cucumber/core/feature/FeatureParser.java similarity index 98% rename from core/src/main/java/io/cucumber/core/model/FeatureParser.java rename to core/src/main/java/io/cucumber/core/feature/FeatureParser.java index a81fb6909e..8173f4ec43 100644 --- a/core/src/main/java/io/cucumber/core/model/FeatureParser.java +++ b/core/src/main/java/io/cucumber/core/feature/FeatureParser.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import gherkin.AstBuilder; import gherkin.Parser; diff --git a/core/src/main/java/io/cucumber/core/model/FeaturePath.java b/core/src/main/java/io/cucumber/core/feature/FeaturePath.java similarity index 95% rename from core/src/main/java/io/cucumber/core/model/FeaturePath.java rename to core/src/main/java/io/cucumber/core/feature/FeaturePath.java index 294411898c..24824d6e19 100644 --- a/core/src/main/java/io/cucumber/core/model/FeaturePath.java +++ b/core/src/main/java/io/cucumber/core/feature/FeaturePath.java @@ -1,12 +1,12 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import java.io.File; import java.net.URI; import java.net.URISyntaxException; import java.util.Locale; -import static io.cucumber.core.model.Classpath.CLASSPATH_SCHEME; -import static io.cucumber.core.model.Classpath.CLASSPATH_SCHEME_PREFIX; +import static io.cucumber.core.io.Classpath.CLASSPATH_SCHEME; +import static io.cucumber.core.io.Classpath.CLASSPATH_SCHEME_PREFIX; import static java.util.Objects.requireNonNull; /** diff --git a/core/src/main/java/io/cucumber/core/model/FeatureWithLines.java b/core/src/main/java/io/cucumber/core/feature/FeatureWithLines.java similarity index 99% rename from core/src/main/java/io/cucumber/core/model/FeatureWithLines.java rename to core/src/main/java/io/cucumber/core/feature/FeatureWithLines.java index 37ac819580..021d3037ab 100644 --- a/core/src/main/java/io/cucumber/core/model/FeatureWithLines.java +++ b/core/src/main/java/io/cucumber/core/feature/FeatureWithLines.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import java.io.Serializable; import java.net.URI; diff --git a/core/src/main/java/io/cucumber/core/model/GluePath.java b/core/src/main/java/io/cucumber/core/feature/GluePath.java similarity index 95% rename from core/src/main/java/io/cucumber/core/model/GluePath.java rename to core/src/main/java/io/cucumber/core/feature/GluePath.java index 2e13c30f13..1314fe8c66 100644 --- a/core/src/main/java/io/cucumber/core/model/GluePath.java +++ b/core/src/main/java/io/cucumber/core/feature/GluePath.java @@ -1,11 +1,9 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import java.io.File; import java.net.URI; import java.net.URISyntaxException; -import static io.cucumber.core.model.Classpath.CLASSPATH_SCHEME; -import static io.cucumber.core.model.Classpath.CLASSPATH_SCHEME_PREFIX; import static java.lang.Character.isJavaIdentifierPart; import static java.lang.Character.isJavaIdentifierStart; import static java.util.Objects.requireNonNull; @@ -24,6 +22,9 @@ */ public class GluePath { + private static final String CLASSPATH_SCHEME = "classpath"; + private static final String CLASSPATH_SCHEME_PREFIX = CLASSPATH_SCHEME + ":"; + private GluePath(){ } diff --git a/core/src/main/java/io/cucumber/core/runtime/Options.java b/core/src/main/java/io/cucumber/core/feature/Options.java similarity index 76% rename from core/src/main/java/io/cucumber/core/runtime/Options.java rename to core/src/main/java/io/cucumber/core/feature/Options.java index 91a829facb..eeb5fc29c9 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Options.java +++ b/core/src/main/java/io/cucumber/core/feature/Options.java @@ -1,4 +1,4 @@ -package io.cucumber.core.runtime; +package io.cucumber.core.feature; import java.net.URI; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/model/RerunLoader.java b/core/src/main/java/io/cucumber/core/feature/RerunLoader.java similarity index 98% rename from core/src/main/java/io/cucumber/core/model/RerunLoader.java rename to core/src/main/java/io/cucumber/core/feature/RerunLoader.java index 1814431ee4..1dc9152a4e 100644 --- a/core/src/main/java/io/cucumber/core/model/RerunLoader.java +++ b/core/src/main/java/io/cucumber/core/feature/RerunLoader.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.Resource; diff --git a/core/src/main/java/io/cucumber/core/model/Classpath.java b/core/src/main/java/io/cucumber/core/io/Classpath.java similarity index 90% rename from core/src/main/java/io/cucumber/core/model/Classpath.java rename to core/src/main/java/io/cucumber/core/io/Classpath.java index 986bacef8b..1ab1999d4d 100644 --- a/core/src/main/java/io/cucumber/core/model/Classpath.java +++ b/core/src/main/java/io/cucumber/core/io/Classpath.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.io; import java.net.URI; @@ -17,7 +17,7 @@ private Classpath() { * @param uri to resource * @return resource name */ - public static String resourceName(URI uri) { + static String resourceName(URI uri) { if (!CLASSPATH_SCHEME.equals(uri.getScheme())) { throw new IllegalArgumentException("uri must have classpath scheme " + uri); } diff --git a/core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java b/core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java index 9d10e45737..d13b3ae9a1 100644 --- a/core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java +++ b/core/src/main/java/io/cucumber/core/io/ClasspathResourceIterable.java @@ -9,7 +9,7 @@ import java.util.Enumeration; import java.util.Iterator; -import static io.cucumber.core.model.Classpath.resourceName; +import static io.cucumber.core.io.Classpath.resourceName; final class ClasspathResourceIterable implements Iterable { diff --git a/core/src/main/java/io/cucumber/core/io/FileResource.java b/core/src/main/java/io/cucumber/core/io/FileResource.java index 6bc7c41891..2c6cb5c065 100644 --- a/core/src/main/java/io/cucumber/core/io/FileResource.java +++ b/core/src/main/java/io/cucumber/core/io/FileResource.java @@ -8,7 +8,7 @@ import java.net.URISyntaxException; import static io.cucumber.core.io.MultiLoader.FILE_SCHEME; -import static io.cucumber.core.model.Classpath.CLASSPATH_SCHEME; +import static io.cucumber.core.io.Classpath.CLASSPATH_SCHEME; final class FileResource implements Resource { diff --git a/core/src/main/java/io/cucumber/core/io/MultiLoader.java b/core/src/main/java/io/cucumber/core/io/MultiLoader.java index 9a28e03938..cee8cebf9c 100644 --- a/core/src/main/java/io/cucumber/core/io/MultiLoader.java +++ b/core/src/main/java/io/cucumber/core/io/MultiLoader.java @@ -2,7 +2,7 @@ import java.net.URI; -import static io.cucumber.core.model.Classpath.CLASSPATH_SCHEME; +import static io.cucumber.core.io.Classpath.CLASSPATH_SCHEME; public final class MultiLoader implements ResourceLoader { static final String FILE_SCHEME = "file"; diff --git a/core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java b/core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java index 87e10aca44..37d0eea084 100644 --- a/core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java +++ b/core/src/main/java/io/cucumber/core/io/ResourceLoaderClassFinder.java @@ -1,7 +1,5 @@ package io.cucumber.core.io; -import io.cucumber.core.model.Classpath; - import java.net.URI; import java.util.Collection; import java.util.HashSet; diff --git a/core/src/main/java/io/cucumber/core/io/ZipResource.java b/core/src/main/java/io/cucumber/core/io/ZipResource.java index 0d218fa8c6..b6563bc8f1 100644 --- a/core/src/main/java/io/cucumber/core/io/ZipResource.java +++ b/core/src/main/java/io/cucumber/core/io/ZipResource.java @@ -7,7 +7,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import static io.cucumber.core.model.Classpath.CLASSPATH_SCHEME; +import static io.cucumber.core.io.Classpath.CLASSPATH_SCHEME; final class ZipResource implements Resource { private final ZipFile jarFile; diff --git a/core/src/main/java/io/cucumber/core/options/CommandlineOptionsParser.java b/core/src/main/java/io/cucumber/core/options/CommandlineOptionsParser.java index 35f96ab1f1..213bfbb39d 100644 --- a/core/src/main/java/io/cucumber/core/options/CommandlineOptionsParser.java +++ b/core/src/main/java/io/cucumber/core/options/CommandlineOptionsParser.java @@ -2,7 +2,7 @@ import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.model.RerunLoader; +import io.cucumber.core.feature.RerunLoader; import java.util.Arrays; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java b/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java index cb25d57580..3985912cbf 100644 --- a/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java +++ b/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java @@ -4,11 +4,11 @@ import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.model.Classpath; -import io.cucumber.core.model.FeaturePath; -import io.cucumber.core.model.FeatureWithLines; -import io.cucumber.core.model.GluePath; -import io.cucumber.core.model.RerunLoader; +import io.cucumber.core.io.Classpath; +import io.cucumber.core.feature.FeaturePath; +import io.cucumber.core.feature.FeatureWithLines; +import io.cucumber.core.feature.GluePath; +import io.cucumber.core.feature.RerunLoader; import java.net.URI; import java.util.regex.Pattern; diff --git a/core/src/main/java/io/cucumber/core/options/EnvironmentOptionsParser.java b/core/src/main/java/io/cucumber/core/options/EnvironmentOptionsParser.java index 5873417b07..767bb6239e 100644 --- a/core/src/main/java/io/cucumber/core/options/EnvironmentOptionsParser.java +++ b/core/src/main/java/io/cucumber/core/options/EnvironmentOptionsParser.java @@ -2,7 +2,7 @@ import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.model.RerunLoader; +import io.cucumber.core.feature.RerunLoader; import java.util.Collections; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 00c776e5cd..1995e1653b 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -18,7 +18,7 @@ import static java.util.Collections.unmodifiableMap; public final class RuntimeOptions implements - io.cucumber.core.runtime.Options, + io.cucumber.core.feature.Options, io.cucumber.core.runner.Options, io.cucumber.core.plugin.Options, io.cucumber.core.filter.Options { diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsBuilder.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsBuilder.java index 795c625a11..d5ff0460f8 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsBuilder.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsBuilder.java @@ -2,7 +2,7 @@ import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.model.FeatureWithLines; +import io.cucumber.core.feature.FeatureWithLines; import io.cucumber.core.order.PickleOrder; import io.cucumber.core.plugin.Options; diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java index c79d1435ec..5bd1d34e05 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java @@ -7,10 +7,10 @@ import io.cucumber.core.exception.CucumberException; import io.cucumber.core.logging.Logger; import io.cucumber.core.logging.LoggerFactory; -import io.cucumber.core.model.FeaturePath; -import io.cucumber.core.model.FeatureWithLines; -import io.cucumber.core.model.GluePath; -import io.cucumber.core.model.RerunLoader; +import io.cucumber.core.feature.FeaturePath; +import io.cucumber.core.feature.FeatureWithLines; +import io.cucumber.core.feature.GluePath; +import io.cucumber.core.feature.RerunLoader; import io.cucumber.core.order.PickleOrder; import io.cucumber.core.order.StandardPickleOrders; import io.cucumber.core.util.FixJava; diff --git a/core/src/main/java/io/cucumber/core/plugin/Plugins.java b/core/src/main/java/io/cucumber/core/plugin/Plugins.java index 0a879986dd..cb55c37467 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Plugins.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugins.java @@ -8,7 +8,6 @@ import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.plugin.ColorAware; import io.cucumber.core.api.plugin.StrictAware; -import io.cucumber.core.options.RuntimeOptions; import java.util.ArrayList; import java.util.List; @@ -19,9 +18,9 @@ public final class Plugins { private final PluginFactory pluginFactory; private EventPublisher orderedEventPublisher; - private final RuntimeOptions pluginOptions; + private final Options pluginOptions; - public Plugins(PluginFactory pluginFactory, RuntimeOptions pluginOptions) { + public Plugins(PluginFactory pluginFactory, Options pluginOptions) { this.pluginFactory = pluginFactory; this.pluginOptions = pluginOptions; this.plugins = createPlugins(); diff --git a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java index 6e3ca57fb3..26bb8980c4 100644 --- a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java @@ -7,7 +7,7 @@ import io.cucumber.core.api.event.TestCaseFinished; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.plugin.StrictAware; -import io.cucumber.core.model.FeatureWithLines; +import io.cucumber.core.feature.FeatureWithLines; import java.util.ArrayList; import java.util.Collection; diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 6f093f3d02..d6d1a446b8 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -6,7 +6,6 @@ import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.event.EventBus; -import io.cucumber.core.runtime.ScenarioScoped; import io.cucumber.core.stepexpression.Argument; import gherkin.pickles.PickleStep; diff --git a/core/src/main/java/io/cucumber/core/runtime/ScenarioScoped.java b/core/src/main/java/io/cucumber/core/runner/ScenarioScoped.java similarity index 82% rename from core/src/main/java/io/cucumber/core/runtime/ScenarioScoped.java rename to core/src/main/java/io/cucumber/core/runner/ScenarioScoped.java index 950bf8e59e..f0c27adcef 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ScenarioScoped.java +++ b/core/src/main/java/io/cucumber/core/runner/ScenarioScoped.java @@ -1,4 +1,4 @@ -package io.cucumber.core.runtime; +package io.cucumber.core.runner; public interface ScenarioScoped { /** diff --git a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java index 94186b4e0f..e925d234e6 100644 --- a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java @@ -2,8 +2,9 @@ import io.cucumber.core.logging.Logger; import io.cucumber.core.logging.LoggerFactory; -import io.cucumber.core.model.CucumberFeature; -import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.feature.CucumberFeature; +import io.cucumber.core.feature.FeatureLoader; +import io.cucumber.core.feature.Options; import io.cucumber.core.util.FixJava; import java.net.URI; diff --git a/core/src/main/java/io/cucumber/core/runtime/FeatureSupplier.java b/core/src/main/java/io/cucumber/core/runtime/FeatureSupplier.java index 8d4ec971d4..4b1cc58fcd 100644 --- a/core/src/main/java/io/cucumber/core/runtime/FeatureSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/FeatureSupplier.java @@ -1,6 +1,6 @@ package io.cucumber.core.runtime; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 32bf2da7de..8602b12aa2 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -22,9 +22,8 @@ import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.model.CucumberFeature; -import io.cucumber.core.model.FeatureLoader; -import io.cucumber.core.options.Env; +import io.cucumber.core.feature.CucumberFeature; +import io.cucumber.core.feature.FeatureLoader; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.order.PickleOrder; import io.cucumber.core.plugin.PluginFactory; @@ -32,7 +31,6 @@ import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.logging.Logger; import io.cucumber.core.logging.LoggerFactory; -import io.cucumber.core.options.RuntimeOptions; import java.util.ArrayList; import java.util.Arrays; diff --git a/core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java b/core/src/test/java/io/cucumber/core/feature/CucumberFeatureTest.java similarity index 98% rename from core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java rename to core/src/test/java/io/cucumber/core/feature/CucumberFeatureTest.java index e554632325..09c8ff0858 100644 --- a/core/src/test/java/io/cucumber/core/model/CucumberFeatureTest.java +++ b/core/src/test/java/io/cucumber/core/feature/CucumberFeatureTest.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import io.cucumber.core.io.ResourceLoader; import org.junit.Rule; diff --git a/core/src/test/java/io/cucumber/core/model/EncodingTest.java b/core/src/test/java/io/cucumber/core/feature/EncodingTest.java similarity index 84% rename from core/src/test/java/io/cucumber/core/model/EncodingTest.java rename to core/src/test/java/io/cucumber/core/feature/EncodingTest.java index 7cba389794..88b710130c 100644 --- a/core/src/test/java/io/cucumber/core/model/EncodingTest.java +++ b/core/src/test/java/io/cucumber/core/feature/EncodingTest.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import static org.junit.Assert.assertFalse; import static org.mockito.Mockito.when; @@ -23,13 +23,13 @@ public class EncodingTest { @Test public void test_utf8_bom_encode() throws RuntimeException, IOException { - when(resource.getInputStream()).thenReturn(new FileInputStream("src/test/resources/io/cucumber/core/model/UTF_8_BOM_Encoded.feature")); + when(resource.getInputStream()).thenReturn(new FileInputStream("src/test/resources/io/cucumber/core/feature/UTF_8_BOM_Encoded.feature")); assertFalse("UTF-8 BOM encoding not removed.", Encoding.readFile(resource).startsWith("\uFEFF")); } @Test public void test_utf8_encode() throws RuntimeException, IOException { - when(resource.getInputStream()).thenReturn(new FileInputStream("src/test/resources/io/cucumber/core/model/UTF_8_Encoded.feature")); + when(resource.getInputStream()).thenReturn(new FileInputStream("src/test/resources/io/cucumber/core/feature/UTF_8_Encoded.feature")); assertFalse("UTF-8 BOM encoding should not be present.", Encoding.readFile(resource).startsWith("\uFEFF")); } } \ No newline at end of file diff --git a/core/src/test/java/io/cucumber/core/model/FeatureBuilderTest.java b/core/src/test/java/io/cucumber/core/feature/FeatureBuilderTest.java similarity index 98% rename from core/src/test/java/io/cucumber/core/model/FeatureBuilderTest.java rename to core/src/test/java/io/cucumber/core/feature/FeatureBuilderTest.java index db96a6a748..3b72bfb42d 100644 --- a/core/src/test/java/io/cucumber/core/model/FeatureBuilderTest.java +++ b/core/src/test/java/io/cucumber/core/feature/FeatureBuilderTest.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import io.cucumber.core.io.Resource; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/model/FeatureIdentifierTest.java b/core/src/test/java/io/cucumber/core/feature/FeatureIdentifierTest.java similarity index 96% rename from core/src/test/java/io/cucumber/core/model/FeatureIdentifierTest.java rename to core/src/test/java/io/cucumber/core/feature/FeatureIdentifierTest.java index a603afb9b6..86953d7a60 100644 --- a/core/src/test/java/io/cucumber/core/model/FeatureIdentifierTest.java +++ b/core/src/test/java/io/cucumber/core/feature/FeatureIdentifierTest.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import org.junit.Rule; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/model/FeaturePathTest.java b/core/src/test/java/io/cucumber/core/feature/FeaturePathTest.java similarity index 99% rename from core/src/test/java/io/cucumber/core/model/FeaturePathTest.java rename to core/src/test/java/io/cucumber/core/feature/FeaturePathTest.java index b928fe0d8a..57e0762a8e 100644 --- a/core/src/test/java/io/cucumber/core/model/FeaturePathTest.java +++ b/core/src/test/java/io/cucumber/core/feature/FeaturePathTest.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import org.hamcrest.CustomTypeSafeMatcher; import org.hamcrest.Matcher; diff --git a/core/src/test/java/io/cucumber/core/model/FeatureWithLinesTest.java b/core/src/test/java/io/cucumber/core/feature/FeatureWithLinesTest.java similarity index 97% rename from core/src/test/java/io/cucumber/core/model/FeatureWithLinesTest.java rename to core/src/test/java/io/cucumber/core/feature/FeatureWithLinesTest.java index 2de3649efe..30ffd220cf 100644 --- a/core/src/test/java/io/cucumber/core/model/FeatureWithLinesTest.java +++ b/core/src/test/java/io/cucumber/core/feature/FeatureWithLinesTest.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/model/GluePathTest.java b/core/src/test/java/io/cucumber/core/feature/GluePathTest.java similarity index 98% rename from core/src/test/java/io/cucumber/core/model/GluePathTest.java rename to core/src/test/java/io/cucumber/core/feature/GluePathTest.java index 1f43b9472e..e0abda8b98 100644 --- a/core/src/test/java/io/cucumber/core/model/GluePathTest.java +++ b/core/src/test/java/io/cucumber/core/feature/GluePathTest.java @@ -1,4 +1,4 @@ -package io.cucumber.core.model; +package io.cucumber.core.feature; import org.junit.Rule; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java b/core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java index 8fe13ebcb7..750334569d 100644 --- a/core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java +++ b/core/src/test/java/io/cucumber/core/io/ResourceLoaderTest.java @@ -1,6 +1,6 @@ package io.cucumber.core.io; -import io.cucumber.core.model.FeaturePath; +import io.cucumber.core.feature.FeaturePath; import org.junit.Test; import java.net.URI; diff --git a/core/src/test/java/io/cucumber/core/options/CucumberOptions.java b/core/src/test/java/io/cucumber/core/options/CucumberOptions.java index a66195a759..d5c695c3b5 100644 --- a/core/src/test/java/io/cucumber/core/options/CucumberOptions.java +++ b/core/src/test/java/io/cucumber/core/options/CucumberOptions.java @@ -38,7 +38,7 @@ * class. For example, if the annotated class is {@code com.example.RunCucumber} * then features are assumed to be located in {@code classpath:com/example}. * - * @see io.cucumber.core.model.FeatureWithLines + * @see io.cucumber.core.feature.FeatureWithLines * @return The location(s) of the features. */ String[] features() default {}; @@ -51,7 +51,7 @@ * class. For example, if the annotated class is {@code com.example.RunCucumber} * then glue is assumed to be located in {@code com.example}. * - * @see io.cucumber.core.model.GluePath + * @see io.cucumber.core.feature.GluePath * @return The package(s) that contain glue code. */ String[] glue() default {}; diff --git a/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java index ed63d9d870..4096c61424 100644 --- a/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.runner.TestHelper; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.util.FixJava; import gherkin.deps.com.google.gson.JsonParser; import org.jsoup.Jsoup; diff --git a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java index c93fce6ce8..c9ddfc536b 100755 --- a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java @@ -38,7 +38,7 @@ import io.cucumber.core.event.EventBus; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.TestClasspathResourceLoader; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.runner.TestBackendSupplier; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.runner.ClockStub; diff --git a/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java index 9090f135ac..bb45fcb240 100644 --- a/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java @@ -28,7 +28,7 @@ import org.xml.sax.SAXException; import io.cucumber.core.api.event.Result; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.runner.TestHelper; public class JUnitFormatterTest { diff --git a/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java index e16ff97f27..2f75deb983 100755 --- a/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PrettyFormatterTest.java @@ -3,7 +3,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.runner.TestHelper; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.stepexpression.StepExpression; import io.cucumber.core.stepexpression.StepExpressionFactory; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/plugin/RerunFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/RerunFormatterTest.java index 04203f6789..56643a6a7c 100755 --- a/core/src/test/java/io/cucumber/core/plugin/RerunFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/RerunFormatterTest.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.runner.TestHelper; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import org.junit.Test; import java.util.AbstractMap.SimpleEntry; diff --git a/core/src/test/java/io/cucumber/core/plugin/TestNGFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/TestNGFormatterTest.java index b47280a125..78d7f9c538 100644 --- a/core/src/test/java/io/cucumber/core/plugin/TestNGFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/TestNGFormatterTest.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.runner.TestHelper; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.Difference; import org.custommonkey.xmlunit.XMLUnit; diff --git a/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java index 6c30b105bd..07c50c8d51 100644 --- a/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/TimelineFormatterTest.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.runner.TestHelper; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; import gherkin.deps.com.google.gson.JsonDeserializer; diff --git a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java index f6f49316bf..4f38bea5a2 100644 --- a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java @@ -15,7 +15,7 @@ import gherkin.pickles.PickleLocation; import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.event.EventBus; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.runner.ClockStub; diff --git a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index bcbea25770..7558e9843e 100644 --- a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -13,7 +13,6 @@ import gherkin.pickles.PickleRow; import gherkin.pickles.PickleStep; import io.cucumber.core.event.EventBus; -import io.cucumber.core.runtime.ScenarioScoped; import io.cucumber.core.stepexpression.ArgumentMatcher; import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; import io.cucumber.core.stepexpression.StepExpression; diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index 34dc726e4c..cdf53d7dd0 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -14,12 +14,12 @@ import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.TestClasspathResourceLoader; -import io.cucumber.core.model.FeatureParser; +import io.cucumber.core.feature.FeatureParser; import io.cucumber.core.options.CommandlineOptionsParser; import io.cucumber.core.runtime.FeatureSupplier; import io.cucumber.core.runtime.Runtime; import io.cucumber.core.runtime.StubStepDefinition; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import gherkin.pickles.Compiler; import gherkin.pickles.Pickle; import gherkin.pickles.PickleStep; @@ -27,7 +27,7 @@ import gherkin.pickles.PickleTable; import gherkin.pickles.PickleTag; import io.cucumber.core.runtime.TestFeatureSupplier; -import io.cucumber.core.model.FeatureIdentifier; +import io.cucumber.core.feature.FeatureIdentifier; import io.cucumber.datatable.DataTable; import io.cucumber.core.stepexpression.TypeRegistry; import junit.framework.AssertionFailedError; diff --git a/core/src/test/java/io/cucumber/core/runtime/FeaturePathFeatureSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/FeaturePathFeatureSupplierTest.java index 7692dcbdc3..8700039b88 100644 --- a/core/src/test/java/io/cucumber/core/runtime/FeaturePathFeatureSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/FeaturePathFeatureSupplierTest.java @@ -3,8 +3,9 @@ import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.logging.LogRecordListener; import io.cucumber.core.logging.LoggerFactory; -import io.cucumber.core.model.FeatureLoader; -import io.cucumber.core.model.FeaturePath; +import io.cucumber.core.feature.FeatureLoader; +import io.cucumber.core.feature.FeaturePath; +import io.cucumber.core.feature.Options; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index 984a79ee78..1b47dd8888 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -19,16 +19,17 @@ import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.api.event.StepDefinition; import io.cucumber.core.event.EventBus; import io.cucumber.core.exception.CompositeCucumberException; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.TestClasspathResourceLoader; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.options.CommandlineOptionsParser; import io.cucumber.core.plugin.FormatterBuilder; import io.cucumber.core.plugin.FormatterSpy; +import io.cucumber.core.runner.ScenarioScoped; import io.cucumber.core.runner.StepDurationTimeService; import io.cucumber.core.runner.TestBackendSupplier; import io.cucumber.core.runner.TestHelper; @@ -51,6 +52,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; import static io.cucumber.core.runner.TestHelper.feature; @@ -506,8 +508,8 @@ public void should_interrupt_waiting_plugins() throws InterruptedException { " Scenario: scenario_2 name\n" + " Given first step\n"); - final AtomicBoolean threadBlocked = new AtomicBoolean(false); - final AtomicBoolean interruptHit = new AtomicBoolean(false); + final CountDownLatch threadBlocked = new CountDownLatch(1); + final CountDownLatch interruptHit = new CountDownLatch(1); final ConcurrentEventListener brokenEventListener = new ConcurrentEventListener() { @Override @@ -516,10 +518,10 @@ public void setEventPublisher(EventPublisher publisher) { @Override public void receive(TestStepFinished event) { try { - threadBlocked.set(true); + threadBlocked.countDown(); HOURS.sleep(1); } catch (InterruptedException ignored) { - interruptHit.set(true); + interruptHit.countDown(); } } }); @@ -539,13 +541,12 @@ public void run() { } }); + thread.start(); - do { - MILLISECONDS.sleep(1); - } while (!threadBlocked.get()); + threadBlocked.await(1, SECONDS); thread.interrupt(); - MINUTES.timedJoin(thread, 1); - assertTrue(interruptHit.get()); + interruptHit.await(1, SECONDS); + assertEquals(0, interruptHit.getCount()); } @Test @@ -584,14 +585,14 @@ public void receive(StepDefinedEvent event) { @Override public void loadGlue(Glue glue, List gluePaths) { this.glue = glue; - final StepDefinition mockedStepDefinition = new MockedStepDefinition(); + final io.cucumber.core.backend.StepDefinition mockedStepDefinition = new MockedStepDefinition(); definedStepDefinitions.add(mockedStepDefinition); glue.addStepDefinition(mockedStepDefinition); } @Override public void buildWorld() { - final StepDefinition mockedScenarioScopedStepDefinition = new MockedScenarioScopedStepDefinition(); + final io.cucumber.core.backend.StepDefinition mockedScenarioScopedStepDefinition = new MockedScenarioScopedStepDefinition(); definedStepDefinitions.add(mockedScenarioScopedStepDefinition); glue.addStepDefinition(mockedScenarioScopedStepDefinition); } @@ -720,7 +721,7 @@ public List get() { } private void mockMatch(Glue glue, String text) { - StepDefinition stepDefinition = new StubStepDefinition(text, TYPE_REGISTRY); + io.cucumber.core.backend.StepDefinition stepDefinition = new StubStepDefinition(text, TYPE_REGISTRY); glue.addStepDefinition(stepDefinition); } @@ -733,7 +734,10 @@ private void mockHook(Glue glue, HookDefinition hook, HookType hookType) { glue.addAfterHook(hook); return; case AfterStep: - glue.addBeforeHook(hook); + glue.addAfterStepHook(hook); + return; + case BeforeStep: + glue.addBeforeStepHook(hook); return; default: throw new IllegalArgumentException(hookType.name()); @@ -744,7 +748,7 @@ private TestCaseFinished testCaseFinishedWithStatus(Result.Type resultStatus) { return new TestCaseFinished(ANY_INSTANT, mock(TestCase.class), new Result(resultStatus, ZERO, null)); } - private static final class MockedStepDefinition implements StepDefinition { + private static final class MockedStepDefinition implements io.cucumber.core.backend.StepDefinition { @Override public List matchedArguments(PickleStep step) { @@ -778,7 +782,7 @@ public String getPattern() { } - private static final class MockedScenarioScopedStepDefinition implements StepDefinition, ScenarioScoped { + private static final class MockedScenarioScopedStepDefinition implements io.cucumber.core.backend.StepDefinition, ScenarioScoped { boolean disposed; diff --git a/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java index 7bd8eb0af8..0110576e9d 100644 --- a/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java +++ b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java @@ -1,7 +1,7 @@ package io.cucumber.core.runtime; import io.cucumber.core.api.event.TestSourceRead; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.event.EventBus; import java.util.Arrays; diff --git a/core/src/test/resources/io/cucumber/core/model/UTF_8_BOM_Encoded.feature b/core/src/test/resources/io/cucumber/core/feature/UTF_8_BOM_Encoded.feature similarity index 100% rename from core/src/test/resources/io/cucumber/core/model/UTF_8_BOM_Encoded.feature rename to core/src/test/resources/io/cucumber/core/feature/UTF_8_BOM_Encoded.feature diff --git a/core/src/test/resources/io/cucumber/core/model/UTF_8_Encoded.feature b/core/src/test/resources/io/cucumber/core/feature/UTF_8_Encoded.feature similarity index 100% rename from core/src/test/resources/io/cucumber/core/model/UTF_8_Encoded.feature rename to core/src/test/resources/io/cucumber/core/feature/UTF_8_Encoded.feature diff --git a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java index e988426249..0667194b15 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java @@ -5,7 +5,7 @@ import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.filter.TagPredicate; import io.cucumber.core.runtime.Invoker; -import io.cucumber.core.runtime.ScenarioScoped; +import io.cucumber.core.runner.ScenarioScoped; import java.util.Collection; diff --git a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java index a800f6ee8b..977a563dbf 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java @@ -4,7 +4,7 @@ import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.runtime.Invoker; -import io.cucumber.core.runtime.ScenarioScoped; +import io.cucumber.core.runner.ScenarioScoped; import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.ArgumentMatcher; import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; diff --git a/junit/src/main/java/io/cucumber/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java index a64c88d325..ae477f4c00 100644 --- a/junit/src/main/java/io/cucumber/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java @@ -17,13 +17,13 @@ import io.cucumber.core.filter.Filters; import io.cucumber.core.plugin.Plugins; import io.cucumber.core.plugin.PluginFactory; -import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.feature.FeatureLoader; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import org.apiguardian.api.API; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/junit/src/main/java/io/cucumber/junit/CucumberOptions.java b/junit/src/main/java/io/cucumber/junit/CucumberOptions.java index 8ba4ca7a1a..4218ade680 100644 --- a/junit/src/main/java/io/cucumber/junit/CucumberOptions.java +++ b/junit/src/main/java/io/cucumber/junit/CucumberOptions.java @@ -30,7 +30,7 @@ * class. For example, if the annotated class is {@code com.example.RunCucumber} * then features are assumed to be located in {@code classpath:com/example}. * - * @see io.cucumber.core.model.FeatureWithLines + * @see io.cucumber.core.feature.FeatureWithLines */ String[] features() default {}; @@ -42,7 +42,7 @@ * class. For example, if the annotated class is {@code com.example.RunCucumber} * then glue is assumed to be located in {@code com.example}. * - * @see io.cucumber.core.model.GluePath + * @see io.cucumber.core.feature.GluePath */ String[] glue() default {}; diff --git a/junit/src/main/java/io/cucumber/junit/FeatureRunner.java b/junit/src/main/java/io/cucumber/junit/FeatureRunner.java index d2f0e03302..4879ee1626 100644 --- a/junit/src/main/java/io/cucumber/junit/FeatureRunner.java +++ b/junit/src/main/java/io/cucumber/junit/FeatureRunner.java @@ -5,7 +5,7 @@ import io.cucumber.core.exception.CucumberException; import io.cucumber.core.filter.Filters; import io.cucumber.junit.PickleRunners.PickleRunner; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import org.junit.runner.Description; import org.junit.runner.notification.RunNotifier; diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index 50ca7b8594..3dac81f52a 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -2,8 +2,6 @@ import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.backend.SingletonObjectFactorySupplier; -import io.cucumber.core.io.MultiLoader; -import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; import io.cucumber.core.backend.Backend; @@ -11,7 +9,7 @@ import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import io.cucumber.core.filter.Filters; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import org.junit.Test; import org.junit.runner.Description; import org.junit.runner.notification.RunNotifier; @@ -27,7 +25,6 @@ import java.util.Set; import static java.util.Arrays.asList; -import static java.util.Collections.emptyList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.argThat; diff --git a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java index dea2310382..6755a01939 100644 --- a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java @@ -7,7 +7,7 @@ import io.cucumber.core.runtime.RunnerSupplier; import io.cucumber.junit.PickleRunners.PickleRunner; import io.cucumber.junit.PickleRunners.WithStepDescriptions; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import gherkin.events.PickleEvent; import gherkin.pickles.Compiler; import gherkin.pickles.Pickle; @@ -17,7 +17,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; public class PickleRunnerWithStepDescriptionsTest { diff --git a/junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java b/junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java index 0aa399a4c2..c4188754c1 100644 --- a/junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java +++ b/junit/src/test/java/io/cucumber/junit/TestPickleBuilder.java @@ -1,11 +1,11 @@ package io.cucumber.junit; -import io.cucumber.core.model.FeatureParser; +import io.cucumber.core.feature.FeatureParser; import gherkin.events.PickleEvent; import gherkin.pickles.Compiler; import gherkin.pickles.Pickle; import io.cucumber.core.io.Resource; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; import java.io.ByteArrayInputStream; import java.io.InputStream; diff --git a/testng/src/main/java/io/cucumber/testng/CucumberFeatureWrapperImpl.java b/testng/src/main/java/io/cucumber/testng/CucumberFeatureWrapperImpl.java index 5a034444d9..3d930108a7 100644 --- a/testng/src/main/java/io/cucumber/testng/CucumberFeatureWrapperImpl.java +++ b/testng/src/main/java/io/cucumber/testng/CucumberFeatureWrapperImpl.java @@ -1,6 +1,6 @@ package io.cucumber.testng; -import io.cucumber.core.model.CucumberFeature; +import io.cucumber.core.feature.CucumberFeature; class CucumberFeatureWrapperImpl implements CucumberFeatureWrapper { private final CucumberFeature cucumberFeature; diff --git a/testng/src/main/java/io/cucumber/testng/CucumberOptions.java b/testng/src/main/java/io/cucumber/testng/CucumberOptions.java index 263e94125e..bc6c8e8142 100644 --- a/testng/src/main/java/io/cucumber/testng/CucumberOptions.java +++ b/testng/src/main/java/io/cucumber/testng/CucumberOptions.java @@ -30,7 +30,7 @@ * class. For example, if the annotated class is {@code com.example.RunCucumber} * then features are assumed to be located in {@code classpath:com/example}. * - * @see io.cucumber.core.model.FeatureWithLines + * @see io.cucumber.core.feature.FeatureWithLines */ String[] features() default {}; @@ -42,7 +42,7 @@ * class. For example, if the annotated class is {@code com.example.RunCucumber} * then glue is assumed to be located in {@code com.example}. * - * @see io.cucumber.core.model.GluePath + * @see io.cucumber.core.feature.GluePath */ String[] glue() default {}; diff --git a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java index 7288384a98..20585cf864 100644 --- a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java @@ -13,8 +13,8 @@ import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.model.CucumberFeature; -import io.cucumber.core.model.FeatureLoader; +import io.cucumber.core.feature.CucumberFeature; +import io.cucumber.core.feature.FeatureLoader; import io.cucumber.core.options.CucumberOptionsAnnotationParser; import io.cucumber.core.options.Env; import io.cucumber.core.options.EnvironmentOptionsParser; From 2e598503afb5b2df084155f833ca48f9f5997fb5 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 23 Jun 2019 12:22:54 +0200 Subject: [PATCH 096/155] [Core] Remove cycles between Scenario and TestCase --- .../java/io/cucumber/core/api/Scenario.java | 8 ++++---- .../io/cucumber/core/api/event/TestCase.java | 8 +++++++- .../java/io/cucumber/core/runner/Scenario.java | 9 +++++---- .../java/io/cucumber/core/runner/TestCase.java | 18 ++++-------------- .../io/cucumber/core/runner/ScenarioTest.java | 4 ++-- 5 files changed, 22 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/api/Scenario.java b/core/src/main/java/io/cucumber/core/api/Scenario.java index 3fed20cfe9..3467617975 100644 --- a/core/src/main/java/io/cucumber/core/api/Scenario.java +++ b/core/src/main/java/io/cucumber/core/api/Scenario.java @@ -3,7 +3,6 @@ import io.cucumber.core.api.event.Result; import java.util.Collection; -import java.util.List; /** * Before or After Hooks that declare a parameter of this type will receive an instance of this class. @@ -66,8 +65,9 @@ public interface Scenario { String getUri(); /** - * @return the line(s) in the feature file of the Scenario. Scenarios from Scenario Outlines - * return both the line of the example row the the line of the scenario outline. + * @return the line in the feature file of the Scenario. If this is a Scenario + * from Scenario Outlines this wil return the line of the example row in + * the Scenario Outline. */ - List getLines(); + Integer getLine(); } diff --git a/core/src/main/java/io/cucumber/core/api/event/TestCase.java b/core/src/main/java/io/cucumber/core/api/event/TestCase.java index a25bd827b3..412d4b3232 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestCase.java +++ b/core/src/main/java/io/cucumber/core/api/event/TestCase.java @@ -5,7 +5,13 @@ import java.util.List; public interface TestCase { - int getLine(); + + /** + * @return the line in the feature file of the Scenario. If this is a Scenario + * from Scenario Outlines this wil return the line of the example row in + * the Scenario Outline. + */ + Integer getLine(); String getName(); diff --git a/core/src/main/java/io/cucumber/core/runner/Scenario.java b/core/src/main/java/io/cucumber/core/runner/Scenario.java index e94c3da194..94a4d06fc2 100644 --- a/core/src/main/java/io/cucumber/core/runner/Scenario.java +++ b/core/src/main/java/io/cucumber/core/runner/Scenario.java @@ -2,6 +2,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.EmbedEvent; +import io.cucumber.core.api.event.TestCase; import io.cucumber.core.api.event.WriteEvent; import gherkin.pickles.PickleTag; import io.cucumber.core.event.EventBus; @@ -20,7 +21,7 @@ class Scenario implements io.cucumber.core.api.Scenario { private final EventBus bus; private final TestCase testCase; - Scenario(EventBus bus, TestCase testCase) { + Scenario(EventBus bus, io.cucumber.core.api.event.TestCase testCase) { this.bus = bus; this.testCase = testCase; } @@ -74,7 +75,7 @@ public String getName() { @Override public String getId() { - return testCase.getUri() + ":" + testCase.getLine(); + return testCase.getUri() + ":" + getLine(); } @Override @@ -83,8 +84,8 @@ public String getUri() { } @Override - public List getLines() { - return testCase.getLines(); + public Integer getLine() { + return testCase.getLine(); } public Throwable getError() { diff --git a/core/src/main/java/io/cucumber/core/runner/TestCase.java b/core/src/main/java/io/cucumber/core/runner/TestCase.java index f6ca02c270..2f88a6d87c 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestCase.java +++ b/core/src/main/java/io/cucumber/core/runner/TestCase.java @@ -5,7 +5,6 @@ import io.cucumber.core.api.event.TestCaseFinished; import io.cucumber.core.api.event.TestCaseStarted; import gherkin.events.PickleEvent; -import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleTag; import io.cucumber.core.event.EventBus; @@ -75,7 +74,7 @@ public String getName() { @Override public String getScenarioDesignation() { - return fileColonLine(pickleEvent.pickle.getLocations().get(0)) + " # " + getName(); + return fileColonLine(getLine()) + " # " + getName(); } @Override @@ -83,21 +82,12 @@ public String getUri() { return pickleEvent.uri; } - @Override - public int getLine() { + public Integer getLine() { return pickleEvent.pickle.getLocations().get(0).getLine(); } - public List getLines() { - List lines = new ArrayList<>(); - for (PickleLocation location : pickleEvent.pickle.getLocations()) { - lines.add(location.getLine()); - } - return lines; - } - - private String fileColonLine(PickleLocation location) { - return URI.create(pickleEvent.uri).getSchemeSpecificPart() + ":" + location.getLine(); + private String fileColonLine(Integer line) { + return URI.create(pickleEvent.uri).getSchemeSpecificPart() + ":" + line; } @Override diff --git a/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java index 3a6f738500..4832f3558f 100644 --- a/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java @@ -29,7 +29,7 @@ public void provides_the_scenario_line() { List scenarioLocation = asList(new PickleLocation(line(3), column(2))); Scenario scenario = createScenarioWithScenarioLocations(scenarioLocation); - assertEquals(asList(3), scenario.getLines()); + assertEquals((Integer) 3, scenario.getLine()); } @Test @@ -37,7 +37,7 @@ public void provides_both_the_example_row_line_and_scenario_outline_line_for_sce List scenarioLocation = asList(new PickleLocation(line(8), column(4)), new PickleLocation(line(3), column(2))); Scenario scenario = createScenarioWithScenarioLocations(scenarioLocation); - assertEquals(asList(8, 3), scenario.getLines()); + assertEquals((Integer) 8, scenario.getLine()); } @Test From 64528c7efba646d655835f10c4929b9b8e849b55 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 23 Jun 2019 12:32:40 +0200 Subject: [PATCH 097/155] [Core] Remove cycles between backend, runtime and options --- .../core/backend/ObjectFactorySupplier.java | 7 ------- .../core/runtime/BackendServiceLoader.java | 2 -- .../{backend => runtime}/BackendSupplier.java | 4 +++- .../core/runtime/ObjectFactorySupplier.java | 9 +++++++++ .../java/io/cucumber/core/runtime/Runtime.java | 15 +-------------- .../SingletonObjectFactorySupplier.java | 3 ++- .../core/runtime/SingletonRunnerSupplier.java | 2 -- .../ThreadLocalObjectFactorySupplier.java | 3 ++- .../core/runtime/ThreadLocalRunnerSupplier.java | 2 -- .../cucumber/core/runner/TestBackendSupplier.java | 2 +- .../java/io/cucumber/core/runner/TestHelper.java | 2 +- .../core/runtime/BackendServiceLoaderTest.java | 3 --- .../io/cucumber/core/runtime/RuntimeTest.java | 4 ---- .../core/runtime/SingletonRunnerSupplierTest.java | 4 ---- .../runtime/ThreadLocalRunnerSupplierTest.java | 4 ---- .../io/cucumber/java/JavaStepDefinitionTest.java | 4 +--- .../src/main/java/io/cucumber/junit/Cucumber.java | 6 +++--- .../java/io/cucumber/junit/FeatureRunnerTest.java | 6 +++--- .../io/cucumber/testng/TestNGCucumberRunner.java | 4 ++-- 19 files changed, 28 insertions(+), 58 deletions(-) delete mode 100644 core/src/main/java/io/cucumber/core/backend/ObjectFactorySupplier.java rename core/src/main/java/io/cucumber/core/{backend => runtime}/BackendSupplier.java (58%) create mode 100644 core/src/main/java/io/cucumber/core/runtime/ObjectFactorySupplier.java rename core/src/main/java/io/cucumber/core/{backend => runtime}/SingletonObjectFactorySupplier.java (85%) rename core/src/main/java/io/cucumber/core/{backend => runtime}/ThreadLocalObjectFactorySupplier.java (84%) diff --git a/core/src/main/java/io/cucumber/core/backend/ObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/backend/ObjectFactorySupplier.java deleted file mode 100644 index 53a053d772..0000000000 --- a/core/src/main/java/io/cucumber/core/backend/ObjectFactorySupplier.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.cucumber.core.backend; - -public interface ObjectFactorySupplier { - - ObjectFactory get(); - -} diff --git a/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java b/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java index 6495a7140a..b64d66dda7 100644 --- a/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java +++ b/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java @@ -3,8 +3,6 @@ import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; -import io.cucumber.core.backend.BackendSupplier; -import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.ResourceLoader; diff --git a/core/src/main/java/io/cucumber/core/backend/BackendSupplier.java b/core/src/main/java/io/cucumber/core/runtime/BackendSupplier.java similarity index 58% rename from core/src/main/java/io/cucumber/core/backend/BackendSupplier.java rename to core/src/main/java/io/cucumber/core/runtime/BackendSupplier.java index a4fbb4672d..d6f5cd0c43 100644 --- a/core/src/main/java/io/cucumber/core/backend/BackendSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/BackendSupplier.java @@ -1,4 +1,6 @@ -package io.cucumber.core.backend; +package io.cucumber.core.runtime; + +import io.cucumber.core.backend.Backend; import java.util.Collection; diff --git a/core/src/main/java/io/cucumber/core/runtime/ObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/runtime/ObjectFactorySupplier.java new file mode 100644 index 0000000000..607712fd65 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runtime/ObjectFactorySupplier.java @@ -0,0 +1,9 @@ +package io.cucumber.core.runtime; + +import io.cucumber.core.backend.ObjectFactory; + +public interface ObjectFactorySupplier { + + ObjectFactory get(); + +} diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 8602b12aa2..4f9b8abc64 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -10,10 +10,6 @@ import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.api.plugin.Plugin; -import io.cucumber.core.backend.BackendSupplier; -import io.cucumber.core.backend.ObjectFactorySupplier; -import io.cucumber.core.backend.SingletonObjectFactorySupplier; -import io.cucumber.core.backend.ThreadLocalObjectFactorySupplier; import io.cucumber.core.event.EventBus; import io.cucumber.core.exception.CompositeCucumberException; import io.cucumber.core.exception.CucumberException; @@ -151,10 +147,8 @@ public static class Builder { private RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); private BackendSupplier backendSupplier; private ResourceLoader resourceLoader; - private ClassFinder classFinder; private FeatureSupplier featureSupplier; private List additionalPlugins = emptyList(); - private List runtimeOptionsArgs = emptyList(); private Builder() { } @@ -174,11 +168,6 @@ public Builder withResourceLoader(final ResourceLoader resourceLoader) { return this; } - public Builder withClassFinder(final ClassFinder classFinder) { - this.classFinder = classFinder; - return this; - } - public Builder withBackendSupplier(final BackendSupplier backendSupplier) { this.backendSupplier = backendSupplier; return this; @@ -204,9 +193,7 @@ public Runtime build() { ? this.resourceLoader : new MultiLoader(this.classLoader); - final ClassFinder classFinder = this.classFinder != null - ? this.classFinder - : new ResourceLoaderClassFinder(resourceLoader, this.classLoader); + final ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, this.classLoader); final ObjectFactorySupplier objectFactorySupplier = runtimeOptions.isMultiThreaded() ? new ThreadLocalObjectFactorySupplier() diff --git a/core/src/main/java/io/cucumber/core/backend/SingletonObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java similarity index 85% rename from core/src/main/java/io/cucumber/core/backend/SingletonObjectFactorySupplier.java rename to core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java index 7856e900f7..c7c14db4eb 100644 --- a/core/src/main/java/io/cucumber/core/backend/SingletonObjectFactorySupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java @@ -1,5 +1,6 @@ -package io.cucumber.core.backend; +package io.cucumber.core.runtime; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.options.Env; import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; diff --git a/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java index 22f39cf3f4..c6ba64e5b5 100644 --- a/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java @@ -1,7 +1,5 @@ package io.cucumber.core.runtime; -import io.cucumber.core.backend.BackendSupplier; -import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.Options; import io.cucumber.core.runner.Runner; diff --git a/core/src/main/java/io/cucumber/core/backend/ThreadLocalObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java similarity index 84% rename from core/src/main/java/io/cucumber/core/backend/ThreadLocalObjectFactorySupplier.java rename to core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java index 9ba08f0799..b11b1619b0 100644 --- a/core/src/main/java/io/cucumber/core/backend/ThreadLocalObjectFactorySupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java @@ -1,6 +1,7 @@ -package io.cucumber.core.backend; +package io.cucumber.core.runtime; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.options.Env; import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java index c70d0b5743..b2698a2c57 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java @@ -4,8 +4,6 @@ import io.cucumber.core.api.event.Event; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.backend.BackendSupplier; -import io.cucumber.core.backend.ObjectFactorySupplier; import io.cucumber.core.event.AbstractEventBus; import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.Runner; diff --git a/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java index e6f4bf9af9..9f7f4cde22 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java @@ -2,7 +2,7 @@ import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.backend.Backend; -import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.runtime.BackendSupplier; import gherkin.pickles.PickleStep; import java.util.Collection; diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index cdf53d7dd0..299fcd1408 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -9,7 +9,7 @@ import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.runtime.BackendSupplier; import io.cucumber.core.event.EventBus; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; diff --git a/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java b/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java index 18a6812c77..b12eb50c1b 100644 --- a/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java @@ -1,8 +1,5 @@ package io.cucumber.core.runtime; -import io.cucumber.core.backend.BackendSupplier; -import io.cucumber.core.backend.ObjectFactorySupplier; -import io.cucumber.core.backend.SingletonObjectFactorySupplier; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index 1b47dd8888..00ebf4cbb9 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -16,7 +16,6 @@ import io.cucumber.core.api.event.TestCaseFinished; import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.api.plugin.Plugin; -import io.cucumber.core.backend.BackendSupplier; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.api.event.StepDefinition; @@ -53,15 +52,12 @@ import java.util.Locale; import java.util.Map; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.atomic.AtomicBoolean; import static io.cucumber.core.runner.TestHelper.feature; import static io.cucumber.core.runner.TestHelper.result; import static java.time.Duration.ZERO; import static java.util.Collections.singletonList; import static java.util.concurrent.TimeUnit.HOURS; -import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertEquals; diff --git a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java index 581d497a25..fbc988c046 100644 --- a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java @@ -1,8 +1,6 @@ package io.cucumber.core.runtime; -import io.cucumber.core.backend.ObjectFactorySupplier; -import io.cucumber.core.backend.SingletonObjectFactorySupplier; import io.cucumber.core.event.EventBus; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; @@ -13,8 +11,6 @@ import org.junit.Before; import org.junit.Test; -import static io.cucumber.core.options.Env.INSTANCE; -import static java.util.Collections.emptyList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertSame; diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 9b89e1f319..1414ed4a1a 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -3,14 +3,11 @@ import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.TestCaseStarted; -import io.cucumber.core.backend.ObjectFactorySupplier; -import io.cucumber.core.backend.SingletonObjectFactorySupplier; import io.cucumber.core.event.EventBus; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.options.Env; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runner.Runner; import io.cucumber.core.runner.TimeServiceEventBus; @@ -18,7 +15,6 @@ import org.junit.Test; import java.time.Clock; -import java.util.Collections; import static java.time.Instant.EPOCH; import static org.hamcrest.CoreMatchers.is; diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 3df3474f7f..b0dcdb4f26 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -5,13 +5,12 @@ import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.backend.ObjectFactory; import io.cucumber.java.en.Given; -import io.cucumber.core.options.Env; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; import io.cucumber.core.runner.Runner; import io.cucumber.core.runner.AmbiguousStepDefinitionsException; import io.cucumber.core.backend.Backend; -import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.runtime.BackendSupplier; import io.cucumber.core.backend.DuplicateStepDefinitionException; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; @@ -40,7 +39,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.StringStartsWith.startsWith; -import static java.util.Collections.emptyList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; diff --git a/junit/src/main/java/io/cucumber/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java index ae477f4c00..015f7ef69c 100644 --- a/junit/src/main/java/io/cucumber/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java @@ -3,14 +3,14 @@ import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; -import io.cucumber.core.backend.ObjectFactorySupplier; -import io.cucumber.core.backend.ThreadLocalObjectFactorySupplier; +import io.cucumber.core.runtime.ObjectFactorySupplier; +import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier; import io.cucumber.core.event.EventBus; import io.cucumber.core.options.CucumberOptionsAnnotationParser; import io.cucumber.core.options.Env; import io.cucumber.core.options.EnvironmentOptionsParser; import io.cucumber.core.runtime.BackendServiceLoader; -import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.runtime.BackendSupplier; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.runtime.FeaturePathFeatureSupplier; diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index 3dac81f52a..69085e7627 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -1,11 +1,11 @@ package io.cucumber.junit; -import io.cucumber.core.backend.ObjectFactorySupplier; -import io.cucumber.core.backend.SingletonObjectFactorySupplier; +import io.cucumber.core.runtime.ObjectFactorySupplier; +import io.cucumber.core.runtime.SingletonObjectFactorySupplier; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.event.EventBus; import io.cucumber.core.backend.Backend; -import io.cucumber.core.backend.BackendSupplier; +import io.cucumber.core.runtime.BackendSupplier; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import io.cucumber.core.filter.Filters; diff --git a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java index 20585cf864..bb2052a57d 100644 --- a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java @@ -4,8 +4,8 @@ import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.api.event.TestSourceRead; -import io.cucumber.core.backend.ObjectFactorySupplier; -import io.cucumber.core.backend.ThreadLocalObjectFactorySupplier; +import io.cucumber.core.runtime.ObjectFactorySupplier; +import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier; import io.cucumber.core.event.EventBus; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.filter.Filters; From 9ca011b59f346d4c173f743a89cd762defdff2ca Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 23 Jun 2019 16:34:49 +0200 Subject: [PATCH 098/155] [Core] Split look up and container --- .../io/cucumber/core/backend/Backend.java | 5 +- .../core/backend/BackendProviderService.java | 3 +- .../io/cucumber/core/backend/Container.java | 2 +- .../java/io/cucumber/core/backend/Glue.java | 6 +- .../cucumber/core/backend/ObjectFactory.java | 2 +- .../io/cucumber/core/runner/CachingGlue.java | 29 +++--- .../java/io/cucumber/core/runner/Runner.java | 16 +++- .../core/runtime/BackendServiceLoader.java | 37 +------- .../ConfiguringTypeRegistrySupplier.java | 44 +++++++++ .../io/cucumber/core/runtime/Runtime.java | 7 +- .../core/runtime/SingletonRunnerSupplier.java | 19 ++-- .../runtime/ThreadLocalRunnerSupplier.java | 19 ++-- .../core/runtime/TypeRegistrySupplier.java | 7 ++ .../backend/StubBackendProviderService.java | 15 ++-- .../core/plugin/JSONFormatterTest.java | 12 +-- .../cucumber/core/runner/CachingGlueTest.java | 41 ++++----- .../cucumber/core/runner/HookOrderTest.java | 48 +++++----- .../io/cucumber/core/runner/HookTest.java | 5 +- .../io/cucumber/core/runner/RunnerTest.java | 44 +++++---- .../core/runner/TestBackendSupplier.java | 7 +- .../io/cucumber/core/runner/TestHelper.java | 4 +- .../core/runner/TestRunnerSupplier.java | 25 ++---- .../runtime/BackendServiceLoaderTest.java | 4 +- .../io/cucumber/core/runtime/RuntimeTest.java | 6 +- .../runtime/SingletonRunnerSupplierTest.java | 5 +- .../runtime/TestTypeRegistrySupplier.java | 13 +++ .../ThreadLocalRunnerSupplierTest.java | 5 +- .../cucumber/core/snippets/TestSnippet.java | 26 ++++++ .../java/io/cucumber/java/JavaBackend.java | 90 +++++++++---------- .../java/JavaBackendProviderService.java | 5 +- .../io/cucumber/java/JavaBackendTest.java | 12 ++- .../java/io/cucumber/java/JavaHookTest.java | 9 +- .../cucumber/java/JavaStepDefinitionTest.java | 4 +- .../io/cucumber/java/MethodScannerTest.java | 19 ++-- .../java/io/cucumber/java8/Java8Backend.java | 32 +++---- .../java8/Java8BackendProviderService.java | 5 +- .../io/cucumber/java8/Java8BackendTest.java | 15 +--- .../main/java/io/cucumber/junit/Cucumber.java | 7 +- .../io/cucumber/junit/FeatureRunnerTest.java | 21 +++-- .../junit/StubBackendProviderService.java | 35 ++++++-- .../cucumber/testng/TestNGCucumberRunner.java | 9 +- .../testng/StubBackendProviderService.java | 49 +++++++--- 42 files changed, 452 insertions(+), 316 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/runtime/ConfiguringTypeRegistrySupplier.java create mode 100644 core/src/main/java/io/cucumber/core/runtime/TypeRegistrySupplier.java create mode 100644 core/src/test/java/io/cucumber/core/runtime/TestTypeRegistrySupplier.java create mode 100644 core/src/test/java/io/cucumber/core/snippets/TestSnippet.java diff --git a/core/src/main/java/io/cucumber/core/backend/Backend.java b/core/src/main/java/io/cucumber/core/backend/Backend.java index 9d5badebe3..e26fbef8fc 100644 --- a/core/src/main/java/io/cucumber/core/backend/Backend.java +++ b/core/src/main/java/io/cucumber/core/backend/Backend.java @@ -1,7 +1,6 @@ package io.cucumber.core.backend; -import gherkin.pickles.PickleStep; -import io.cucumber.core.snippets.SnippetType; +import io.cucumber.core.snippets.Snippet; import java.net.URI; import java.util.List; @@ -26,5 +25,5 @@ public interface Backend { */ void disposeWorld(); - List getSnippet(PickleStep step, String keyword, SnippetType snippetType); + Snippet getSnippet(); } diff --git a/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java b/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java index 613ec43aa7..6cf6860b25 100644 --- a/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java +++ b/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java @@ -1,10 +1,9 @@ package io.cucumber.core.backend; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.stepexpression.TypeRegistry; public interface BackendProviderService { - Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry); + Backend create(Lookup lookup, Container container, ResourceLoader resourceLoader); } diff --git a/core/src/main/java/io/cucumber/core/backend/Container.java b/core/src/main/java/io/cucumber/core/backend/Container.java index ac93db2318..b1c9f398d5 100644 --- a/core/src/main/java/io/cucumber/core/backend/Container.java +++ b/core/src/main/java/io/cucumber/core/backend/Container.java @@ -1,6 +1,6 @@ package io.cucumber.core.backend; -public interface Container extends Lookup { +public interface Container { /** * Collects glue classes in the classpath. Called once on init. * diff --git a/core/src/main/java/io/cucumber/core/backend/Glue.java b/core/src/main/java/io/cucumber/core/backend/Glue.java index a85631e10f..281c73617a 100644 --- a/core/src/main/java/io/cucumber/core/backend/Glue.java +++ b/core/src/main/java/io/cucumber/core/backend/Glue.java @@ -1,8 +1,12 @@ package io.cucumber.core.backend; +import io.cucumber.core.stepexpression.TypeRegistry; + +import java.util.function.Function; + public interface Glue { - void addStepDefinition(StepDefinition stepDefinition) throws DuplicateStepDefinitionException; + void addStepDefinition(Function stepDefinition) throws DuplicateStepDefinitionException; void addBeforeHook(HookDefinition hookDefinition); diff --git a/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java b/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java index 5b9a9ef6d0..499aa97cd0 100644 --- a/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java +++ b/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java @@ -3,7 +3,7 @@ /** * Minimal facade for Dependency Injection containers */ -public interface ObjectFactory extends Container { +public interface ObjectFactory extends Container, Lookup { /** * Instantiate glue code before scenario execution. Called once per scenario. diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index d6d1a446b8..3dcf955e81 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -8,16 +8,20 @@ import io.cucumber.core.event.EventBus; import io.cucumber.core.stepexpression.Argument; import gherkin.pickles.PickleStep; +import io.cucumber.core.stepexpression.TypeRegistry; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.SortedSet; import java.util.TreeMap; +import java.util.function.Function; final class CachingGlue implements Glue { + private static final HookComparator ASCENDING = new HookComparator(true); + private static final HookComparator DESCENDING = new HookComparator(false); final Map stepDefinitionsByPattern = new TreeMap<>(); final Map stepDefinitionsByStepText = new HashMap<>(); final List beforeHooks = new ArrayList<>(); @@ -26,13 +30,16 @@ final class CachingGlue implements Glue { final List afterStepHooks = new ArrayList<>(); private final EventBus bus; + private final TypeRegistry typeRegistry; - CachingGlue(EventBus bus) { + CachingGlue(EventBus bus, TypeRegistry typeRegistry) { this.bus = bus; + this.typeRegistry = typeRegistry; } @Override - public void addStepDefinition(StepDefinition stepDefinition) { + public void addStepDefinition(Function stepDefinitionFunction) { + StepDefinition stepDefinition = stepDefinitionFunction.apply(typeRegistry); StepDefinition previous = stepDefinitionsByPattern.get(stepDefinition.getPattern()); if (previous != null) { throw new DuplicateStepDefinitionException(previous, stepDefinition); @@ -44,40 +51,40 @@ public void addStepDefinition(StepDefinition stepDefinition) { @Override public void addBeforeHook(HookDefinition hookDefinition) { beforeHooks.add(hookDefinition); - Collections.sort(beforeHooks, new HookComparator(true)); + beforeHooks.sort(ASCENDING); } @Override public void addBeforeStepHook(HookDefinition hookDefinition) { beforeStepHooks.add(hookDefinition); - Collections.sort(beforeStepHooks, new HookComparator(true)); + beforeStepHooks.sort(ASCENDING); } @Override public void addAfterHook(HookDefinition hookDefinition) { afterHooks.add(hookDefinition); - Collections.sort(afterHooks, new HookComparator(false)); + afterHooks.sort(DESCENDING); } @Override public void addAfterStepHook(HookDefinition hookDefinition) { afterStepHooks.add(hookDefinition); - Collections.sort(afterStepHooks, new HookComparator(false)); + afterStepHooks.sort(DESCENDING); } List getBeforeHooks() { - return beforeHooks; + return new ArrayList<>(beforeHooks); } List getBeforeStepHooks() { - return beforeStepHooks; + return new ArrayList<>(beforeStepHooks); } List getAfterHooks() { - return afterHooks; + return new ArrayList<>(afterHooks); } List getAfterStepHooks() { - return afterStepHooks; + return new ArrayList<>(afterStepHooks); } PickleStepDefinitionMatch stepDefinitionMatch(String featurePath, PickleStep step) { diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index 81ae31e38f..896111eedf 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -11,12 +11,15 @@ import io.cucumber.core.event.EventBus; import io.cucumber.core.logging.Logger; import io.cucumber.core.logging.LoggerFactory; +import io.cucumber.core.snippets.SnippetGenerator; +import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.util.FixJava; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; public final class Runner { @@ -27,12 +30,17 @@ public final class Runner { private final Collection backends; private final Options runnerOptions; private final ObjectFactory objectFactory; + private final List snippetGenerators; - public Runner(EventBus bus, Collection backends, ObjectFactory objectFactory, Options runnerOptions) { + public Runner(EventBus bus, Collection backends, ObjectFactory objectFactory, TypeRegistry typeRegistry, Options runnerOptions) { this.bus = bus; - this.glue = new CachingGlue(bus); + this.glue = new CachingGlue(bus, typeRegistry); this.runnerOptions = runnerOptions; this.backends = backends; + this.snippetGenerators = backends.stream() + .map(Backend::getSnippet) + .map(s -> new SnippetGenerator(s, typeRegistry.parameterTypeRegistry())) + .collect(Collectors.toList()); this.objectFactory = objectFactory; List gluePaths = runnerOptions.getGlue(); log.debug("Loading glue from " + FixJava.join(gluePaths, ", ")); @@ -72,8 +80,8 @@ private void addTestStepsForPickleSteps(List testSteps, Pick match = glue.stepDefinitionMatch(pickleEvent.uri, step); if (match == null) { List snippets = new ArrayList<>(); - for (Backend backend : backends) { - List snippet = backend.getSnippet(step, "**KEYWORD**", runnerOptions.getSnippetType()); + for (SnippetGenerator snippetGenerator : snippetGenerators) { + List snippet = snippetGenerator.getSnippet(step, "**KEYWORD**", runnerOptions.getSnippetType()); snippets.addAll(snippet); } if (!snippets.isEmpty()) { diff --git a/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java b/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java index b64d66dda7..9404c4172e 100644 --- a/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java +++ b/core/src/main/java/io/cucumber/core/runtime/BackendServiceLoader.java @@ -1,19 +1,14 @@ package io.cucumber.core.runtime; -import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.reflection.Reflections; -import io.cucumber.core.stepexpression.TypeRegistry; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Locale; import java.util.ServiceLoader; /** @@ -23,14 +18,10 @@ public final class BackendServiceLoader implements BackendSupplier { private final ResourceLoader resourceLoader; - private final ClassFinder classFinder; - private final RuntimeOptions runtimeOptions; private final ObjectFactorySupplier objectFactorySupplier; - public BackendServiceLoader(ResourceLoader resourceLoader, ClassFinder classFinder, RuntimeOptions runtimeOptions, ObjectFactorySupplier objectFactorySupplier) { + public BackendServiceLoader(ResourceLoader resourceLoader, ObjectFactorySupplier objectFactorySupplier) { this.resourceLoader = resourceLoader; - this.classFinder = classFinder; - this.runtimeOptions = runtimeOptions; this.objectFactorySupplier = objectFactorySupplier; } @@ -48,33 +39,13 @@ Collection get(Iterable serviceLoader } private Collection loadBackends(Iterable serviceLoader) { - final TypeRegistry typeRegistry = createTypeRegistry(); List backends = new ArrayList<>(); for (BackendProviderService backendProviderService : serviceLoader) { - backends.add(backendProviderService.create(objectFactorySupplier.get(), resourceLoader, typeRegistry)); + ObjectFactory objectFactory = objectFactorySupplier.get(); + backends.add(backendProviderService.create(objectFactory, objectFactory, resourceLoader)); } return backends; } - private TypeRegistry createTypeRegistry() { - Reflections reflections = new Reflections(classFinder); - TypeRegistryConfigurer typeRegistryConfigurer = reflections.instantiateExactlyOneSubclass(TypeRegistryConfigurer.class, runtimeOptions.getGlue(), new Class[0], new Object[0], new DefaultTypeRegistryConfiguration()); - TypeRegistry typeRegistry = new TypeRegistry(typeRegistryConfigurer.locale()); - typeRegistryConfigurer.configureTypeRegistry(typeRegistry); - return typeRegistry; - } - - private static final class DefaultTypeRegistryConfiguration implements TypeRegistryConfigurer { - - @Override - public Locale locale() { - return Locale.ENGLISH; - } - @Override - public void configureTypeRegistry(io.cucumber.core.api.TypeRegistry typeRegistry) { - //noop - } - - } } diff --git a/core/src/main/java/io/cucumber/core/runtime/ConfiguringTypeRegistrySupplier.java b/core/src/main/java/io/cucumber/core/runtime/ConfiguringTypeRegistrySupplier.java new file mode 100644 index 0000000000..db7339469f --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runtime/ConfiguringTypeRegistrySupplier.java @@ -0,0 +1,44 @@ +package io.cucumber.core.runtime; + +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.reflection.Reflections; +import io.cucumber.core.runner.Options; +import io.cucumber.core.stepexpression.TypeRegistry; + +import java.util.Locale; + +public class ConfiguringTypeRegistrySupplier implements TypeRegistrySupplier { + + private final ClassFinder classFinder; + private final Options options; + + public ConfiguringTypeRegistrySupplier(ClassFinder classFinder, Options options) { + this.classFinder = classFinder; + this.options = options; + } + + @Override + public TypeRegistry get() { + Reflections reflections = new Reflections(classFinder); + TypeRegistryConfigurer typeRegistryConfigurer = reflections.instantiateExactlyOneSubclass(TypeRegistryConfigurer.class, options.getGlue(), new Class[0], new Object[0], new DefaultTypeRegistryConfiguration()); + TypeRegistry typeRegistry = new TypeRegistry(typeRegistryConfigurer.locale()); + typeRegistryConfigurer.configureTypeRegistry(typeRegistry); + return typeRegistry; + } + + private static final class DefaultTypeRegistryConfiguration implements TypeRegistryConfigurer { + + @Override + public Locale locale() { + return Locale.ENGLISH; + } + + @Override + public void configureTypeRegistry(io.cucumber.core.api.TypeRegistry typeRegistry) { + //noop + } + + } + +} diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 4f9b8abc64..aa3e704913 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -201,7 +201,7 @@ public Runtime build() { final BackendSupplier backendSupplier = this.backendSupplier != null ? this.backendSupplier - : new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactorySupplier); + : new BackendServiceLoader(resourceLoader, objectFactorySupplier); final Plugins plugins = new Plugins(new PluginFactory(), runtimeOptions); for (final Plugin plugin : additionalPlugins) { @@ -215,10 +215,11 @@ public Runtime build() { plugins.setEventBusOnEventListenerPlugins(eventBus); } + final TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); final RunnerSupplier runnerSupplier = runtimeOptions.isMultiThreaded() - ? new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactorySupplier) - : new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactorySupplier); + ? new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactorySupplier, typeRegistrySupplier) + : new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactorySupplier, typeRegistrySupplier); final ExecutorService executor = runtimeOptions.isMultiThreaded() ? Executors.newFixedThreadPool(runtimeOptions.getThreads(), new CucumberThreadFactory()) diff --git a/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java index c6ba64e5b5..5c438dc22f 100644 --- a/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java @@ -14,21 +14,24 @@ public final class SingletonRunnerSupplier implements RunnerSupplier { private final BackendSupplier backendSupplier; private final Options runnerOptions; private final EventBus eventBus; - private final ObjectFactorySupplier objectFactory; - private Runner runner; + private final ObjectFactorySupplier objectFactorySupplier; + private final TypeRegistrySupplier typeRegistrySupplier; public SingletonRunnerSupplier( Options runnerOptions, EventBus eventBus, BackendSupplier backendSupplier, - ObjectFactorySupplier objectFactory) { + ObjectFactorySupplier objectFactorySupplier, TypeRegistrySupplier typeRegistrySupplier) { this.backendSupplier = backendSupplier; this.runnerOptions = runnerOptions; this.eventBus = eventBus; - this.objectFactory = objectFactory; + this.objectFactorySupplier = objectFactorySupplier; + this.typeRegistrySupplier = typeRegistrySupplier; } + private Runner runner; + @Override public Runner get() { if (runner == null) { @@ -38,7 +41,13 @@ public Runner get() { } private Runner createRunner() { - return new Runner(eventBus, backendSupplier.get(), objectFactory.get(), runnerOptions); + return new Runner( + eventBus, + backendSupplier.get(), + objectFactorySupplier.get(), + typeRegistrySupplier.get(), + runnerOptions + ); } } diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java index b2698a2c57..2ac5a84e15 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java @@ -6,6 +6,7 @@ import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.event.AbstractEventBus; import io.cucumber.core.event.EventBus; +import io.cucumber.core.runner.Options; import io.cucumber.core.runner.Runner; /** @@ -18,19 +19,21 @@ public final class ThreadLocalRunnerSupplier implements RunnerSupplier { private final BackendSupplier backendSupplier; private final io.cucumber.core.runner.Options runnerOptions; private final SynchronizedEventBus sharedEventBus; - private final ObjectFactorySupplier objectFactory; + private final ObjectFactorySupplier objectFactorySupplier; + private final TypeRegistrySupplier typeRegistrySupplier; private final ThreadLocal runners = ThreadLocal.withInitial(this::createRunner); public ThreadLocalRunnerSupplier( - io.cucumber.core.runner.Options runnerOptions, + Options runnerOptions, EventBus sharedEventBus, BackendSupplier backendSupplier, - ObjectFactorySupplier objectFactory) { + ObjectFactorySupplier objectFactorySupplier, TypeRegistrySupplier typeRegistrySupplier) { this.runnerOptions = runnerOptions; this.sharedEventBus = SynchronizedEventBus.synchronize(sharedEventBus); this.backendSupplier = backendSupplier; - this.objectFactory = objectFactory; + this.objectFactorySupplier = objectFactorySupplier; + this.typeRegistrySupplier = typeRegistrySupplier; } @Override @@ -39,7 +42,13 @@ public Runner get() { } private Runner createRunner() { - return new Runner(new LocalEventBus(sharedEventBus), backendSupplier.get(), objectFactory.get(), runnerOptions); + return new Runner( + new LocalEventBus(sharedEventBus), + backendSupplier.get(), + objectFactorySupplier.get(), + typeRegistrySupplier.get(), + runnerOptions + ); } private static final class LocalEventBus extends AbstractEventBus { diff --git a/core/src/main/java/io/cucumber/core/runtime/TypeRegistrySupplier.java b/core/src/main/java/io/cucumber/core/runtime/TypeRegistrySupplier.java new file mode 100644 index 0000000000..5a4d2e32b7 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runtime/TypeRegistrySupplier.java @@ -0,0 +1,7 @@ +package io.cucumber.core.runtime; + +import io.cucumber.core.stepexpression.TypeRegistry; + +public interface TypeRegistrySupplier { + TypeRegistry get(); +} diff --git a/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java b/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java index a1f2571e2d..2ac1f83c25 100644 --- a/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java +++ b/core/src/test/java/io/cucumber/core/backend/StubBackendProviderService.java @@ -1,18 +1,15 @@ package io.cucumber.core.backend; -import gherkin.pickles.PickleStep; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.snippets.SnippetType; -import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.snippets.Snippet; +import io.cucumber.core.snippets.TestSnippet; import java.net.URI; import java.util.List; -import static java.util.Collections.emptyList; - public class StubBackendProviderService implements BackendProviderService { @Override - public Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + public Backend create(Lookup lookup, Container container, ResourceLoader resourceLoader) { return new StubBackend(); } @@ -34,8 +31,10 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, SnippetType snippetType) { - return emptyList(); + public Snippet getSnippet(){ + return new TestSnippet(); } + } + } diff --git a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java index c9ddfc536b..321d4d8df7 100755 --- a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java @@ -25,6 +25,8 @@ import io.cucumber.core.options.CommandlineOptionsParser; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runner.TestHelper; +import io.cucumber.core.snippets.Snippet; +import io.cucumber.core.snippets.TestSnippet; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.stubbing.Answer; @@ -1170,11 +1172,6 @@ public void loadGlue(Glue glue, List gluePaths) { glue.addBeforeHook(hook); } - - @Override - public List getSnippet(PickleStep step, String keyword, SnippetType snippetType) { - return singletonList("TEST SNIPPET"); - } }; final EventBus bus = new TimeServiceEventBus(new ClockStub(ofMillis(1234L))); @@ -1212,11 +1209,6 @@ public void loadGlue(Glue glue, List gluePaths) { glue.addBeforeHook(hook); } - - @Override - public List getSnippet(PickleStep step, String keyword, SnippetType snippetType) { - return singletonList("TEST SNIPPET"); - } }; final EventBus bus = new TimeServiceEventBus(new ClockStub(ofMillis(1234L))); diff --git a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index 7558e9843e..5270b89408 100644 --- a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -1,5 +1,10 @@ package io.cucumber.core.runner; +import gherkin.pickles.Argument; +import gherkin.pickles.PickleCell; +import gherkin.pickles.PickleLocation; +import gherkin.pickles.PickleRow; +import gherkin.pickles.PickleStep; import gherkin.pickles.PickleString; import gherkin.pickles.PickleTable; import gherkin.pickles.PickleTag; @@ -7,11 +12,6 @@ import io.cucumber.core.backend.DuplicateStepDefinitionException; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; -import gherkin.pickles.Argument; -import gherkin.pickles.PickleCell; -import gherkin.pickles.PickleLocation; -import gherkin.pickles.PickleRow; -import gherkin.pickles.PickleStep; import io.cucumber.core.event.EventBus; import io.cucumber.core.stepexpression.ArgumentMatcher; import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; @@ -40,20 +40,21 @@ public class CachingGlueTest { - private CachingGlue glue = new CachingGlue(mock(EventBus.class)); + private final TypeRegistry typeRegistry = new TypeRegistry(ENGLISH); + private CachingGlue glue = new CachingGlue(mock(EventBus.class), typeRegistry); @Test public void throws_duplicate_error_on_dupe_stepdefs() { StepDefinition a = mock(StepDefinition.class); when(a.getPattern()).thenReturn("hello"); when(a.getLocation(true)).thenReturn("foo.bf:10"); - glue.addStepDefinition(a); + glue.addStepDefinition(typeRegistry -> a); StepDefinition b = mock(StepDefinition.class); when(b.getPattern()).thenReturn("hello"); when(b.getLocation(true)).thenReturn("bar.bf:90"); try { - glue.addStepDefinition(b); + glue.addStepDefinition(typeRegistry -> b); fail("should have failed"); } catch (DuplicateStepDefinitionException expected) { assertEquals("Duplicate step definitions in foo.bf:10 and bar.bf:90", expected.getMessage()); @@ -68,7 +69,7 @@ public void removes_glue_that_is_scenario_scoped() { StepDefinition sd = spy(new MockedScenarioScopedStepDefinition()); when(sd.getPattern()).thenReturn("pattern"); - glue.addStepDefinition(sd); + glue.addStepDefinition(typeRegistry -> sd); HookDefinition bh = spy(new MockedScenarioScopedHookDefinition()); glue.addBeforeHook(bh); @@ -90,7 +91,7 @@ public void removes_glue_that_is_scenario_scoped() { @Test public void removes_scenario_scoped_cache_entries() { StepDefinition sd = new MockedScenarioScopedStepDefinition("pattern"); - glue.addStepDefinition(sd); + glue.addStepDefinition(typeRegistry -> sd); String featurePath = "someFeature.feature"; String stepText = "pattern"; @@ -107,7 +108,7 @@ public void removes_scenario_scoped_cache_entries() { @Test public void returns_null_if_no_matching_steps_found() { StepDefinition stepDefinition = spy(new MockedStepDefinition("pattern1")); - glue.addStepDefinition(stepDefinition); + glue.addStepDefinition(typeRegistry -> stepDefinition); String featurePath = "someFeature.feature"; PickleStep pickleStep = getPickleStep("pattern"); @@ -119,8 +120,8 @@ public void returns_null_if_no_matching_steps_found() { public void returns_match_from_cache_if_single_found() { StepDefinition stepDefinition1 = spy(new MockedStepDefinition("^pattern1")); StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); - glue.addStepDefinition(stepDefinition1); - glue.addStepDefinition(stepDefinition2); + glue.addStepDefinition(typeRegistry -> stepDefinition1); + glue.addStepDefinition(typeRegistry -> stepDefinition2); String featurePath = "someFeature.feature"; String stepText = "pattern1"; @@ -146,8 +147,8 @@ public void returns_match_from_cache_if_single_found() { public void returns_match_from_cache_for_step_with_table() { StepDefinition stepDefinition1 = spy(new MockedStepDefinition("^pattern1")); StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); - glue.addStepDefinition(stepDefinition1); - glue.addStepDefinition(stepDefinition2); + glue.addStepDefinition(typeRegistry -> stepDefinition1); + glue.addStepDefinition(typeRegistry -> stepDefinition2); String featurePath = "someFeature.feature"; String stepText = "pattern1"; @@ -185,8 +186,8 @@ public void returns_match_from_cache_for_step_with_table() { public void returns_match_from_cache_for_ste_with_doc_string() { StepDefinition stepDefinition1 = spy(new MockedStepDefinition("^pattern1")); StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); - glue.addStepDefinition(stepDefinition1); - glue.addStepDefinition(stepDefinition2); + glue.addStepDefinition(typeRegistry -> stepDefinition1); + glue.addStepDefinition(typeRegistry -> stepDefinition2); String featurePath = "someFeature.feature"; String stepText = "pattern1"; @@ -234,9 +235,9 @@ public void throws_ambiguous_steps_def_exception_when_many_patterns_match() { StepDefinition stepDefinition1 = new MockedStepDefinition("pattern1"); StepDefinition stepDefinition2 = new MockedStepDefinition("^pattern2"); StepDefinition stepDefinition3 = new MockedStepDefinition("^pattern[1,3]"); - glue.addStepDefinition(stepDefinition1); - glue.addStepDefinition(stepDefinition2); - glue.addStepDefinition(stepDefinition3); + glue.addStepDefinition(typeRegistry -> stepDefinition1); + glue.addStepDefinition(typeRegistry -> stepDefinition2); + glue.addStepDefinition(typeRegistry -> stepDefinition3); String featurePath = "someFeature.feature"; checkAmbiguousCalled(featurePath); diff --git a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java index 745f336086..706633ab7f 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java @@ -1,19 +1,17 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.Scenario; -import io.cucumber.core.backend.Glue; -import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.event.EventBus; -import io.cucumber.core.io.MultiLoader; -import io.cucumber.core.options.Env; -import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.runtime.StubStepDefinition; import gherkin.events.PickleEvent; import gherkin.pickles.Argument; import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; +import io.cucumber.core.api.Scenario; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.event.EventBus; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runtime.StubStepDefinition; import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Test; import org.mockito.ArgumentMatchers; @@ -26,7 +24,6 @@ import java.util.List; import java.util.Locale; -import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; @@ -38,6 +35,7 @@ public class HookOrderTest { private final RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); private final EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); + private final TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); private final StubStepDefinition stepDefinition = new StubStepDefinition("pattern1", new TypeRegistry(Locale.ENGLISH)); private final PickleStep pickleStep = new PickleStep("pattern1", Collections.emptyList(), singletonList(new PickleLocation(2,2))); @@ -48,10 +46,10 @@ public class HookOrderTest { public void before_hooks_execute_in_order() throws Throwable { final List hooks = mockHooks(3, Integer.MAX_VALUE, 1, -1, 0, 10000, Integer.MIN_VALUE); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(new StubStepDefinition("pattern1", new TypeRegistry(Locale.ENGLISH))); + glue.addStepDefinition(typeRegistry -> new StubStepDefinition("pattern1", typeRegistry)); for (HookDefinition hook : hooks) { glue.addBeforeHook(hook); } @@ -75,10 +73,10 @@ public void loadGlue(Glue glue, List gluePaths) { public void before_step_hooks_execute_in_order() throws Throwable { final List hooks = mockHooks(3, Integer.MAX_VALUE, 1, -1, 0, 10000, Integer.MIN_VALUE); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(stepDefinition); + glue.addStepDefinition(typeRegistry -> stepDefinition); for (HookDefinition hook : hooks) { glue.addBeforeStepHook(hook); } @@ -102,10 +100,10 @@ public void loadGlue(Glue glue, List gluePaths) { public void after_hooks_execute_in_reverse_order() throws Throwable { final List hooks = mockHooks(Integer.MIN_VALUE, 2, Integer.MAX_VALUE, 4, -1, 0, 10000); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(stepDefinition); + glue.addStepDefinition(typeRegistry -> stepDefinition); for (HookDefinition hook : hooks) { glue.addAfterHook(hook); } @@ -129,10 +127,10 @@ public void loadGlue(Glue glue, List gluePaths) { public void after_step_hooks_execute_in_reverse_order() throws Throwable { final List hooks = mockHooks(Integer.MIN_VALUE, 2, Integer.MAX_VALUE, 4, -1, 0, 10000); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(stepDefinition); + glue.addStepDefinition(typeRegistry -> stepDefinition); for (HookDefinition hook : hooks) { glue.addAfterStepHook(hook); } @@ -158,10 +156,10 @@ public void hooks_order_across_many_backends() throws Throwable { final List backend2Hooks = mockHooks(2, Integer.MAX_VALUE, 4); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(stepDefinition); + glue.addStepDefinition(typeRegistry -> stepDefinition); for (HookDefinition hook : backend1Hooks) { glue.addBeforeHook(hook); @@ -180,12 +178,12 @@ public void loadGlue(Glue glue, List gluePaths) { allHooks.addAll(backend2Hooks); InOrder inOrder = inOrder(allHooks.toArray()); - inOrder.verify(backend1Hooks.get(2)).execute(ArgumentMatchers.any()); - inOrder.verify(backend2Hooks.get(0)).execute(ArgumentMatchers.any()); - inOrder.verify(backend1Hooks.get(0)).execute(ArgumentMatchers.any()); - inOrder.verify(backend2Hooks.get(2)).execute(ArgumentMatchers.any()); - verify(backend2Hooks.get(1)).execute(ArgumentMatchers.any()); - verify(backend1Hooks.get(1)).execute(ArgumentMatchers.any()); + inOrder.verify(backend1Hooks.get(2)).execute(ArgumentMatchers.any()); + inOrder.verify(backend2Hooks.get(0)).execute(ArgumentMatchers.any()); + inOrder.verify(backend1Hooks.get(0)).execute(ArgumentMatchers.any()); + inOrder.verify(backend2Hooks.get(2)).execute(ArgumentMatchers.any()); + inOrder.verify(backend1Hooks.get(1)).execute(ArgumentMatchers.any()); + inOrder.verify(backend2Hooks.get(1)).execute(ArgumentMatchers.any()); } private List mockHooks(int... ordering) { diff --git a/core/src/test/java/io/cucumber/core/runner/HookTest.java b/core/src/test/java/io/cucumber/core/runner/HookTest.java index be88444099..e6d57a5a70 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTest.java @@ -15,6 +15,7 @@ import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.InOrder; @@ -24,6 +25,7 @@ import java.net.URI; import java.time.Clock; import java.util.Collections; +import java.util.Locale; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; @@ -49,6 +51,7 @@ public void after_hooks_execute_before_objects_are_disposed() throws Throwable { Backend backend = mock(Backend.class); ObjectFactory objectFactory = mock(ObjectFactory.class); + TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); final HookDefinition hook = mock(HookDefinition.class); when(hook.matches(ArgumentMatchers.anyCollection())).thenReturn(true); @@ -61,7 +64,7 @@ public Object answer(InvocationOnMock invocation) { } }).when(backend).loadGlue(any(Glue.class), ArgumentMatchers.anyList()); - Runner runner = new Runner(bus, Collections.singleton(backend), objectFactory, runtimeOptions); + Runner runner = new Runner(bus, Collections.singleton(backend), objectFactory, typeRegistry, runtimeOptions); runner.runPickle(pickleEvent); diff --git a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java index c0ca9ef5ba..e6f378fc59 100644 --- a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -6,7 +6,6 @@ import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; -import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; @@ -15,7 +14,9 @@ import io.cucumber.core.event.EventBus; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.options.RuntimeOptionsBuilder; +import io.cucumber.core.snippets.TestSnippet; import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.InOrder; @@ -27,11 +28,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.inOrder; @@ -49,6 +50,7 @@ public class RunnerTest { private final RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); private final EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); + private final TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); @Test public void hooks_execute_when_world_exist() throws Throwable { @@ -56,6 +58,7 @@ public void hooks_execute_when_world_exist() throws Throwable { final HookDefinition afterHook = addAfterHook(); Backend backend = mock(Backend.class); + when(backend.getSnippet()).thenReturn(new TestSnippet()); ObjectFactory objectFactory = mock(ObjectFactory.class); doAnswer(new Answer() { @Override @@ -69,8 +72,9 @@ public Object answer(InvocationOnMock invocation) { PickleStep step = mock(PickleStep.class); + when(step.getText()).thenReturn("some step"); - new Runner(bus, singletonList(backend), objectFactory, runtimeOptions).runPickle(createPickleEventWithSteps(asList(step))); + new Runner(bus, singletonList(backend), objectFactory, typeRegistry, runtimeOptions).runPickle(createPickleEventWithSteps(asList(step))); InOrder inOrder = inOrder(beforeHook, afterHook, backend); inOrder.verify(backend).buildWorld(); @@ -86,11 +90,11 @@ public void steps_are_skipped_after_failure() throws Throwable { final HookDefinition failingBeforeHook = addBeforeHook(); doThrow(RuntimeException.class).when(failingBeforeHook).execute(ArgumentMatchers.any()); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addBeforeHook(failingBeforeHook); - glue.addStepDefinition(stepDefinition); + glue.addStepDefinition(typeRegistry -> stepDefinition); } }; @@ -109,11 +113,11 @@ public void aftersteps_are_executed_after_failed_step() throws Throwable { final HookDefinition afteStepHook = addAfterStepHook(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addAfterHook(afteStepHook); - glue.addStepDefinition(stepDefinition); + glue.addStepDefinition(typeRegistry -> stepDefinition); } }; @@ -132,12 +136,12 @@ public void aftersteps_executed_for_passed_step() throws Throwable { final HookDefinition afteStepHook1 = addAfterStepHook(); final HookDefinition afteStepHook2 = addAfterStepHook(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addAfterHook(afteStepHook1); glue.addAfterHook(afteStepHook2); - glue.addStepDefinition(stepDefinition); + glue.addStepDefinition(typeRegistry -> stepDefinition); } }; @@ -156,7 +160,7 @@ public void hooks_execute_also_after_failure() throws Throwable { final HookDefinition beforeHook = addBeforeHook(); final HookDefinition afterHook = addAfterHook(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addBeforeHook(failingBeforeHook); @@ -166,6 +170,7 @@ public void loadGlue(Glue glue, List gluePaths) { }; PickleStep step = mock(PickleStep.class); + when(step.getText()).thenReturn("some step"); runnerSupplier.get().runPickle(createPickleEventWithSteps(asList(step))); InOrder inOrder = inOrder(failingBeforeHook, beforeHook, afterHook); @@ -178,10 +183,10 @@ public void loadGlue(Glue glue, List gluePaths) { public void steps_are_executed() throws Throwable { final StepDefinition stepDefinition = mock(StepDefinition.class); PickleEvent pickleEventMatchingStepDefinitions = createPickleEventMatchingStepDefinitions(asList(stepDefinition)); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(stepDefinition); + glue.addStepDefinition(typeRegistry -> stepDefinition); } }; runnerSupplier.get().runPickle(pickleEventMatchingStepDefinitions); @@ -193,10 +198,10 @@ public void steps_are_not_executed_on_dry_run() throws Throwable { final StepDefinition stepDefinition = mock(StepDefinition.class); final PickleEvent pickleEvent = createPickleEventMatchingStepDefinitions(asList(stepDefinition)); RuntimeOptions runtimeOptions = new RuntimeOptionsBuilder().setDryRun().build(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(stepDefinition); + glue.addStepDefinition(typeRegistry -> stepDefinition); } }; @@ -212,7 +217,7 @@ public void hooks_not_executed_in_dry_run_mode() throws Throwable { final HookDefinition afterHook = addAfterHook(); final HookDefinition afterStepHook = addAfterStepHook(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { @@ -222,6 +227,7 @@ public void loadGlue(Glue glue, List gluePaths) { } }; PickleStep step = mock(PickleStep.class); + when(step.getText()).thenReturn("some step"); runnerSupplier.get().runPickle(createPickleEventWithSteps(asList(step))); @@ -236,7 +242,7 @@ public void hooks_not_executed_for_empty_pickles() throws Throwable { final HookDefinition afterHook = addAfterHook(); final HookDefinition afterStepHook = addAfterStepHook(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { @@ -256,11 +262,13 @@ public void loadGlue(Glue glue, List gluePaths) { @Test public void backends_are_asked_for_snippets_for_undefined_steps() { PickleStep step = mock(PickleStep.class); + when(step.getText()).thenReturn("some step"); Backend backend = mock(Backend.class); + when(backend.getSnippet()).thenReturn(new TestSnippet()); ObjectFactory objectFactory = mock(ObjectFactory.class); - Runner runner = new Runner(bus, singletonList(backend), objectFactory, runtimeOptions); + Runner runner = new Runner(bus, singletonList(backend), objectFactory, typeRegistry, runtimeOptions); runner.runPickle(createPickleEventWithSteps(asList(step))); - verify(backend).getSnippet(ArgumentMatchers.eq(step), anyString(), any(SnippetType.class)); + verify(backend).getSnippet(); } private HookDefinition addBeforeHook() { diff --git a/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java index 9f7f4cde22..f4124435e7 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestBackendSupplier.java @@ -1,9 +1,11 @@ package io.cucumber.core.runner; +import io.cucumber.core.snippets.Snippet; import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.backend.Backend; import io.cucumber.core.runtime.BackendSupplier; import gherkin.pickles.PickleStep; +import io.cucumber.core.snippets.TestSnippet; import java.util.Collection; import java.util.Collections; @@ -24,10 +26,11 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, SnippetType snippetType) { - return emptyList(); + public Snippet getSnippet() { + return new TestSnippet(); } + @Override public Collection get() { return Collections.singleton(this); diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index 299fcd1408..897ab3f13f 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -184,7 +184,7 @@ public String getLocation(boolean detail) { } }; - glue.addStepDefinition(stepDefinition); + glue.addStepDefinition(t -> stepDefinition); } } @@ -396,7 +396,7 @@ public Builder withTimeServiceIncrement(Duration timeServiceIncrement) { /** * Specifies what type of TimeService to be used by the {@link EventBus} - * {@link TimeServiceType#REAL_TIME} > {@link TimeService#SYSTEM} + * {@link TimeServiceType#REAL_TIME} > {@link Clock#systemUTC()} * {@link TimeServiceType#FIXED_INCREMENT} > {@link ClockStub} * {@link TimeServiceType#FIXED_INCREMENT_ON_STEP_START} > {@link StepDurationTimeService} *

        diff --git a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java index 1c805f70c5..d8a58bae12 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java @@ -1,38 +1,31 @@ package io.cucumber.core.runner; -import io.cucumber.core.snippets.SnippetType; -import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.Backend; +import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.event.EventBus; -import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.options.RuntimeOptions; -import gherkin.pickles.PickleStep; import io.cucumber.core.runtime.RunnerSupplier; +import io.cucumber.core.snippets.Snippet; +import io.cucumber.core.snippets.TestSnippet; import io.cucumber.core.stepexpression.TypeRegistry; import java.net.URI; import java.util.Collections; import java.util.List; -import static java.util.Collections.emptyList; - public class TestRunnerSupplier implements Backend, RunnerSupplier, ObjectFactory { private final EventBus bus; private final RuntimeOptions runtimeOptions; + private final TypeRegistry typeRegistry; - protected TestRunnerSupplier(EventBus bus, RuntimeOptions runtimeOptions) { + protected TestRunnerSupplier(EventBus bus, TypeRegistry typeRegistry, RuntimeOptions runtimeOptions) { this.bus = bus; + this.typeRegistry = typeRegistry; this.runtimeOptions = runtimeOptions; } - - @SuppressWarnings("unused") // Used by reflection - public TestRunnerSupplier(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { - this((EventBus) null, null); - } - @Override public void loadGlue(Glue glue, List gluePaths) { @@ -49,13 +42,13 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, SnippetType snippetType) { - return emptyList(); + public Snippet getSnippet() { + return new TestSnippet(); } @Override public Runner get() { - return new Runner(bus, Collections.singleton(this), this, runtimeOptions); + return new Runner(bus, Collections.singleton(this), this, typeRegistry, runtimeOptions); } @Override diff --git a/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java b/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java index b12eb50c1b..9c21a39bc0 100644 --- a/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java @@ -27,7 +27,7 @@ public void should_create_a_backend() { ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); - BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); + BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); assertThat(backendSupplier.get().iterator().next(), is(notNullValue())); } @@ -38,7 +38,7 @@ public void should_throw_an_exception_when_no_backend_could_be_found() { ResourceLoader resourceLoader = new MultiLoader(classLoader); ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); expectedException.expect(CucumberException.class); backendSupplier.get(emptyList()).iterator().next(); diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index 00ebf4cbb9..33415ef372 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -583,14 +583,14 @@ public void loadGlue(Glue glue, List gluePaths) { this.glue = glue; final io.cucumber.core.backend.StepDefinition mockedStepDefinition = new MockedStepDefinition(); definedStepDefinitions.add(mockedStepDefinition); - glue.addStepDefinition(mockedStepDefinition); + glue.addStepDefinition(typeRegistry -> mockedStepDefinition); } @Override public void buildWorld() { final io.cucumber.core.backend.StepDefinition mockedScenarioScopedStepDefinition = new MockedScenarioScopedStepDefinition(); definedStepDefinitions.add(mockedScenarioScopedStepDefinition); - glue.addStepDefinition(mockedScenarioScopedStepDefinition); + glue.addStepDefinition(typeRegistry -> mockedScenarioScopedStepDefinition); } }; @@ -718,7 +718,7 @@ public List get() { private void mockMatch(Glue glue, String text) { io.cucumber.core.backend.StepDefinition stepDefinition = new StubStepDefinition(text, TYPE_REGISTRY); - glue.addStepDefinition(stepDefinition); + glue.addStepDefinition(typeRegistry -> stepDefinition); } private void mockHook(Glue glue, HookDefinition hook, HookType hookType) { diff --git a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java index fbc988c046..986be3e650 100644 --- a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java @@ -30,9 +30,10 @@ public void before() { RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); - BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); EventBus eventBus = new TimeServiceEventBus(Clock.systemUTC()); - runnerSupplier = new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactory); + TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); + runnerSupplier = new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactory, typeRegistrySupplier); } @Test diff --git a/core/src/test/java/io/cucumber/core/runtime/TestTypeRegistrySupplier.java b/core/src/test/java/io/cucumber/core/runtime/TestTypeRegistrySupplier.java new file mode 100644 index 0000000000..85a86fc54e --- /dev/null +++ b/core/src/test/java/io/cucumber/core/runtime/TestTypeRegistrySupplier.java @@ -0,0 +1,13 @@ +package io.cucumber.core.runtime; + +import io.cucumber.core.stepexpression.TypeRegistry; + +import java.util.Locale; + +public class TestTypeRegistrySupplier implements TypeRegistrySupplier { + + @Override + public TypeRegistry get() { + return new TypeRegistry(Locale.ENGLISH); + } +} diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 1414ed4a1a..bf60b0640a 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -37,9 +37,10 @@ public void before() { ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); - BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactory); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); eventBus = new TimeServiceEventBus(Clock.systemUTC()); - runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactory); + TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); + runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactory, typeRegistrySupplier); } diff --git a/core/src/test/java/io/cucumber/core/snippets/TestSnippet.java b/core/src/test/java/io/cucumber/core/snippets/TestSnippet.java new file mode 100644 index 0000000000..f1a43dbbff --- /dev/null +++ b/core/src/test/java/io/cucumber/core/snippets/TestSnippet.java @@ -0,0 +1,26 @@ +package io.cucumber.core.snippets; + +import java.lang.reflect.Type; +import java.util.Map; + +public class TestSnippet implements Snippet { + @Override + public String template() { + return ""; + } + + @Override + public String tableHint() { + return ""; + } + + @Override + public String arguments(Map arguments) { + return ""; + } + + @Override + public String escapePattern(String pattern) { + return ""; + } +} diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 32ad5b302a..299e7f08c2 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -1,17 +1,15 @@ package io.cucumber.java; -import gherkin.pickles.PickleStep; -import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.Lookup; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; import io.cucumber.core.runtime.Invoker; -import io.cucumber.core.snippets.SnippetGenerator; -import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.snippets.Snippet; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -22,23 +20,20 @@ final class JavaBackend implements Backend { - private final TypeRegistry typeRegistry; - private final SnippetGenerator annotationSnippetGenerator; - + private final Lookup lookup; private final Container container; private final MethodScanner methodScanner; private Glue glue; - JavaBackend(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { - this(container, new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader()), typeRegistry); + JavaBackend(Lookup lookup, Container container, ResourceLoader resourceLoader) { + this(lookup, container, new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader())); } - JavaBackend(Container container, ClassFinder classFinder, TypeRegistry typeRegistry) { + JavaBackend(Lookup lookup, Container container, ClassFinder classFinder) { + this.lookup = lookup; this.container = container; this.methodScanner = new MethodScanner(classFinder); - this.annotationSnippetGenerator = new SnippetGenerator(new JavaSnippet(), typeRegistry.parameterTypeRegistry()); - this.typeRegistry = typeRegistry; } @Override @@ -59,57 +54,60 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, SnippetType snippetType) { - return annotationSnippetGenerator.getSnippet(step, keyword, snippetType); + public Snippet getSnippet() { + return new JavaSnippet(); } void addStepDefinition(Annotation annotation, Method method) { - try { - container.addClass(method.getDeclaringClass()); - glue.addStepDefinition( - new JavaStepDefinition( - method, - expression(annotation), - timeoutMillis(annotation), - container, - typeRegistry)); - } catch (CucumberException e) { - throw e; - } catch (Throwable e) { - throw new CucumberException(e); - } + String expression = expression(annotation); + long timeoutMillis = timeoutMillis(annotation); + container.addClass(method.getDeclaringClass()); + glue.addStepDefinition(typeRegistry -> + new JavaStepDefinition(method, expression, timeoutMillis, lookup, typeRegistry)); } void addHook(Annotation annotation, Method method) { if (container.addClass(method.getDeclaringClass())) { if (annotation.annotationType().equals(Before.class)) { - String tagExpression = ((Before) annotation).value(); - long timeout = ((Before) annotation).timeout(); - glue.addBeforeHook(new JavaHookDefinition(method, tagExpression, ((Before) annotation).order(), timeout, container)); + Before before = (Before) annotation; + String tagExpression = before.value(); + long timeout = before.timeout(); + glue.addBeforeHook(new JavaHookDefinition(method, tagExpression, before.order(), timeout, lookup)); } else if (annotation.annotationType().equals(After.class)) { - String tagExpression = ((After) annotation).value(); - long timeout = ((After) annotation).timeout(); - glue.addAfterHook(new JavaHookDefinition(method, tagExpression, ((After) annotation).order(), timeout, container)); + After after = (After) annotation; + String tagExpression = after.value(); + long timeout = after.timeout(); + glue.addAfterHook(new JavaHookDefinition(method, tagExpression, after.order(), timeout, lookup)); } else if (annotation.annotationType().equals(BeforeStep.class)) { - String tagExpression = ((BeforeStep) annotation).value(); - long timeout = ((BeforeStep) annotation).timeout(); - glue.addBeforeStepHook(new JavaHookDefinition(method, tagExpression, ((BeforeStep) annotation).order(), timeout, container)); + BeforeStep beforeStep = (BeforeStep) annotation; + String tagExpression = beforeStep.value(); + long timeout = beforeStep.timeout(); + glue.addBeforeStepHook(new JavaHookDefinition(method, tagExpression, beforeStep.order(), timeout, lookup)); } else if (annotation.annotationType().equals(AfterStep.class)) { - String tagExpression = ((AfterStep) annotation).value(); - long timeout = ((AfterStep) annotation).timeout(); - glue.addAfterStepHook(new JavaHookDefinition(method, tagExpression, ((AfterStep) annotation).order(), timeout, container)); + AfterStep afterStep = (AfterStep) annotation; + String tagExpression = afterStep.value(); + long timeout = afterStep.timeout(); + glue.addAfterStepHook(new JavaHookDefinition(method, tagExpression, afterStep.order(), timeout, lookup)); } } } - private String expression(Annotation annotation) throws Throwable { - Method expressionMethod = annotation.getClass().getMethod("value"); - return (String) Invoker.invoke(annotation, expressionMethod, 0); + private String expression(Annotation annotation) { + try { + Method expressionMethod = annotation.getClass().getMethod("value"); + return (String) Invoker.invoke(annotation, expressionMethod, 0); + } catch (Throwable e) { + throw new CucumberException(e); + } } - private long timeoutMillis(Annotation annotation) throws Throwable { - Method regexpMethod = annotation.getClass().getMethod("timeout"); - return (Long) Invoker.invoke(annotation, regexpMethod, 0); + private long timeoutMillis(Annotation annotation) { + try { + Method regexpMethod = annotation.getClass().getMethod("timeout"); + return (Long) Invoker.invoke(annotation, regexpMethod, 0); + } catch (Throwable throwable) { + throw new CucumberException(throwable); + } } } diff --git a/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java b/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java index 6971022886..8e34c771ef 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java +++ b/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java @@ -3,13 +3,14 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; import io.cucumber.core.backend.Container; +import io.cucumber.core.backend.Lookup; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.TypeRegistry; public final class JavaBackendProviderService implements BackendProviderService { @Override - public Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { - return new JavaBackend(container, resourceLoader, typeRegistry); + public Backend create(Lookup lookup, Container container, ResourceLoader resourceLoader) { + return new JavaBackend(lookup, container, resourceLoader); } } diff --git a/java/src/test/java/io/cucumber/java/JavaBackendTest.java b/java/src/test/java/io/cucumber/java/JavaBackendTest.java index 2a51a71336..091606fcbe 100644 --- a/java/src/test/java/io/cucumber/java/JavaBackendTest.java +++ b/java/src/test/java/io/cucumber/java/JavaBackendTest.java @@ -2,6 +2,7 @@ import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; @@ -21,6 +22,7 @@ import java.net.URI; import java.util.List; import java.util.Locale; +import java.util.function.Function; import static java.lang.Thread.currentThread; import static java.util.Arrays.asList; @@ -38,13 +40,13 @@ public class JavaBackendTest { public MockitoRule mockitoRule = MockitoJUnit.rule(); @Captor - public ArgumentCaptor stepDefinition; + public ArgumentCaptor> stepDefinition; @Mock private Glue glue; @Mock - private Container factory; + private ObjectFactory factory; private JavaBackend backend; @@ -52,8 +54,7 @@ public class JavaBackendTest { public void createBackend() { ClassLoader classLoader = currentThread().getContextClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); - TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); - this.backend = new JavaBackend(factory, resourceLoader, typeRegistry); + this.backend = new JavaBackend(factory, factory, resourceLoader); } @Test @@ -75,8 +76,11 @@ public void detects_repeated_annotations() { backend.loadGlue(glue, asList(URI.create("classpath:io/cucumber/java/repeatable"))); verify(glue, times(2)).addStepDefinition(stepDefinition.capture()); + TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); + List patterns = stepDefinition.getAllValues() .stream() + .map(stepDefinitionFunction -> stepDefinitionFunction.apply(typeRegistry)) .map(StepDefinition::getPattern) .collect(toList()); assertThat(patterns, equalTo(asList("test", "test again"))); diff --git a/java/src/test/java/io/cucumber/java/JavaHookTest.java b/java/src/test/java/io/cucumber/java/JavaHookTest.java index b029f4d137..65c41c40d6 100644 --- a/java/src/test/java/io/cucumber/java/JavaHookTest.java +++ b/java/src/test/java/io/cucumber/java/JavaHookTest.java @@ -1,14 +1,14 @@ package io.cucumber.java; +import gherkin.pickles.PickleLocation; +import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; -import io.cucumber.core.io.ClassFinder; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import gherkin.pickles.PickleLocation; -import gherkin.pickles.PickleTag; import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Rule; import org.junit.Test; @@ -71,8 +71,7 @@ public void createBackendAndLoadNoGlue() { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); - this.backend = new JavaBackend(objectFactory, classFinder, typeRegistry); + this.backend = new JavaBackend(objectFactory, objectFactory, classFinder); backend.loadGlue(glue, Collections.emptyList()); } diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index b0dcdb4f26..be54e49bd1 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -72,7 +72,7 @@ public void createBackendAndLoadNoGlue() { ResourceLoader resourceLoader = new MultiLoader(classLoader); ObjectFactory objectFactory = new SingletonFactory(defs); TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); - this.backend = new JavaBackend(objectFactory, resourceLoader, typeRegistry); + this.backend = new JavaBackend(objectFactory, objectFactory, resourceLoader); RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); BackendSupplier backendSupplier = new BackendSupplier() { @@ -81,7 +81,7 @@ public Collection get() { return asList(backend); } }; - this.runner = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, () -> objectFactory).get(); + this.runner = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, () -> objectFactory, () -> typeRegistry).get(); bus.registerHandlerFor(TestStepFinished.class, new EventHandler() { @Override diff --git a/java/src/test/java/io/cucumber/java/MethodScannerTest.java b/java/src/test/java/io/cucumber/java/MethodScannerTest.java index ed4a01d116..f2e69b7806 100644 --- a/java/src/test/java/io/cucumber/java/MethodScannerTest.java +++ b/java/src/test/java/io/cucumber/java/MethodScannerTest.java @@ -1,9 +1,8 @@ package io.cucumber.java; -import io.cucumber.core.backend.Container; -import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; @@ -17,12 +16,13 @@ import java.net.URI; import java.util.Collections; -import java.util.Locale; import static java.lang.Thread.currentThread; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; public class MethodScannerTest { @@ -30,25 +30,24 @@ public class MethodScannerTest { public MockitoRule mockitoRule = MockitoJUnit.rule(); @Mock - private Container factory; + private ObjectFactory factory; private ResourceLoaderClassFinder classFinder; private JavaBackend backend; @Before - public void createBackend(){ + public void createBackend() { ClassLoader classLoader = currentThread().getContextClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); this.classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); - this.backend = new JavaBackend(factory, classFinder, typeRegistry); + this.backend = new JavaBackend(factory, factory, classFinder); } @Test public void loadGlue_registers_the_methods_declaring_class_in_the_object_factory() throws NoSuchMethodException { MethodScanner methodScanner = new MethodScanner(classFinder); Glue world = Mockito.mock(Glue.class); - backend.loadGlue(world,Collections.emptyList()); + backend.loadGlue(world, Collections.emptyList()); // this delegates to methodScanner.scan which we test methodScanner.scan(backend, BaseStepDefs.class.getMethod("m"), BaseStepDefs.class); diff --git a/java8/src/main/java/io/cucumber/java8/Java8Backend.java b/java8/src/main/java/io/cucumber/java8/Java8Backend.java index 6e444078ae..ff0d6ee6cc 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8Backend.java +++ b/java8/src/main/java/io/cucumber/java8/Java8Backend.java @@ -1,16 +1,15 @@ package io.cucumber.java8; -import gherkin.pickles.PickleStep; -import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.Lookup; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.snippets.SnippetGenerator; +import io.cucumber.core.snippets.Snippet; import io.cucumber.core.stepexpression.TypeRegistry; import java.net.URI; @@ -23,20 +22,17 @@ final class Java8Backend implements Backend, LambdaGlueRegistry { - private final TypeRegistry typeRegistry; - private final SnippetGenerator lambdaSnippetGenerator; - + private final Lookup lookup; private final Container container; private final ClassFinder classFinder; private Glue glue; private List> lambdaGlueClasses = new ArrayList<>(); - Java8Backend(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + Java8Backend(Lookup lookup, Container container, ResourceLoader resourceLoader) { this.classFinder = new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader()); this.container = container; - this.lambdaSnippetGenerator = new SnippetGenerator(new Java8Snippet(), typeRegistry.parameterTypeRegistry()); - this.typeRegistry = typeRegistry; + this.lookup = lookup; } @Override @@ -59,29 +55,25 @@ public void loadGlue(Glue glue, List gluePaths) { public void buildWorld() { // Instantiate all the stepdef classes for java8 - the stepdef will be initialised // in the constructor. - try { - INSTANCE.set(this); - for (Class lambdaGlueClass: lambdaGlueClasses) { - container.getInstance(lambdaGlueClass); - } - } finally { - INSTANCE.remove(); + INSTANCE.set(this); + for (Class lambdaGlueClass: lambdaGlueClasses) { + lookup.getInstance(lambdaGlueClass); } } @Override public void disposeWorld() { - + INSTANCE.remove(); } @Override - public List getSnippet(PickleStep step, String keyword, SnippetType snippetType) { - return lambdaSnippetGenerator.getSnippet(step, keyword, snippetType); + public Snippet getSnippet() { + return new Java8Snippet(); } @Override public void addStepDefinition(Function stepDefinitionFunction) { - glue.addStepDefinition(stepDefinitionFunction.apply(typeRegistry)); + glue.addStepDefinition(stepDefinitionFunction); } @Override diff --git a/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java b/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java index 1a4977bdb6..c4c4175fce 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java +++ b/java8/src/main/java/io/cucumber/java8/Java8BackendProviderService.java @@ -3,13 +3,14 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; import io.cucumber.core.backend.Container; +import io.cucumber.core.backend.Lookup; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.stepexpression.TypeRegistry; public final class Java8BackendProviderService implements BackendProviderService { @Override - public Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { - return new Java8Backend(container, resourceLoader, typeRegistry); + public Backend create(Lookup lookup, Container container, ResourceLoader resourceLoader) { + return new Java8Backend(lookup, container, resourceLoader); } } diff --git a/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java b/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java index 2b397216e6..656715fd7c 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java @@ -1,23 +1,18 @@ package io.cucumber.java8; -import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; -import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.java8.stepdefs.Stepdefs; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import java.net.URI; -import java.util.Locale; import static java.lang.Thread.currentThread; import static java.util.Arrays.asList; @@ -28,14 +23,11 @@ public class Java8BackendTest { @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); - @Captor - public ArgumentCaptor stepDefinition; - @Mock private Glue glue; @Mock - private Container factory; + private ObjectFactory factory; private Java8Backend backend; @@ -43,8 +35,7 @@ public class Java8BackendTest { public void createBackend() { ClassLoader classLoader = currentThread().getContextClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); - TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); - this.backend = new Java8Backend(factory, resourceLoader, typeRegistry); + this.backend = new Java8Backend(factory, factory, resourceLoader); } @Test diff --git a/junit/src/main/java/io/cucumber/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java index 015f7ef69c..fad9bfa54e 100644 --- a/junit/src/main/java/io/cucumber/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java @@ -3,6 +3,7 @@ import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; +import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; import io.cucumber.core.runtime.ObjectFactorySupplier; import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier; import io.cucumber.core.event.EventBus; @@ -24,6 +25,7 @@ import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; import io.cucumber.core.feature.CucumberFeature; +import io.cucumber.core.runtime.TypeRegistrySupplier; import org.apiguardian.api.API; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -116,8 +118,9 @@ public Cucumber(Class clazz) throws InitializationError { this.bus = new TimeServiceEventBus(Clock.systemUTC()); ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(); - BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactorySupplier); - ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier); + BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, objectFactorySupplier); + TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); + ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier, typeRegistrySupplier); Filters filters = new Filters(runtimeOptions); for (CucumberFeature cucumberFeature : features) { FeatureRunner featureRunner = new FeatureRunner(cucumberFeature, filters, runnerSupplier, junitOptions); diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index 69085e7627..24b3a0b359 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -1,5 +1,10 @@ package io.cucumber.junit; +import io.cucumber.core.io.ClassFinder; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; import io.cucumber.core.runtime.ObjectFactorySupplier; import io.cucumber.core.runtime.SingletonObjectFactorySupplier; import io.cucumber.core.runner.TimeServiceEventBus; @@ -21,16 +26,19 @@ import java.time.ZoneId; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.Set; import static java.util.Arrays.asList; +import static java.util.Collections.singleton; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; +import static org.mockito.Mockito.when; public class FeatureRunnerTest { @@ -172,16 +180,15 @@ public Clock withZone(ZoneId zone) { return null; } }; - BackendSupplier backendSupplier = new BackendSupplier() { - @Override - public Collection get() { - return asList(mock(Backend.class)); - } - }; + BackendSupplier backendSupplier = () -> singleton(new StubBackendProviderService.StubBackend()); EventBus bus = new TimeServiceEventBus(clockStub); Filters filters = new Filters(runtimeOptions); - ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactory); + ClassLoader classLoader = ClassLoader.getSystemClassLoader(); + ResourceLoader resourceLoader = new MultiLoader(classLoader); + ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); + ConfiguringTypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); + ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactory, typeRegistrySupplier); return new FeatureRunner(cucumberFeature, filters, runnerSupplier, junitOption); } diff --git a/junit/src/test/java/io/cucumber/junit/StubBackendProviderService.java b/junit/src/test/java/io/cucumber/junit/StubBackendProviderService.java index 6bc35759b6..1194ae915a 100644 --- a/junit/src/test/java/io/cucumber/junit/StubBackendProviderService.java +++ b/junit/src/test/java/io/cucumber/junit/StubBackendProviderService.java @@ -1,24 +1,23 @@ package io.cucumber.junit; -import gherkin.pickles.PickleStep; -import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.Lookup; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.snippets.Snippet; +import java.lang.reflect.Type; import java.net.URI; import java.util.List; - -import static java.util.Collections.singletonList; +import java.util.Map; public class StubBackendProviderService implements BackendProviderService { @Override - public Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + public Backend create(Lookup lookup, Container container, ResourceLoader resourceLoader) { return new StubBackend(); } @@ -43,8 +42,28 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, SnippetType snippetType) { - return singletonList("STUB SNIPPET"); + public Snippet getSnippet() { + return new Snippet() { + @Override + public String template() { + return ""; + } + + @Override + public String tableHint() { + return ""; + } + + @Override + public String arguments(Map arguments) { + return ""; + } + + @Override + public String escapePattern(String pattern) { + return ""; + } + }; } } diff --git a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java index bb2052a57d..2df600ea08 100644 --- a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java @@ -4,6 +4,7 @@ import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; import io.cucumber.core.runtime.ObjectFactorySupplier; import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier; import io.cucumber.core.event.EventBus; @@ -26,6 +27,7 @@ import io.cucumber.core.runtime.BackendServiceLoader; import io.cucumber.core.runtime.FeaturePathFeatureSupplier; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; +import io.cucumber.core.runtime.TypeRegistrySupplier; import org.apiguardian.api.API; import java.time.Clock; @@ -47,7 +49,7 @@ public final class TestNGCucumberRunner { /** * Bootstrap the cucumber runtime * - * @param clazz Which has the {@link io.cucumber.core.api.options.CucumberOptions} + * @param clazz Which has the {@link CucumberOptions} * and {@link org.testng.annotations.Test} annotations */ public TestNGCucumberRunner(Class clazz) { @@ -71,9 +73,10 @@ public TestNGCucumberRunner(Class clazz) { this.bus = new TimeServiceEventBus(Clock.systemUTC()); this.plugins = new Plugins(new PluginFactory(), runtimeOptions); ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(); - BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, classFinder, runtimeOptions, objectFactorySupplier); + BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactorySupplier); this.filters = new Filters(runtimeOptions); - this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier); + TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); + this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier, typeRegistrySupplier); } diff --git a/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java b/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java index 18acee3d4f..8186aac32d 100644 --- a/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java +++ b/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java @@ -2,26 +2,29 @@ import gherkin.pickles.PickleStep; -import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.Lookup; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.snippets.Snippet; +import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.stepexpression.Argument; -import io.cucumber.core.stepexpression.TypeRegistry; +import java.lang.reflect.Type; import java.net.URI; import java.util.Collections; import java.util.List; +import java.util.Map; import static java.util.Collections.singletonList; public class StubBackendProviderService implements BackendProviderService { @Override - public Backend create(Container container, ResourceLoader resourceLoader, TypeRegistry typeRegistry) { + public Backend create(Lookup lookup, Container container, ResourceLoader resourceLoader) { return new StubBackend(); } @@ -35,14 +38,14 @@ private static class StubBackend implements Backend { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(createStepDefinition("background step")); - glue.addStepDefinition(createStepDefinition("scenario name")); - glue.addStepDefinition(createStepDefinition("scenario C")); - glue.addStepDefinition(createStepDefinition("scenario D")); - glue.addStepDefinition(createStepDefinition("scenario E")); - glue.addStepDefinition(createStepDefinition("first step")); - glue.addStepDefinition(createStepDefinition("second step")); - glue.addStepDefinition(createStepDefinition("third step")); + glue.addStepDefinition(t -> createStepDefinition("background step")); + glue.addStepDefinition(t -> createStepDefinition("scenario name")); + glue.addStepDefinition(t -> createStepDefinition("scenario C")); + glue.addStepDefinition(t -> createStepDefinition("scenario D")); + glue.addStepDefinition(t -> createStepDefinition("scenario E")); + glue.addStepDefinition(t -> createStepDefinition("first step")); + glue.addStepDefinition(t -> createStepDefinition("second step")); + glue.addStepDefinition(t -> createStepDefinition("third step")); } @@ -89,8 +92,28 @@ public void disposeWorld() { } @Override - public List getSnippet(PickleStep step, String keyword, SnippetType snippetType) { - return singletonList("STUB SNIPPET"); + public Snippet getSnippet() { + return new Snippet() { + @Override + public String template() { + return ""; + } + + @Override + public String tableHint() { + return ""; + } + + @Override + public String arguments(Map arguments) { + return ""; + } + + @Override + public String escapePattern(String pattern) { + return ""; + } + }; } } } From e969668a4e36ca29faa1eb8ae27887358141ac50 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 23 Jun 2019 16:47:45 +0200 Subject: [PATCH 099/155] [Core] Remove cycle between plugin and event --- .../io/cucumber/core/api/event/Event.java | 28 -------------- .../cucumber/core/api/plugin/Formatter.java | 11 ------ .../event => plugin}/CanonicalEventOrder.java | 37 +++++++++++++++++-- .../plugin/CanonicalOrderEventPublisher.java | 2 +- .../CanonicalEventOrderTest.java | 9 ++--- 5 files changed, 39 insertions(+), 48 deletions(-) delete mode 100644 core/src/main/java/io/cucumber/core/api/plugin/Formatter.java rename core/src/main/java/io/cucumber/core/{api/event => plugin}/CanonicalEventOrder.java (71%) rename core/src/test/java/io/cucumber/core/{api/event => plugin}/CanonicalEventOrderTest.java (96%) diff --git a/core/src/main/java/io/cucumber/core/api/event/Event.java b/core/src/main/java/io/cucumber/core/api/event/Event.java index cfb711fa3a..8e92dc3b40 100644 --- a/core/src/main/java/io/cucumber/core/api/event/Event.java +++ b/core/src/main/java/io/cucumber/core/api/event/Event.java @@ -1,36 +1,8 @@ package io.cucumber.core.api.event; import java.time.Instant; -import java.util.Comparator; - public interface Event { - /** - * When pickles are executed in parallel events can be - * produced with a partial ordering. - *

        - * The canonical order is the order in which these events - * would have been generated had cucumber executed these - * pickles in a serial fashion. - *

        - * In canonical order events are first ordered by type: - *

          - *
        1. TestRunStarted - *
        2. TestSourceRead - *
        3. SnippetsSuggestedEvent - *
        4. TestCaseEvent - *
        5. TestRunFinished - *
        - *

        - * Then TestCaseEvents are ordered by - *

          - *
        1. uri - *
        2. line - *
        3. timestamp - *
        - */ - Comparator CANONICAL_ORDER = new CanonicalEventOrder(); - /** * Returns instant from epoch. * diff --git a/core/src/main/java/io/cucumber/core/api/plugin/Formatter.java b/core/src/main/java/io/cucumber/core/api/plugin/Formatter.java deleted file mode 100644 index d8fecd4033..0000000000 --- a/core/src/main/java/io/cucumber/core/api/plugin/Formatter.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.cucumber.core.api.plugin; - -import io.cucumber.core.api.event.EventListener; - -/** - * @deprecated as of version 4.0.0; use {@link EventListener } and {@link Plugin } instead. - * Optionally, use {@link ColorAware } and/or {@link StrictAware } instead of {@link Plugin }. - */ -@Deprecated -public interface Formatter extends EventListener, Plugin { -} diff --git a/core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java b/core/src/main/java/io/cucumber/core/plugin/CanonicalEventOrder.java similarity index 71% rename from core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java rename to core/src/main/java/io/cucumber/core/plugin/CanonicalEventOrder.java index 7b5ce3e0b1..6a3e5d35e8 100644 --- a/core/src/main/java/io/cucumber/core/api/event/CanonicalEventOrder.java +++ b/core/src/main/java/io/cucumber/core/plugin/CanonicalEventOrder.java @@ -1,10 +1,42 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.plugin; + +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.SnippetsSuggestedEvent; +import io.cucumber.core.api.event.StepDefinedEvent; +import io.cucumber.core.api.event.TestCaseEvent; +import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.api.event.TestRunStarted; +import io.cucumber.core.api.event.TestSourceRead; import java.util.Comparator; import java.util.List; import static java.util.Arrays.asList; +/** + * When pickles are executed in parallel events can be + * produced with a partial ordering. + *

        + * The canonical order is the order in which these events + * would have been generated had cucumber executed these + * pickles in a serial fashion. + *

        + * In canonical order events are first ordered by type: + *

          + *
        1. TestRunStarted + *
        2. TestSourceRead + *
        3. SnippetsSuggestedEvent + *
        4. TestCaseEvent + *
        5. TestRunFinished + *
        + *

        + * Then TestCaseEvents are ordered by + *

          + *
        1. uri + *
        2. line + *
        3. timestamp + *
        + */ final class CanonicalEventOrder implements Comparator { private static final FixedEventOrderComparator fixedOrder = new FixedEventOrderComparator(); @@ -27,8 +59,7 @@ public int compare(Event a, Event b) { private static final class FixedEventOrderComparator implements Comparator { private final List> fixedOrder = asList( - (Class) - TestRunStarted.class, + TestRunStarted.class, TestSourceRead.class, SnippetsSuggestedEvent.class, StepDefinedEvent.class, diff --git a/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java b/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java index 659b5d73d0..dc9c1dbe0b 100644 --- a/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java @@ -15,7 +15,7 @@ final class CanonicalOrderEventPublisher extends AbstractEventPublisher { public void handle(final Event event) { queue.add(event); if (event instanceof TestRunFinished) { - Collections.sort(queue, Event.CANONICAL_ORDER); + queue.sort(new CanonicalEventOrder()); sendAll(queue); queue.clear(); } diff --git a/core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java b/core/src/test/java/io/cucumber/core/plugin/CanonicalEventOrderTest.java similarity index 96% rename from core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java rename to core/src/test/java/io/cucumber/core/plugin/CanonicalEventOrderTest.java index ce4cf99658..dfc00e858e 100644 --- a/core/src/test/java/io/cucumber/core/api/event/CanonicalEventOrderTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/CanonicalEventOrderTest.java @@ -1,10 +1,9 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.plugin; -import io.cucumber.core.api.event.TestCase; import gherkin.pickles.PickleLocation; -import io.cucumber.core.api.event.CanonicalEventOrder; import io.cucumber.core.api.event.Event; import io.cucumber.core.api.event.SnippetsSuggestedEvent; +import io.cucumber.core.api.event.TestCase; import io.cucumber.core.api.event.TestCaseStarted; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; @@ -32,7 +31,7 @@ private static Instant getInstant() { return Instant.now(); } - static Event createTestCaseEvent(final String uri, final int line) { + private static Event createTestCaseEvent(final String uri, final int line) { final TestCase testCase = mock(TestCase.class); given(testCase.getUri()).willReturn(uri); given(testCase.getLine()).willReturn(line); @@ -41,7 +40,7 @@ static Event createTestCaseEvent(final String uri, final int line) { private Event runStarted = new TestRunStarted(getInstant()); private Event testRead = new TestSourceRead(getInstant(), "uri", "source"); - private Event suggested = new SnippetsSuggestedEvent(getInstant(), "uri", Collections.emptyList(), Collections.emptyList()); + private Event suggested = new SnippetsSuggestedEvent(getInstant(), "uri", Collections.emptyList(), Collections.emptyList()); private Event feature1Case1Started = createTestCaseEvent("feature1", 1); private Event feature1Case2Started = createTestCaseEvent("feature1", 9); private Event feature1Case3Started = createTestCaseEvent("feature1", 11); From 84f001fbeeda474ac1b411314c112185c3c26540 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 23 Jun 2019 21:42:22 +0200 Subject: [PATCH 100/155] [Core] Ignore known old plugin implementations from IntelliJ IDEA --- .../io/cucumber/core/options/PluginOption.java | 17 +++++++++++++++++ .../core/options/RuntimeOptionsTest.java | 11 +++++++++++ 2 files changed, 28 insertions(+) diff --git a/core/src/main/java/io/cucumber/core/options/PluginOption.java b/core/src/main/java/io/cucumber/core/options/PluginOption.java index 9f2bf7b962..88cf5d316d 100644 --- a/core/src/main/java/io/cucumber/core/options/PluginOption.java +++ b/core/src/main/java/io/cucumber/core/options/PluginOption.java @@ -5,6 +5,8 @@ import io.cucumber.core.api.event.ConcurrentEventListener; import io.cucumber.core.api.event.EventListener; import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.logging.Logger; +import io.cucumber.core.logging.LoggerFactory; import io.cucumber.core.plugin.DefaultSummaryPrinter; import io.cucumber.core.plugin.HTMLFormatter; import io.cucumber.core.plugin.JSONFormatter; @@ -25,6 +27,8 @@ public class PluginOption implements Options.Plugin { + private static final Logger log = LoggerFactory.getLogger(PluginOption.class); + private static final Pattern PLUGIN_WITH_ARGUMENT_PATTERN = Pattern.compile("([^:]+):(.*)"); private static final HashMap> PLUGIN_CLASSES = new HashMap>() {{ put("junit", JUnitFormatter.class); @@ -42,6 +46,13 @@ public class PluginOption implements Options.Plugin { put("timeline", TimelineFormatter.class); }}; + // Refuse plugins known to implement the old API + private static final HashMap> OLD_INTELLIJ_IDEA_PLUGIN_CLASSES = new HashMap>() {{ + put("org.jetbrains.plugins.cucumber.java.run.CucumberJvmSMFormatter", PrettyFormatter.class); + put("org.jetbrains.plugins.cucumber.java.run.CucumberJvm2SMFormatter", PrettyFormatter.class); + put("org.jetbrains.plugins.cucumber.java.run.CucumberJvm3SMFormatter", PrettyFormatter.class); + }}; + private final String pluginString; private final Class pluginClass; private final String argument; @@ -86,6 +97,12 @@ static PluginOption parse(String pluginArgumentPattern) { } private static Class parsePluginName(String pluginName) { + Class oldApiPlugin = OLD_INTELLIJ_IDEA_PLUGIN_CLASSES.get(pluginName); + if (oldApiPlugin != null) { + log.warn("Incompatible IntelliJ IDEA Plugin detected. Falling back to pretty formatter"); + return oldApiPlugin; + } + Class pluginClass = PLUGIN_CLASSES.get(pluginName); if (pluginClass == null) { pluginClass = loadClass(pluginName); diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index 77c0038c89..d61d3a5ea2 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -205,6 +205,17 @@ public void creates_null_summary_printer() { assertThat(plugins.getPlugins(), not(hasItem(plugin("io.cucumber.core.plugin.DefaultSummaryPrinter")))); } + @Test + public void replaces_incompatible_intellij_idea_plugin() { + RuntimeOptions options = new CommandlineOptionsParser() + .parse("--plugin", "org.jetbrains.plugins.cucumber.java.run.CucumberJvm3SMFormatter") + .build(); + Plugins plugins = new Plugins(new PluginFactory(), options); + plugins.setEventBusOnEventListenerPlugins(new TimeServiceEventBus(Clock.systemUTC())); + + assertThat(plugins.getPlugins(), not(hasItem(plugin("io.cucumber.core.plugin.PrettyPrinter")))); + } + @Test public void assigns_strict() { RuntimeOptions options = new CommandlineOptionsParser() From 0d7df4e584a8bdf1f66ffe53be167f021b876c3f Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Mon, 24 Jun 2019 23:17:16 +0200 Subject: [PATCH 101/155] [Guice] Clean up and mark public API --- guice/pom.xml | 4 + .../guice/{api => }/CucumberModules.java | 11 +- .../guice/{api => }/CucumberScopes.java | 11 +- .../java/io/cucumber/guice/GuiceFactory.java | 5 +- .../guice/{api => }/InjectorSource.java | 6 +- .../cucumber/guice/InjectorSourceFactory.java | 4 +- .../guice/{api => }/ScenarioModule.java | 2 +- .../guice/{api => }/ScenarioScope.java | 4 +- .../guice/{api => }/ScenarioScoped.java | 11 +- .../{api => }/SequentialScenarioScope.java | 3 +- .../io/cucumber/guice/api/package-info.java | 151 ----------------- .../java/io/cucumber/guice/package-info.java | 155 +++++++++++++++++- .../io/cucumber/guice/GuiceFactoryTest.java | 4 +- .../guice/InjectorSourceFactoryTest.java | 78 +++++---- .../impl/LivesInChildClassLoader.java.txt | 2 +- .../guice/integration/HelloWorldSteps.java | 2 +- .../integration/ScenarioScopedSteps.java | 2 +- .../integration/SingletonScopedSteps.java | 2 +- .../guice/integration/YourInjectorSource.java | 4 +- .../guice/integration/YourModule.java | 2 +- .../impl/LivesInChildClassLoader.class.bin | Bin 489 -> 485 bytes 21 files changed, 239 insertions(+), 224 deletions(-) rename guice/src/main/java/io/cucumber/guice/{api => }/CucumberModules.java (83%) rename guice/src/main/java/io/cucumber/guice/{api => }/CucumberScopes.java (86%) rename guice/src/main/java/io/cucumber/guice/{api => }/InjectorSource.java (56%) rename guice/src/main/java/io/cucumber/guice/{api => }/ScenarioModule.java (94%) rename guice/src/main/java/io/cucumber/guice/{api => }/ScenarioScope.java (74%) rename guice/src/main/java/io/cucumber/guice/{api => }/ScenarioScoped.java (68%) rename guice/src/main/java/io/cucumber/guice/{api => }/SequentialScenarioScope.java (96%) delete mode 100644 guice/src/main/java/io/cucumber/guice/api/package-info.java diff --git a/guice/pom.xml b/guice/pom.xml index 55305c74c9..9abde1c3cc 100644 --- a/guice/pom.xml +++ b/guice/pom.xml @@ -21,6 +21,10 @@ io.cucumber cucumber-java + + org.apiguardian + apiguardian-api + com.google.inject guice diff --git a/guice/src/main/java/io/cucumber/guice/api/CucumberModules.java b/guice/src/main/java/io/cucumber/guice/CucumberModules.java similarity index 83% rename from guice/src/main/java/io/cucumber/guice/api/CucumberModules.java rename to guice/src/main/java/io/cucumber/guice/CucumberModules.java index 4758f55d18..8df0e57394 100644 --- a/guice/src/main/java/io/cucumber/guice/api/CucumberModules.java +++ b/guice/src/main/java/io/cucumber/guice/CucumberModules.java @@ -1,12 +1,19 @@ -package io.cucumber.guice.api; +package io.cucumber.guice; import com.google.inject.Module; +import org.apiguardian.api.API; /** * Provides a convenient {@link Module} instance that contains bindings for * {@link ScenarioScoped} annotation and for {@link ScenarioScope}. */ -public class CucumberModules { +@API(status = API.Status.STABLE) +public final class CucumberModules { + + private CucumberModules(){ + + } + /** * A convenient instance of {@link Module}. Should only be used * in combination with {@link CucumberScopes#SCENARIO}. diff --git a/guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java b/guice/src/main/java/io/cucumber/guice/CucumberScopes.java similarity index 86% rename from guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java rename to guice/src/main/java/io/cucumber/guice/CucumberScopes.java index 9f46f9fdcb..4aef3db084 100644 --- a/guice/src/main/java/io/cucumber/guice/api/CucumberScopes.java +++ b/guice/src/main/java/io/cucumber/guice/CucumberScopes.java @@ -1,6 +1,7 @@ -package io.cucumber.guice.api; +package io.cucumber.guice; import com.google.inject.Module; +import org.apiguardian.api.API; /** * Creates an instance of {@link ScenarioScope} for use when declaring bindings @@ -11,7 +12,13 @@ * * bind(ScenarioScopedObject.class).in(ScenarioScoped.class); */ -public class CucumberScopes { +@API(status = API.Status.STABLE) +public final class CucumberScopes { + + private CucumberScopes(){ + + } + /** * A convenient instance of {@link ScenarioScope}. Should only be used * in combination with {@link CucumberModules#SCENARIO}. diff --git a/guice/src/main/java/io/cucumber/guice/GuiceFactory.java b/guice/src/main/java/io/cucumber/guice/GuiceFactory.java index 2f714c105a..538af797a3 100644 --- a/guice/src/main/java/io/cucumber/guice/GuiceFactory.java +++ b/guice/src/main/java/io/cucumber/guice/GuiceFactory.java @@ -3,12 +3,13 @@ import com.google.inject.Injector; import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.options.Env; -import io.cucumber.guice.api.ScenarioScope; +import org.apiguardian.api.API; /** * Guice implementation of the io.cucumber.core.backend.ObjectFactory. */ -public class GuiceFactory implements ObjectFactory { +@API(status = API.Status.STABLE) +public final class GuiceFactory implements ObjectFactory { private final Injector injector; diff --git a/guice/src/main/java/io/cucumber/guice/api/InjectorSource.java b/guice/src/main/java/io/cucumber/guice/InjectorSource.java similarity index 56% rename from guice/src/main/java/io/cucumber/guice/api/InjectorSource.java rename to guice/src/main/java/io/cucumber/guice/InjectorSource.java index 4ba0042cba..db5cf11841 100644 --- a/guice/src/main/java/io/cucumber/guice/api/InjectorSource.java +++ b/guice/src/main/java/io/cucumber/guice/InjectorSource.java @@ -1,12 +1,14 @@ -package io.cucumber.guice.api; +package io.cucumber.guice; import com.google.inject.Injector; +import org.apiguardian.api.API; /** - * An implentation of this interface is used to obtain an com.google.inject.Injector that is used to + * An implementation of this interface is used to obtain an com.google.inject.Injector that is used to * provide instances of all the classes that are used to run the Cucumber tests. The injector should be configured with * a binding for ScenarioScope. */ +@API(status = API.Status.STABLE) public interface InjectorSource { Injector getInjector(); } diff --git a/guice/src/main/java/io/cucumber/guice/InjectorSourceFactory.java b/guice/src/main/java/io/cucumber/guice/InjectorSourceFactory.java index 5c1305e4d9..46c92d9cbf 100644 --- a/guice/src/main/java/io/cucumber/guice/InjectorSourceFactory.java +++ b/guice/src/main/java/io/cucumber/guice/InjectorSourceFactory.java @@ -3,12 +3,10 @@ import com.google.inject.Guice; import com.google.inject.Stage; import io.cucumber.core.options.Env; -import io.cucumber.guice.api.CucumberModules; -import io.cucumber.guice.api.InjectorSource; import static java.text.MessageFormat.format; -class InjectorSourceFactory { +final class InjectorSourceFactory { static final String GUICE_INJECTOR_SOURCE_KEY = "guice.injector-source"; private final Env env; diff --git a/guice/src/main/java/io/cucumber/guice/api/ScenarioModule.java b/guice/src/main/java/io/cucumber/guice/ScenarioModule.java similarity index 94% rename from guice/src/main/java/io/cucumber/guice/api/ScenarioModule.java rename to guice/src/main/java/io/cucumber/guice/ScenarioModule.java index 4f8347da13..4dbe7e4aac 100644 --- a/guice/src/main/java/io/cucumber/guice/api/ScenarioModule.java +++ b/guice/src/main/java/io/cucumber/guice/ScenarioModule.java @@ -1,4 +1,4 @@ -package io.cucumber.guice.api; +package io.cucumber.guice; import com.google.inject.AbstractModule; diff --git a/guice/src/main/java/io/cucumber/guice/api/ScenarioScope.java b/guice/src/main/java/io/cucumber/guice/ScenarioScope.java similarity index 74% rename from guice/src/main/java/io/cucumber/guice/api/ScenarioScope.java rename to guice/src/main/java/io/cucumber/guice/ScenarioScope.java index c255256062..4db67b6647 100644 --- a/guice/src/main/java/io/cucumber/guice/api/ScenarioScope.java +++ b/guice/src/main/java/io/cucumber/guice/ScenarioScope.java @@ -1,11 +1,13 @@ -package io.cucumber.guice.api; +package io.cucumber.guice; import com.google.inject.Scope; +import org.apiguardian.api.API; /** * A custom Guice scope that enables classes to be bound in a scope that will last for the lifetime of one Cucumber * scenario. */ +@API(status = API.Status.STABLE) public interface ScenarioScope extends Scope { void enterScope(); void exitScope(); diff --git a/guice/src/main/java/io/cucumber/guice/api/ScenarioScoped.java b/guice/src/main/java/io/cucumber/guice/ScenarioScoped.java similarity index 68% rename from guice/src/main/java/io/cucumber/guice/api/ScenarioScoped.java rename to guice/src/main/java/io/cucumber/guice/ScenarioScoped.java index a4b049fc46..b615133e27 100644 --- a/guice/src/main/java/io/cucumber/guice/api/ScenarioScoped.java +++ b/guice/src/main/java/io/cucumber/guice/ScenarioScoped.java @@ -1,6 +1,7 @@ -package io.cucumber.guice.api; +package io.cucumber.guice; import com.google.inject.ScopeAnnotation; +import org.apiguardian.api.API; import java.lang.annotation.Retention; import java.lang.annotation.Target; @@ -13,5 +14,9 @@ * A custom Guice scope annotation that is usually bound to an instance of * ScenarioScope. */ -@Target({ TYPE, METHOD }) @Retention(RUNTIME) @ScopeAnnotation -public @interface ScenarioScoped {} \ No newline at end of file +@Target({TYPE, METHOD}) +@Retention(RUNTIME) +@ScopeAnnotation +@API(status = API.Status.STABLE) +public @interface ScenarioScoped { +} \ No newline at end of file diff --git a/guice/src/main/java/io/cucumber/guice/api/SequentialScenarioScope.java b/guice/src/main/java/io/cucumber/guice/SequentialScenarioScope.java similarity index 96% rename from guice/src/main/java/io/cucumber/guice/api/SequentialScenarioScope.java rename to guice/src/main/java/io/cucumber/guice/SequentialScenarioScope.java index bc62c1e040..fdc203d895 100644 --- a/guice/src/main/java/io/cucumber/guice/api/SequentialScenarioScope.java +++ b/guice/src/main/java/io/cucumber/guice/SequentialScenarioScope.java @@ -1,9 +1,8 @@ -package io.cucumber.guice.api; +package io.cucumber.guice; import com.google.inject.Key; import com.google.inject.OutOfScopeException; import com.google.inject.Provider; -import io.cucumber.guice.api.ScenarioScope; import java.util.HashMap; import java.util.Map; diff --git a/guice/src/main/java/io/cucumber/guice/api/package-info.java b/guice/src/main/java/io/cucumber/guice/api/package-info.java deleted file mode 100644 index 768def6d59..0000000000 --- a/guice/src/main/java/io/cucumber/guice/api/package-info.java +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Cucumber Guice configuration Api - *

        - * This module allows you to use Google Guice dependency injection in your Cucumber tests. Guice comes as standard with - * singleton scope and 'no scope'. This module adds Cucumber scenario scope to the scopes available for use in your - * test code. The rest of this documentation assumes you have at least a basic understanding of Guice. Please refer to - * the Guice wiki if necessary, see - * https://github.com/google/guice/wiki/Motivation - *

        - *

        About scopes, injectors and migration from earlier versions

        - *

        - * It's important to realise the differences in how this module functions when compared with earlier versions. The - * changes are as follows. - *

        - *

        Version 1.1.7 and earlier

        - *

        - * A Guice injector is created at the start of each test scenario and is destroyed at the end of each test scenario. - * There is no scenario scope, just singleton and 'no scope'. - *

        - *

        Version 1.1.8 onwards

        - *

        - * A Guice injector is created once before any tests are run and is destroyed after the last test has run. Before each - * test scenario a new scenario scope is created. At the end of the test scenario the scenario scope is destroyed. - * Singleton scope exists throughout all test scenarios. - *

        - *

        Migrating to version 1.1.8 or later

        - *

        - * Users wishing to migrate should replace @Singleton annotations with @ScenarioScope - * annotations. Guice modules should also have their singleton bindings updated. All bindings in - * Scopes.SINGLETON should be replaced with bindings in CucumberScopes.SCENARIO. - *

        - *

        Using the module

        - *

        - * By including the cucumber-guice jar on your CLASSPATH your Step Definitions will be - * instantiated by Guice. There are two main modes of using the module: with scope annotations and with module - * bindings. The two modes can also be mixed. When mixing modes it is important to realise that binding a class in a - * scope in a module takes precedence if the same class is also bound using a scope annotation. - *

        - *

        Scoping your step definitions

        - *

        - * Usually you will want to bind your step definition classes in either scenario scope or in singleton scope. It is not - * recommended to leave your step definition classes with no scope as it means that Cucumber will instantiate a new - * instance of the class for each step within a scenario that uses that step definition. - *

        - *

        Scenario scope

        - *

        - * Cucumber will create exactly one instance of a class bound in scenario scope for each scenario in which it is used. - * You should use scenario scope when you want to store state during a scenario but do not want the state to interfere - * with subsequent scenarios. - *

        - *

        Singleton scope

        - *

        - * Cucumber will create just one instance of a class bound in singleton scope that will last for the lifetime of all - * test scenarios in the test run. You should use singleton scope if your classes are stateless. You can also use - * singleton scope when your classes contain state but with caution. You should be absolutely sure that a state change - * in one scenario could not possibly influence the success or failure of a subsequent scenario. As an example of when - * you might use a singleton, imagine you have an http client that is expensive to create. By holding a reference to - * the client in a class bound in singleton scope you can reuse the client in multiple scenarios. - *

        - *

        Using scope annotations

        - *

        - * This is the easy route if you're new to Guice. To bind a class in scenario scope add the - * io.cucumber.guice.api.ScenarioScoped annotation to the class definition. The class should have - * a no-args constructor or one constructor that is annotated with javax.inject.Inject. For example: - *

        - *
        - * import cucumber.runtime.java.guice.ScenarioScoped;
        - * import javax.inject.Inject;
        - *
        - * {@literal @}ScenarioScoped
        - * public class ScenarioScopedSteps {
        - *
        - * private final Object someInjectedDependency;
        - *
        - * {@literal @}Inject
        - * public ScenarioScopedSteps(Object someInjectedDependency) {
        - * this.someInjectedDependency = someInjectedDependency;
        - * }
        - *
        - * ...
        - * }
        - * 
        - *

        - * To bind a class in singleton scope add the javax.inject.Singleton annotation to the class definition. - * One strategy for using stateless step definitions is to use providers to share stateful scenario scoped instances - * between stateless singleton step definition instances. For example: - *

        - *
        - * import javax.inject.Inject;
        - * import javax.inject.Singleton;
        - *
        - * {@literal @}Singleton
        - * public class MyStatelessSteps {
        - *
        - * private final Provider<MyStatefulObject> providerMyStatefulObject;
        - *
        - * {@literal @}Inject
        - * public MyStatelessSteps(Provider<MyStatefulObject> providerMyStatefulObject) {
        - * this.providerMyStatefulObject = providerMyStatefulObject;
        - * }
        - *
        - * {@literal @}Given("^I have (\\d+) cukes in my belly$")
        - * public void I_have_cukes_in_my_belly(int n) {
        - * providerMyStatefulObject.get().iHaveCukesInMyBelly(n);
        - * }
        - *
        - * ...
        - * }
        - * 
        - *

        - * There is an alternative explanation of using - * - * providers for mixing scopes on the Guice wiki. - *

        - *

        Using module bindings

        - *

        - * As an alternative to using annotations you may prefer to declare Guice bindings in a class that implements - * com.google.inject.Module. To do this you should create a class that implements - * io.cucumber.guice.api.InjectorSource. This gives you complete control over how you obtain a - * Guice injector and it's Guice modules. The injector must provide a binding for - * io.cucumber.guice.api.ScenarioScope. It should also provide a binding for the - * io.cucumber.guice.api.ScenarioScoped annotation if your classes are using the annotation. The - * easiest way to do this it to use CucumberModules.createScenarioModule(). For example: - *

        - *
        - * import com.google.inject.Guice;
        - * import com.google.inject.Injector;
        - * import com.google.inject.Stage;
        - * import cucumber.api.guice.CucumberModules;
        - * import cucumber.runtime.java.guice.InjectorSource;
        - *
        - * public class YourInjectorSource implements InjectorSource {
        - *
        - * {@literal @}Override
        - * public Injector getInjector() {
        - * return Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new YourModule());
        - * }
        - * }
        - * 
        - *

        - * Cucumber needs to know where to find the io.cucumber.guice.api.InjectorSource that it will use. - * You should create a properties file called cucumber.properties and place it in the root of the - * classpath. The file should contain a single property key called guice.injector-source with a value - * equal to the fully qualified name of the io.cucumber.guice.api.InjectorSource. For example: - *

        - *
        - * guice.injector-source=com.company.YourInjectorSource
        - * 
        - */ -package io.cucumber.guice.api; diff --git a/guice/src/main/java/io/cucumber/guice/package-info.java b/guice/src/main/java/io/cucumber/guice/package-info.java index aa38ae1963..dd1fec21e8 100644 --- a/guice/src/main/java/io/cucumber/guice/package-info.java +++ b/guice/src/main/java/io/cucumber/guice/package-info.java @@ -1,8 +1,155 @@ /** - * Enables dependency injection by Guice + * Cucumber Guice configuration Api *

        - * By including the cucumber-guice on your CLASSPATH your step definitions will be - * instantiated by Guice. + * An implentation of this interface is used to obtain an com.google.inject.Injector that is used to + * provide instances of all the classes that are used to run the Cucumber tests. The injector should be configured with + * a binding for ScenarioScope. + *

        + * This module allows you to use Google Guice dependency injection in your Cucumber tests. Guice comes as standard with + * singleton scope and 'no scope'. This module adds Cucumber scenario scope to the scopes available for use in your + * test code. The rest of this documentation assumes you have at least a basic understanding of Guice. Please refer to + * the Guice wiki if necessary, see + * https://github.com/google/guice/wiki/Motivation + *

        + *

        About scopes, injectors and migration from earlier versions

        + *

        + * It's important to realise the differences in how this module functions when compared with earlier versions. The + * changes are as follows. + *

        + *

        Version 1.1.7 and earlier

        + *

        + * A Guice injector is created at the start of each test scenario and is destroyed at the end of each test scenario. + * There is no scenario scope, just singleton and 'no scope'. + *

        + *

        Version 1.1.8 onwards

        + *

        + * A Guice injector is created once before any tests are run and is destroyed after the last test has run. Before each + * test scenario a new scenario scope is created. At the end of the test scenario the scenario scope is destroyed. + * Singleton scope exists throughout all test scenarios. + *

        + *

        Migrating to version 1.1.8 or later

        + *

        + * Users wishing to migrate should replace @Singleton annotations with @ScenarioScope + * annotations. Guice modules should also have their singleton bindings updated. All bindings in + * Scopes.SINGLETON should be replaced with bindings in CucumberScopes.SCENARIO. + *

        + *

        Using the module

        + *

        + * By including the cucumber-guice jar on your CLASSPATH your Step Definitions will be + * instantiated by Guice. There are two main modes of using the module: with scope annotations and with module + * bindings. The two modes can also be mixed. When mixing modes it is important to realise that binding a class in a + * scope in a module takes precedence if the same class is also bound using a scope annotation. + *

        + *

        Scoping your step definitions

        + *

        + * Usually you will want to bind your step definition classes in either scenario scope or in singleton scope. It is not + * recommended to leave your step definition classes with no scope as it means that Cucumber will instantiate a new + * instance of the class for each step within a scenario that uses that step definition. + *

        + *

        Scenario scope

        + *

        + * Cucumber will create exactly one instance of a class bound in scenario scope for each scenario in which it is used. + * You should use scenario scope when you want to store state during a scenario but do not want the state to interfere + * with subsequent scenarios. + *

        + *

        Singleton scope

        + *

        + * Cucumber will create just one instance of a class bound in singleton scope that will last for the lifetime of all + * test scenarios in the test run. You should use singleton scope if your classes are stateless. You can also use + * singleton scope when your classes contain state but with caution. You should be absolutely sure that a state change + * in one scenario could not possibly influence the success or failure of a subsequent scenario. As an example of when + * you might use a singleton, imagine you have an http client that is expensive to create. By holding a reference to + * the client in a class bound in singleton scope you can reuse the client in multiple scenarios. + *

        + *

        Using scope annotations

        + *

        + * This is the easy route if you're new to Guice. To bind a class in scenario scope add the + * io.cucumber.guice.ScenarioScoped annotation to the class definition. The class should have + * a no-args constructor or one constructor that is annotated with javax.inject.Inject. For example: + *

        + *
        + * import cucumber.runtime.java.guice.ScenarioScoped;
        + * import javax.inject.Inject;
        + *
        + * {@literal @}ScenarioScoped
        + * public class ScenarioScopedSteps {
        + *
        + * private final Object someInjectedDependency;
        + *
        + * {@literal @}Inject
        + * public ScenarioScopedSteps(Object someInjectedDependency) {
        + * this.someInjectedDependency = someInjectedDependency;
        + * }
        + *
        + * ...
        + * }
        + * 
        + *

        + * To bind a class in singleton scope add the javax.inject.Singleton annotation to the class definition. + * One strategy for using stateless step definitions is to use providers to share stateful scenario scoped instances + * between stateless singleton step definition instances. For example: + *

        + *
        + * import javax.inject.Inject;
        + * import javax.inject.Singleton;
        + *
        + * {@literal @}Singleton
        + * public class MyStatelessSteps {
        + *
        + * private final Provider<MyStatefulObject> providerMyStatefulObject;
        + *
        + * {@literal @}Inject
        + * public MyStatelessSteps(Provider<MyStatefulObject> providerMyStatefulObject) {
        + * this.providerMyStatefulObject = providerMyStatefulObject;
        + * }
        + *
        + * {@literal @}Given("^I have (\\d+) cukes in my belly$")
        + * public void I_have_cukes_in_my_belly(int n) {
        + * providerMyStatefulObject.get().iHaveCukesInMyBelly(n);
        + * }
        + *
        + * ...
        + * }
        + * 
        + *

        + * There is an alternative explanation of using + * + * providers for mixing scopes on the Guice wiki. + *

        + *

        Using module bindings

        + *

        + * As an alternative to using annotations you may prefer to declare Guice bindings in a class that implements + * com.google.inject.Module. To do this you should create a class that implements + * io.cucumber.guice.api.InjectorSource. This gives you complete control over how you obtain a + * Guice injector and it's Guice modules. The injector must provide a binding for + * io.cucumber.guice.ScenarioScope. It should also provide a binding for the + * io.cucumber.guice.ScenarioScoped annotation if your classes are using the annotation. The + * easiest way to do this it to use CucumberModules.createScenarioModule(). For example: + *

        + *
        + * import com.google.inject.Guice;
        + * import com.google.inject.Injector;
        + * import com.google.inject.Stage;
        + * import cucumber.api.guice.CucumberModules;
        + * import cucumber.runtime.java.guice.InjectorSource;
        + *
        + * public class YourInjectorSource implements InjectorSource {
        + *
        + * {@literal @}Override
        + * public Injector getInjector() {
        + * return Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new YourModule());
        + * }
        + * }
        + * 
        + *

        + * Cucumber needs to know where to find the io.cucumber.guice.api.InjectorSource that it will use. + * You should create a properties file called cucumber.properties and place it in the root of the + * classpath. The file should contain a single property key called guice.injector-source with a value + * equal to the fully qualified name of the io.cucumber.guice.api.InjectorSource. For example: + *

        + *
        + * guice.injector-source=com.company.YourInjectorSource
        + * 
        */ package io.cucumber.guice; - diff --git a/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java index 92786ef179..db841736c0 100644 --- a/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java +++ b/guice/src/test/java/io/cucumber/guice/GuiceFactoryTest.java @@ -6,8 +6,6 @@ import com.google.inject.Module; import com.google.inject.Scopes; import com.google.inject.Stage; -import io.cucumber.guice.api.CucumberModules; -import io.cucumber.guice.api.ScenarioScoped; import io.cucumber.guice.matcher.ElementsAreAllEqualMatcher; import io.cucumber.guice.matcher.ElementsAreAllUniqueMatcher; import io.cucumber.core.backend.ObjectFactory; @@ -55,7 +53,7 @@ public void factoryCanBeIntantiatedWithArgConstructor() { @Test public void factoryStartFailsIfScenarioScopeIsNotBound() { factory = new GuiceFactory(Guice.createInjector()); - expectedException.expectMessage(containsString("No implementation for io.cucumber.guice.api.ScenarioScope was bound")); + expectedException.expectMessage(containsString("No implementation for io.cucumber.guice.ScenarioScope was bound")); factory.start(); } diff --git a/guice/src/test/java/io/cucumber/guice/InjectorSourceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/InjectorSourceFactoryTest.java index 383c8428bf..fefa73dca3 100644 --- a/guice/src/test/java/io/cucumber/guice/InjectorSourceFactoryTest.java +++ b/guice/src/test/java/io/cucumber/guice/InjectorSourceFactoryTest.java @@ -2,9 +2,6 @@ import com.google.inject.Injector; import io.cucumber.core.options.Env; -import io.cucumber.guice.InjectorSourceFactory; -import io.cucumber.guice.InjectorSourceInstantiationFailed; -import io.cucumber.guice.api.InjectorSource; import org.junit.Test; import java.io.ByteArrayOutputStream; @@ -24,7 +21,7 @@ private InjectorSourceFactory createInjectorSourceFactory(Properties properties) } @Test - public void createsDefaultInjectorSourceWhenGuiceModulePropertyIsNotSet() throws Exception { + public void createsDefaultInjectorSourceWhenGuiceModulePropertyIsNotSet() { InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(new Properties()); assertThat(injectorSourceFactory.create(), is(instanceOf(InjectorSource.class))); } @@ -37,7 +34,7 @@ public Injector getInjector() { } @Test - public void instantiatesInjectorSourceByFullyQualifiedName() throws Exception { + public void instantiatesInjectorSourceByFullyQualifiedName() { Properties properties = new Properties(); properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, CustomInjectorSource.class.getName()); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); @@ -45,7 +42,7 @@ public void instantiatesInjectorSourceByFullyQualifiedName() throws Exception { } @Test - public void failsToInstantiateNonExistantClass() throws Exception { + public void failsToInstantiateNonExistantClass() { Properties properties = new Properties(); properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, "some.bogus.Class"); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); @@ -58,7 +55,7 @@ public void failsToInstantiateNonExistantClass() throws Exception { } @Test - public void failsToInstantiateClassNotImplementingInjectorSource() throws Exception { + public void failsToInstantiateClassNotImplementingInjectorSource() { Properties properties = new Properties(); properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, String.class.getName()); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); @@ -81,7 +78,7 @@ public Injector getInjector() { } @Test - public void failsToInstantiateClassWithPrivateConstructor() throws Exception { + public void failsToInstantiateClassWithPrivateConstructor() { Properties properties = new Properties(); properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, PrivateConstructor.class.getName()); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); @@ -104,7 +101,7 @@ public Injector getInjector() { } @Test - public void failsToInstantiateClassWithNoDefaultConstructor() throws Exception { + public void failsToInstantiateClassWithNoDefaultConstructor() { Properties properties = new Properties(); properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, NoDefaultConstructor.class.getName()); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); @@ -116,58 +113,57 @@ public void failsToInstantiateClassWithNoDefaultConstructor() throws Exception { } } - /** - *

        Simulates enterprise applications which often use a hierarchy of classloaders. - * - *

        MyChildClassLoader is the only classloader with knowledge of c.r.j.guice.impl.LivesInChildClassLoader - * - *

        The bytecode of LivesInChildClassLoader is intentionally renamed to 'LivesInChildClassLoader.class.bin.txt' to prevent - * this test's ClassLoader from resolving it. - * - *

        If InjectorSourceFactory calls Class#forName without an explicit ClassLoader argument, which is the behavior of - * 1.2.4 and earlier, Class#forName will default to the test's ClassLoader which has no knowledge - * of class LivesInChildClassLoader and the test will fail. - * - *

        See https://github.com/cucumber/cucumber-jvm/issues/1036 - * @throws Exception - */ - @Test - public void instantiateClassInChildClassLoader() throws Exception { + /** + *

        Simulates enterprise applications which often use a hierarchy of classloaders. + * + *

        MyChildClassLoader is the only classloader with knowledge of c.r.j.guice.impl.LivesInChildClassLoader + * + *

        The bytecode of LivesInChildClassLoader is intentionally renamed to 'LivesInChildClassLoader.class.bin.txt' to prevent + * this test's ClassLoader from resolving it. + * + *

        If InjectorSourceFactory calls Class#forName without an explicit ClassLoader argument, which is the behavior of + * 1.2.4 and earlier, Class#forName will default to the test's ClassLoader which has no knowledge + * of class LivesInChildClassLoader and the test will fail. + * + *

        See https://github.com/cucumber/cucumber-jvm/issues/1036 + */ + @Test + public void instantiateClassInChildClassLoader() { ClassLoader childClassLoader = new MyChildClassLoader(this.getClass().getClassLoader()); - Thread.currentThread().setContextClassLoader( childClassLoader ); - + Thread.currentThread().setContextClassLoader(childClassLoader); + Properties properties = new Properties(); properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, "io.cucumber.guice.impl.LivesInChildClassLoader"); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); - - assertThat(injectorSourceFactory.create(), is(instanceOf(InjectorSource.class))); + + assertThat(injectorSourceFactory.create(), is(instanceOf(InjectorSource.class))); } - + private static class MyChildClassLoader extends ClassLoader { - public MyChildClassLoader( ClassLoader parent ) { + public MyChildClassLoader(ClassLoader parent) { super(parent); } @Override - protected Class loadClass( String name, boolean resolve ) throws ClassNotFoundException { - if( name.equals( "io.cucumber.guice.impl.LivesInChildClassLoader" ) ) { + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + if (name.equals("io.cucumber.guice.impl.LivesInChildClassLoader")) { String filename = getClass().getClassLoader().getResource("io/cucumber/guice/impl/LivesInChildClassLoader.class.bin").getFile(); - File file = new File( filename ); + File file = new File(filename); try { - FileInputStream in = new FileInputStream( file ); + FileInputStream in = new FileInputStream(file); byte[] bytes = new byte[1024]; ByteArrayOutputStream content = new ByteArrayOutputStream(); - while( true ) { + while (true) { int iLen = in.read(bytes); - content.write( bytes, 0, iLen ); - if( iLen < 1024 ) { + content.write(bytes, 0, iLen); + if (iLen < 1024) { break; } } byte[] bytecode = content.toByteArray(); - return defineClass( name, bytecode, 0, bytecode.length ); + return defineClass(name, bytecode, 0, bytecode.length); } catch (Exception e) { - throw new RuntimeException( e ); + throw new RuntimeException(e); } } return super.loadClass(name, resolve); diff --git a/guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt b/guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt index f0c2bf767b..29445c721c 100644 --- a/guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt +++ b/guice/src/test/java/io/cucumber/guice/impl/LivesInChildClassLoader.java.txt @@ -1,7 +1,7 @@ package io.cucumber.guice.impl; import com.google.inject.Injector; -import io.cucumber.guice.api.InjectorSource; +import io.cucumber.guice.InjectorSource; public class LivesInChildClassLoader implements InjectorSource { @Override diff --git a/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java index 483a188313..9f4c479408 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/HelloWorldSteps.java @@ -1,7 +1,7 @@ package io.cucumber.guice.integration; import io.cucumber.java.en.Given; -import io.cucumber.guice.api.ScenarioScoped; +import io.cucumber.guice.ScenarioScoped; @ScenarioScoped public class HelloWorldSteps { diff --git a/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java index e0558831c8..39859041dd 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/ScenarioScopedSteps.java @@ -3,7 +3,7 @@ import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; -import io.cucumber.guice.api.ScenarioScoped; +import io.cucumber.guice.ScenarioScoped; import javax.inject.Inject; import javax.inject.Provider; diff --git a/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java index ebc82ab198..612f0ed51c 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java +++ b/guice/src/test/java/io/cucumber/guice/integration/SingletonScopedSteps.java @@ -3,7 +3,7 @@ import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; -import io.cucumber.guice.api.ScenarioScoped; +import io.cucumber.guice.ScenarioScoped; import javax.inject.Inject; import javax.inject.Provider; diff --git a/guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java b/guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java index 17ca3b4dde..df4bfa18cc 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java +++ b/guice/src/test/java/io/cucumber/guice/integration/YourInjectorSource.java @@ -3,8 +3,8 @@ import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Stage; -import io.cucumber.guice.api.CucumberModules; -import io.cucumber.guice.api.InjectorSource; +import io.cucumber.guice.CucumberModules; +import io.cucumber.guice.InjectorSource; public class YourInjectorSource implements InjectorSource { diff --git a/guice/src/test/java/io/cucumber/guice/integration/YourModule.java b/guice/src/test/java/io/cucumber/guice/integration/YourModule.java index 9629232d50..3172662bd4 100644 --- a/guice/src/test/java/io/cucumber/guice/integration/YourModule.java +++ b/guice/src/test/java/io/cucumber/guice/integration/YourModule.java @@ -2,7 +2,7 @@ import com.google.inject.AbstractModule; import com.google.inject.Scopes; -import io.cucumber.guice.api.ScenarioScoped; +import io.cucumber.guice.ScenarioScoped; public class YourModule extends AbstractModule { diff --git a/guice/src/test/resources/io/cucumber/guice/impl/LivesInChildClassLoader.class.bin b/guice/src/test/resources/io/cucumber/guice/impl/LivesInChildClassLoader.class.bin index f306ff0ede06285d54c24343b4343b9cadb5a882..8c0953fdcf356165819d810ea8d25a3ed8584b60 100644 GIT binary patch delta 30 lcmaFK{FHfvDWi}=X1;!MX>w_9QfiTYdTC~I>SS-mc>t-^3j+WE delta 34 pcmaFL{E~TtDWjN5X1;!MX>w_9QfiTYdTC~Is(xZY=45xqc>vjY3~&Gd From 3314bf92aae194e6bf8fb24abea193c9a3fa65fb Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Thu, 27 Jun 2019 23:09:42 +0200 Subject: [PATCH 102/155] [Core] Move event listeners to plugin package --- .../main/java/io/cucumber/core/api/event/HookTestStep.java | 5 ----- .../api/{event => plugin}/ConcurrentEventListener.java | 6 ++++-- .../cucumber/core/api/{event => plugin}/EventListener.java | 7 ++++--- core/src/main/java/io/cucumber/core/api/plugin/Plugin.java | 3 --- .../core/{event => eventbus}/AbstractEventBus.java | 2 +- .../core/{event => eventbus}/AbstractEventPublisher.java | 2 +- .../io/cucumber/core/{event => eventbus}/EventBus.java | 2 +- .../main/java/io/cucumber/core/options/PluginOption.java | 4 ++-- .../cucumber/core/plugin/CanonicalOrderEventPublisher.java | 3 +-- .../io/cucumber/core/plugin/DefaultSummaryPrinter.java | 2 +- .../main/java/io/cucumber/core/plugin/HTMLFormatter.java | 2 +- .../main/java/io/cucumber/core/plugin/JSONFormatter.java | 2 +- .../main/java/io/cucumber/core/plugin/JUnitFormatter.java | 2 +- core/src/main/java/io/cucumber/core/plugin/Plugins.java | 4 ++-- .../main/java/io/cucumber/core/plugin/PrettyFormatter.java | 2 +- .../java/io/cucumber/core/plugin/ProgressFormatter.java | 2 +- .../main/java/io/cucumber/core/plugin/RerunFormatter.java | 2 +- core/src/main/java/io/cucumber/core/plugin/Stats.java | 2 +- .../main/java/io/cucumber/core/plugin/TestNGFormatter.java | 2 +- .../java/io/cucumber/core/plugin/TimelineFormatter.java | 2 +- .../io/cucumber/core/plugin/UndefinedStepsTracker.java | 2 +- .../io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java | 1 + .../main/java/io/cucumber/core/plugin/UsageFormatter.java | 2 +- .../src/main/java/io/cucumber/core/runner/CachingGlue.java | 3 +-- .../java/io/cucumber/core/runner/PickleStepTestStep.java | 2 +- core/src/main/java/io/cucumber/core/runner/Runner.java | 2 +- core/src/main/java/io/cucumber/core/runner/Scenario.java | 2 +- core/src/main/java/io/cucumber/core/runner/TestCase.java | 2 +- core/src/main/java/io/cucumber/core/runner/TestStep.java | 2 +- .../java/io/cucumber/core/runner/TimeServiceEventBus.java | 2 +- core/src/main/java/io/cucumber/core/runtime/Runtime.java | 4 ++-- .../io/cucumber/core/runtime/SingletonRunnerSupplier.java | 2 +- .../cucumber/core/runtime/ThreadLocalRunnerSupplier.java | 4 ++-- .../java/io/cucumber/core/options/RuntimeOptionsTest.java | 2 +- .../test/java/io/cucumber/core/plugin/FormatterSpy.java | 2 +- .../java/io/cucumber/core/plugin/JSONFormatterTest.java | 7 +------ .../java/io/cucumber/core/plugin/PluginFactoryTest.java | 2 +- .../src/test/java/io/cucumber/core/plugin/PluginsTest.java | 5 ++--- .../test/java/io/cucumber/core/plugin/StubFormatter.java | 2 +- .../io/cucumber/core/plugin/UndefinedStepsTrackerTest.java | 2 +- .../test/java/io/cucumber/core/runner/CachingGlueTest.java | 2 +- .../test/java/io/cucumber/core/runner/EventBusTest.java | 2 +- .../test/java/io/cucumber/core/runner/HookOrderTest.java | 2 +- core/src/test/java/io/cucumber/core/runner/HookTest.java | 5 +---- .../java/io/cucumber/core/runner/HookTestStepTest.java | 2 +- .../io/cucumber/core/runner/PickleStepTestStepTest.java | 3 +-- core/src/test/java/io/cucumber/core/runner/RunnerTest.java | 2 +- .../java/io/cucumber/core/runner/ScenarioResultTest.java | 2 +- .../test/java/io/cucumber/core/runner/ScenarioTest.java | 2 +- .../io/cucumber/core/runner/StepDurationTimeService.java | 2 +- .../test/java/io/cucumber/core/runner/TestCaseTest.java | 2 +- core/src/test/java/io/cucumber/core/runner/TestHelper.java | 6 +++--- .../java/io/cucumber/core/runner/TestRunnerSupplier.java | 2 +- .../test/java/io/cucumber/core/runtime/ExitStatusTest.java | 2 +- .../test/java/io/cucumber/core/runtime/RuntimeTest.java | 6 +++--- .../cucumber/core/runtime/SingletonRunnerSupplierTest.java | 2 +- .../java/io/cucumber/core/runtime/TestFeatureSupplier.java | 2 +- .../core/runtime/ThreadLocalRunnerSupplierTest.java | 2 +- .../test/java/io/cucumber/java/JavaStepDefinitionTest.java | 2 +- junit/src/main/java/io/cucumber/junit/Cucumber.java | 2 +- junit/src/main/java/io/cucumber/junit/JUnitReporter.java | 2 +- .../src/test/java/io/cucumber/junit/FeatureRunnerTest.java | 7 +------ .../io/cucumber/junit/InvokeMethodsAroundEventsTest.java | 2 +- .../src/test/java/io/cucumber/junit/JUnitReporterTest.java | 2 +- .../java/io/cucumber/testng/TestCaseResultListener.java | 2 +- .../main/java/io/cucumber/testng/TestNGCucumberRunner.java | 4 +--- .../io/cucumber/testng/TestCaseResultListenerTest.java | 2 +- 67 files changed, 80 insertions(+), 103 deletions(-) rename core/src/main/java/io/cucumber/core/api/{event => plugin}/ConcurrentEventListener.java (87%) rename core/src/main/java/io/cucumber/core/api/{event => plugin}/EventListener.java (73%) rename core/src/main/java/io/cucumber/core/{event => eventbus}/AbstractEventBus.java (90%) rename core/src/main/java/io/cucumber/core/{event => eventbus}/AbstractEventPublisher.java (98%) rename core/src/main/java/io/cucumber/core/{event => eventbus}/EventBus.java (88%) diff --git a/core/src/main/java/io/cucumber/core/api/event/HookTestStep.java b/core/src/main/java/io/cucumber/core/api/event/HookTestStep.java index 579833c5e8..8a897d7786 100644 --- a/core/src/main/java/io/cucumber/core/api/event/HookTestStep.java +++ b/core/src/main/java/io/cucumber/core/api/event/HookTestStep.java @@ -1,10 +1,5 @@ package io.cucumber.core.api.event; -import io.cucumber.core.api.event.HookType; -import io.cucumber.core.api.event.TestCaseFinished; -import io.cucumber.core.api.event.TestCaseStarted; -import io.cucumber.core.api.event.TestStep; - /** * Hooks are invoked before and after each scenario and before and * after each gherkin step in a scenario. diff --git a/core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java b/core/src/main/java/io/cucumber/core/api/plugin/ConcurrentEventListener.java similarity index 87% rename from core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java rename to core/src/main/java/io/cucumber/core/api/plugin/ConcurrentEventListener.java index 437d035f76..e9ddd3c482 100644 --- a/core/src/main/java/io/cucumber/core/api/event/ConcurrentEventListener.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/ConcurrentEventListener.java @@ -1,6 +1,8 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.api.plugin; -import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.api.event.TestCase; /** * Listens to pickle execution events. Can be used to diff --git a/core/src/main/java/io/cucumber/core/api/event/EventListener.java b/core/src/main/java/io/cucumber/core/api/plugin/EventListener.java similarity index 73% rename from core/src/main/java/io/cucumber/core/api/event/EventListener.java rename to core/src/main/java/io/cucumber/core/api/plugin/EventListener.java index fe529a31d6..ac1f027bb2 100644 --- a/core/src/main/java/io/cucumber/core/api/event/EventListener.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/EventListener.java @@ -1,6 +1,7 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.api.plugin; -import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.api.event.Event; +import io.cucumber.core.api.event.EventPublisher; /** * Listens to pickle execution events. Can be used to @@ -9,7 +10,7 @@ * When cucumber executes test in parallel or in a framework * that supports parallel execution (e.g. JUnit or TestNG) * {@link Event}s are stored and published - * in @{@link Event#CANONICAL_ORDER} after the test run has + * in @{@link io.cucumber.core.plugin.CanonicalEventOrder} after the test run has * completed. * * @see Event diff --git a/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java b/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java index 70074530a4..ff3427a158 100644 --- a/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java +++ b/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java @@ -1,8 +1,5 @@ package io.cucumber.core.api.plugin; -import io.cucumber.core.api.event.ConcurrentEventListener; -import io.cucumber.core.api.event.EventListener; - import java.io.File; import java.net.URI; import java.net.URL; diff --git a/core/src/main/java/io/cucumber/core/event/AbstractEventBus.java b/core/src/main/java/io/cucumber/core/eventbus/AbstractEventBus.java similarity index 90% rename from core/src/main/java/io/cucumber/core/event/AbstractEventBus.java rename to core/src/main/java/io/cucumber/core/eventbus/AbstractEventBus.java index 6d163cbb9f..0588eab219 100644 --- a/core/src/main/java/io/cucumber/core/event/AbstractEventBus.java +++ b/core/src/main/java/io/cucumber/core/eventbus/AbstractEventBus.java @@ -1,4 +1,4 @@ -package io.cucumber.core.event; +package io.cucumber.core.eventbus; import io.cucumber.core.api.event.Event; diff --git a/core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java b/core/src/main/java/io/cucumber/core/eventbus/AbstractEventPublisher.java similarity index 98% rename from core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java rename to core/src/main/java/io/cucumber/core/eventbus/AbstractEventPublisher.java index e231cea99d..4a96d877ce 100644 --- a/core/src/main/java/io/cucumber/core/event/AbstractEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/eventbus/AbstractEventPublisher.java @@ -1,4 +1,4 @@ -package io.cucumber.core.event; +package io.cucumber.core.eventbus; import io.cucumber.core.api.event.Event; import io.cucumber.core.api.event.EventHandler; diff --git a/core/src/main/java/io/cucumber/core/event/EventBus.java b/core/src/main/java/io/cucumber/core/eventbus/EventBus.java similarity index 88% rename from core/src/main/java/io/cucumber/core/event/EventBus.java rename to core/src/main/java/io/cucumber/core/eventbus/EventBus.java index 3b23b0be91..419587723f 100644 --- a/core/src/main/java/io/cucumber/core/event/EventBus.java +++ b/core/src/main/java/io/cucumber/core/eventbus/EventBus.java @@ -1,4 +1,4 @@ -package io.cucumber.core.event; +package io.cucumber.core.eventbus; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/options/PluginOption.java b/core/src/main/java/io/cucumber/core/options/PluginOption.java index 88cf5d316d..b286bc5009 100644 --- a/core/src/main/java/io/cucumber/core/options/PluginOption.java +++ b/core/src/main/java/io/cucumber/core/options/PluginOption.java @@ -2,8 +2,8 @@ import io.cucumber.core.api.plugin.Plugin; import io.cucumber.core.api.plugin.SummaryPrinter; -import io.cucumber.core.api.event.ConcurrentEventListener; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.ConcurrentEventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.logging.Logger; import io.cucumber.core.logging.LoggerFactory; diff --git a/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java b/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java index dc9c1dbe0b..34e6da6032 100644 --- a/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java @@ -2,9 +2,8 @@ import io.cucumber.core.api.event.Event; import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.event.AbstractEventPublisher; +import io.cucumber.core.eventbus.AbstractEventPublisher; -import java.util.Collections; import java.util.LinkedList; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java index c766a5b1cb..5b18fe6db1 100644 --- a/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.plugin.SummaryPrinter; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.plugin.ColorAware; diff --git a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index 15883df9b2..815ab0bf05 100644 --- a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -6,7 +6,7 @@ import io.cucumber.core.api.event.TestCase; import io.cucumber.core.api.event.EmbedEvent; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestCaseStarted; import io.cucumber.core.api.event.TestRunFinished; diff --git a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java index 758ecc0600..213bc96766 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java @@ -8,7 +8,7 @@ import io.cucumber.core.api.event.TestStep; import io.cucumber.core.api.event.EmbedEvent; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestCaseStarted; import io.cucumber.core.api.event.TestRunFinished; diff --git a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java index 2db320eddd..11285c3b89 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java @@ -3,7 +3,7 @@ import io.cucumber.core.api.event.PickleStepTestStep; import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestCaseFinished; import io.cucumber.core.api.event.TestCaseStarted; diff --git a/core/src/main/java/io/cucumber/core/plugin/Plugins.java b/core/src/main/java/io/cucumber/core/plugin/Plugins.java index cb55c37467..50192650dd 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Plugins.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugins.java @@ -1,10 +1,10 @@ package io.cucumber.core.plugin; import io.cucumber.core.api.plugin.Plugin; -import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.plugin.ConcurrentEventListener; import io.cucumber.core.api.event.Event; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.plugin.ColorAware; import io.cucumber.core.api.plugin.StrictAware; diff --git a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java index 1c410577df..3dd0fd8263 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java @@ -1,7 +1,7 @@ package io.cucumber.core.plugin; import io.cucumber.core.api.event.Argument; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.PickleStepTestStep; import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.TestCase; diff --git a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java index 569025123d..5d0f281d9a 100644 --- a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.event.PickleStepTestStep; import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.plugin.ConcurrentEventListener; import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestRunFinished; diff --git a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java index 26bb8980c4..ea1e62cbef 100644 --- a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.event.TestCase; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestCaseFinished; import io.cucumber.core.api.event.TestRunFinished; diff --git a/core/src/main/java/io/cucumber/core/plugin/Stats.java b/core/src/main/java/io/cucumber/core/plugin/Stats.java index c6f77008c8..f291fe1c71 100755 --- a/core/src/main/java/io/cucumber/core/plugin/Stats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Stats.java @@ -3,7 +3,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.PickleStepTestStep; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestCaseFinished; import io.cucumber.core.api.event.TestRunFinished; diff --git a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java index b69382dda2..f0465bebe8 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java @@ -3,7 +3,7 @@ import io.cucumber.core.api.event.PickleStepTestStep; import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestCaseFinished; import io.cucumber.core.api.event.TestCaseStarted; diff --git a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index 4a29ab4097..0322534920 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -1,7 +1,7 @@ package io.cucumber.core.plugin; import io.cucumber.core.api.event.TestCase; -import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.plugin.ConcurrentEventListener; import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestCaseEvent; diff --git a/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java index 7ef3b633bb..f5b68d31b3 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java +++ b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java @@ -1,7 +1,7 @@ package io.cucumber.core.plugin; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.SnippetsSuggestedEvent; import io.cucumber.core.api.event.TestSourceRead; diff --git a/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java index df52a0b46d..7c6c060528 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java @@ -6,6 +6,7 @@ import io.cucumber.core.api.event.*; import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.plugin.SummaryPrinter; public class UnusedStepsSummaryPrinter implements ColorAware, EventListener, SummaryPrinter { diff --git a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java index f6ab7eda7d..4834f44976 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java @@ -5,7 +5,7 @@ import gherkin.deps.com.google.gson.JsonPrimitive; import gherkin.deps.com.google.gson.JsonSerializer; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.PickleStepTestStep; import io.cucumber.core.api.event.Result; diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 3dcf955e81..822a95c7a4 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -5,7 +5,7 @@ import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.stepexpression.Argument; import gherkin.pickles.PickleStep; import io.cucumber.core.stepexpression.TypeRegistry; @@ -15,7 +15,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.SortedSet; import java.util.TreeMap; import java.util.function.Function; diff --git a/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java index 84505680ca..4097ee03ce 100644 --- a/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java @@ -3,7 +3,7 @@ import io.cucumber.core.api.event.Argument; import io.cucumber.core.api.event.TestCase; import gherkin.pickles.PickleStep; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import java.util.Collections; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index 896111eedf..0abee74b57 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -8,7 +8,7 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.logging.Logger; import io.cucumber.core.logging.LoggerFactory; import io.cucumber.core.snippets.SnippetGenerator; diff --git a/core/src/main/java/io/cucumber/core/runner/Scenario.java b/core/src/main/java/io/cucumber/core/runner/Scenario.java index 94a4d06fc2..5cb93be974 100644 --- a/core/src/main/java/io/cucumber/core/runner/Scenario.java +++ b/core/src/main/java/io/cucumber/core/runner/Scenario.java @@ -5,7 +5,7 @@ import io.cucumber.core.api.event.TestCase; import io.cucumber.core.api.event.WriteEvent; import gherkin.pickles.PickleTag; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import java.util.ArrayList; import java.util.Collection; diff --git a/core/src/main/java/io/cucumber/core/runner/TestCase.java b/core/src/main/java/io/cucumber/core/runner/TestCase.java index 2f88a6d87c..1965b8e411 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestCase.java +++ b/core/src/main/java/io/cucumber/core/runner/TestCase.java @@ -6,7 +6,7 @@ import io.cucumber.core.api.event.TestCaseStarted; import gherkin.events.PickleEvent; import gherkin.pickles.PickleTag; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import java.net.URI; import java.time.Duration; diff --git a/core/src/main/java/io/cucumber/core/runner/TestStep.java b/core/src/main/java/io/cucumber/core/runner/TestStep.java index 107b7a7c84..15e5a123dc 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/TestStep.java @@ -6,7 +6,7 @@ import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.api.event.TestStepStarted; import io.cucumber.core.backend.StepDefinitionMatch; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import java.time.Duration; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java b/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java index fd33258e01..8191280181 100644 --- a/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java +++ b/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java @@ -3,7 +3,7 @@ import java.time.Clock; import java.time.Instant; -import io.cucumber.core.event.AbstractEventBus; +import io.cucumber.core.eventbus.AbstractEventBus; public final class TimeServiceEventBus extends AbstractEventBus { private final Clock clock; diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index aa3e704913..e432d1f75d 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -1,7 +1,7 @@ package io.cucumber.core.runtime; import gherkin.events.PickleEvent; -import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.plugin.ConcurrentEventListener; import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.Result; @@ -10,7 +10,7 @@ import io.cucumber.core.api.event.TestRunStarted; import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.api.plugin.Plugin; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.exception.CompositeCucumberException; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.filter.Filters; diff --git a/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java index 5c438dc22f..fba17eaa02 100644 --- a/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java @@ -1,6 +1,6 @@ package io.cucumber.core.runtime; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.runner.Options; import io.cucumber.core.runner.Runner; diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java index 2ac5a84e15..a4ddaa988a 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java @@ -4,8 +4,8 @@ import io.cucumber.core.api.event.Event; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.event.AbstractEventBus; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.AbstractEventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.runner.Options; import io.cucumber.core.runner.Runner; diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index d61d3a5ea2..4c33cec098 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -1,7 +1,7 @@ package io.cucumber.core.options; import gherkin.events.PickleEvent; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.plugin.ColorAware; import io.cucumber.core.api.plugin.Plugin; diff --git a/core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java b/core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java index 3abe54c488..bda1293d1d 100644 --- a/core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java +++ b/core/src/test/java/io/cucumber/core/plugin/FormatterSpy.java @@ -1,7 +1,7 @@ package io.cucumber.core.plugin; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestCaseFinished; import io.cucumber.core.api.event.TestCaseStarted; diff --git a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java index 321d4d8df7..0dcea340f6 100755 --- a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java @@ -5,7 +5,6 @@ import static io.cucumber.core.runner.TestHelper.result; import static java.time.Duration.ofMillis; import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -25,19 +24,15 @@ import io.cucumber.core.options.CommandlineOptionsParser; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runner.TestHelper; -import io.cucumber.core.snippets.Snippet; -import io.cucumber.core.snippets.TestSnippet; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.stubbing.Answer; -import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; import io.cucumber.core.api.event.Result; -import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.TestClasspathResourceLoader; import io.cucumber.core.feature.CucumberFeature; diff --git a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java index 58bfd252b7..add904f2b6 100644 --- a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java @@ -4,7 +4,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.TestCase; import io.cucumber.core.api.event.TestStepFinished; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.runner.ClockStub; diff --git a/core/src/test/java/io/cucumber/core/plugin/PluginsTest.java b/core/src/test/java/io/cucumber/core/plugin/PluginsTest.java index 4c5c01d4ae..8286288c3f 100644 --- a/core/src/test/java/io/cucumber/core/plugin/PluginsTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PluginsTest.java @@ -1,12 +1,11 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.plugin.ConcurrentEventListener; import io.cucumber.core.api.event.Event; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.plugin.ColorAware; import io.cucumber.core.api.plugin.StrictAware; -import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.options.RuntimeOptions; import org.junit.Rule; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/plugin/StubFormatter.java b/core/src/test/java/io/cucumber/core/plugin/StubFormatter.java index f39132b0b9..baee614d7e 100644 --- a/core/src/test/java/io/cucumber/core/plugin/StubFormatter.java +++ b/core/src/test/java/io/cucumber/core/plugin/StubFormatter.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; public class StubFormatter implements EventListener { diff --git a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java index 4f38bea5a2..7dd52f3fdc 100644 --- a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java @@ -14,7 +14,7 @@ import gherkin.pickles.PickleLocation; import io.cucumber.core.api.event.TestSourceRead; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.runner.TestHelper; import io.cucumber.core.runner.TimeServiceEventBus; diff --git a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index 5270b89408..1d9ad6c4d9 100644 --- a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -12,7 +12,7 @@ import io.cucumber.core.backend.DuplicateStepDefinitionException; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.stepexpression.ArgumentMatcher; import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; import io.cucumber.core.stepexpression.StepExpression; diff --git a/core/src/test/java/io/cucumber/core/runner/EventBusTest.java b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java index a21a498ca6..5d25de289d 100644 --- a/core/src/test/java/io/cucumber/core/runner/EventBusTest.java +++ b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java @@ -18,7 +18,7 @@ import io.cucumber.core.api.event.TestCase; import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.api.event.TestStepStarted; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; public class EventBusTest { diff --git a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java index 706633ab7f..bad15dc491 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java @@ -9,7 +9,7 @@ import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.StubStepDefinition; import io.cucumber.core.stepexpression.TypeRegistry; diff --git a/core/src/test/java/io/cucumber/core/runner/HookTest.java b/core/src/test/java/io/cucumber/core/runner/HookTest.java index e6d57a5a70..2455731987 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTest.java @@ -5,9 +5,7 @@ import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.event.EventBus; -import io.cucumber.core.io.MultiLoader; -import io.cucumber.core.options.Env; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.options.RuntimeOptions; import gherkin.events.PickleEvent; import gherkin.pickles.Argument; @@ -27,7 +25,6 @@ import java.util.Collections; import java.util.Locale; -import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; diff --git a/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java index 65cafe73fc..534469cf6a 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java @@ -6,7 +6,7 @@ import io.cucumber.core.api.event.TestStepStarted; import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import org.junit.Before; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java index ae180f892f..11519e9489 100644 --- a/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java @@ -1,6 +1,5 @@ package io.cucumber.core.runner; -import io.cucumber.core.runner.TestPendingException; import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.TestCaseEvent; import io.cucumber.core.api.event.TestStepFinished; @@ -8,7 +7,7 @@ import io.cucumber.core.backend.HookDefinition; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import org.junit.AssumptionViolatedException; import org.junit.Before; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java index e6f378fc59..1773205625 100644 --- a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -11,7 +11,7 @@ import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.options.RuntimeOptionsBuilder; import io.cucumber.core.snippets.TestSnippet; diff --git a/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java index 9838d4ce27..d9a78f95a2 100644 --- a/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java @@ -4,7 +4,7 @@ import io.cucumber.core.api.event.EmbedEvent; import io.cucumber.core.api.event.WriteEvent; import gherkin.events.PickleEvent; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import org.junit.Test; import org.mockito.ArgumentMatcher; diff --git a/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java index 4832f3558f..9c5192a778 100644 --- a/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioTest.java @@ -5,7 +5,7 @@ import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import org.junit.Test; import java.util.Collections; diff --git a/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java b/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java index 646ea556c1..2ff5e83735 100644 --- a/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java +++ b/core/src/test/java/io/cucumber/core/runner/StepDurationTimeService.java @@ -1,7 +1,7 @@ package io.cucumber.core.runner; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestStepStarted; diff --git a/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java index 4c264fad5d..eb92603437 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java +++ b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java @@ -8,7 +8,7 @@ import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import org.junit.Before; import org.junit.Test; diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index 897ab3f13f..b4da9793c2 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -3,14 +3,14 @@ import io.cucumber.core.api.plugin.Plugin; import io.cucumber.core.api.event.Result; import io.cucumber.core.api.Scenario; -import io.cucumber.core.api.event.ConcurrentEventListener; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.ConcurrentEventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.Event; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.runtime.BackendSupplier; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.TestClasspathResourceLoader; diff --git a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java index d8a58bae12..0d5cea2e98 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java @@ -3,7 +3,7 @@ import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.RunnerSupplier; import io.cucumber.core.snippets.Snippet; diff --git a/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java index 2193045afe..116de2404e 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java @@ -4,7 +4,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.TestCase; import io.cucumber.core.api.event.TestCaseFinished; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.options.CommandlineOptionsParser; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runner.TimeServiceEventBus; diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index 33415ef372..8647f7e6a0 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -5,9 +5,9 @@ import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; -import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.plugin.ConcurrentEventListener; import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventListener; +import io.cucumber.core.api.plugin.EventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.HookType; import io.cucumber.core.api.event.Result; @@ -19,7 +19,7 @@ import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.api.event.StepDefinition; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.exception.CompositeCucumberException; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; diff --git a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java index 986be3e650..d75fff5ee4 100644 --- a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java @@ -1,7 +1,7 @@ package io.cucumber.core.runtime; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; diff --git a/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java index 0110576e9d..54b34f504d 100644 --- a/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java +++ b/core/src/test/java/io/cucumber/core/runtime/TestFeatureSupplier.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.event.TestSourceRead; import io.cucumber.core.feature.CucumberFeature; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import java.util.Arrays; import java.util.List; diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index bf60b0640a..f6c2d091ca 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -3,7 +3,7 @@ import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.TestCaseStarted; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index be54e49bd1..f790310b1d 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -6,7 +6,7 @@ import io.cucumber.core.backend.ObjectFactory; import io.cucumber.java.en.Given; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.runner.Runner; import io.cucumber.core.runner.AmbiguousStepDefinitionsException; import io.cucumber.core.backend.Backend; diff --git a/junit/src/main/java/io/cucumber/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java index fad9bfa54e..14783afab6 100644 --- a/junit/src/main/java/io/cucumber/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java @@ -6,7 +6,7 @@ import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; import io.cucumber.core.runtime.ObjectFactorySupplier; import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.options.CucumberOptionsAnnotationParser; import io.cucumber.core.options.Env; import io.cucumber.core.options.EnvironmentOptionsParser; diff --git a/junit/src/main/java/io/cucumber/junit/JUnitReporter.java b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java index bf9bcb71d7..dfef21c9be 100644 --- a/junit/src/main/java/io/cucumber/junit/JUnitReporter.java +++ b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java @@ -8,7 +8,7 @@ import io.cucumber.core.api.event.TestStepFinished; import io.cucumber.core.api.event.TestStepStarted; import io.cucumber.junit.PickleRunners.PickleRunner; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import org.junit.runner.Description; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index 24b3a0b359..2a536ad655 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -8,8 +8,7 @@ import io.cucumber.core.runtime.ObjectFactorySupplier; import io.cucumber.core.runtime.SingletonObjectFactorySupplier; import io.cucumber.core.runner.TimeServiceEventBus; -import io.cucumber.core.event.EventBus; -import io.cucumber.core.backend.Backend; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.runtime.BackendSupplier; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; @@ -25,12 +24,9 @@ import java.time.Instant; import java.time.ZoneId; import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; import java.util.HashSet; import java.util.Set; -import static java.util.Arrays.asList; import static java.util.Collections.singleton; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -38,7 +34,6 @@ import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; -import static org.mockito.Mockito.when; public class FeatureRunnerTest { diff --git a/junit/src/test/java/io/cucumber/junit/InvokeMethodsAroundEventsTest.java b/junit/src/test/java/io/cucumber/junit/InvokeMethodsAroundEventsTest.java index 3822a6c13c..3ce595d4d1 100644 --- a/junit/src/test/java/io/cucumber/junit/InvokeMethodsAroundEventsTest.java +++ b/junit/src/test/java/io/cucumber/junit/InvokeMethodsAroundEventsTest.java @@ -1,6 +1,6 @@ package io.cucumber.junit; -import io.cucumber.core.api.event.ConcurrentEventListener; +import io.cucumber.core.api.plugin.ConcurrentEventListener; import io.cucumber.core.api.event.EventPublisher; import io.cucumber.core.api.event.TestRunFinished; import io.cucumber.core.api.event.TestRunStarted; diff --git a/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java index fa9ade9e74..ca279c02b7 100644 --- a/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java +++ b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java @@ -2,7 +2,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.PickleStepTestStep; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.junit.JUnitReporter.EachTestNotifier; import io.cucumber.junit.JUnitReporter.NoTestNotifier; import io.cucumber.junit.PickleRunners.PickleRunner; diff --git a/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java b/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java index 991cff8130..6788d9a15e 100644 --- a/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java +++ b/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java @@ -3,7 +3,7 @@ import io.cucumber.core.api.event.Result; import io.cucumber.core.api.event.EventHandler; import io.cucumber.core.api.event.TestCaseFinished; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.exception.CucumberException; import org.testng.SkipException; diff --git a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java index 278c02a50c..d5c158518d 100644 --- a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java @@ -7,7 +7,7 @@ import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; import io.cucumber.core.runtime.ObjectFactorySupplier; import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.filter.Filters; import io.cucumber.core.io.ClassFinder; @@ -29,8 +29,6 @@ import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import io.cucumber.core.runtime.TypeRegistrySupplier; import org.apiguardian.api.API; -import io.cucumber.core.options.CucumberOptionsAnnotationParser; -import org.apiguardian.api.API; import java.time.Clock; import java.util.ArrayList; diff --git a/testng/src/test/java/io/cucumber/testng/TestCaseResultListenerTest.java b/testng/src/test/java/io/cucumber/testng/TestCaseResultListenerTest.java index c54576a5ef..758885f418 100644 --- a/testng/src/test/java/io/cucumber/testng/TestCaseResultListenerTest.java +++ b/testng/src/test/java/io/cucumber/testng/TestCaseResultListenerTest.java @@ -1,7 +1,7 @@ package io.cucumber.testng; import io.cucumber.core.api.event.Result; -import io.cucumber.core.event.EventBus; +import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.runner.TimeServiceEventBus; import org.testng.SkipException; import org.testng.annotations.Test; From 4d34d6e2e37e0c0d31f0962319687d48f14af269 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Thu, 27 Jun 2019 23:28:34 +0200 Subject: [PATCH 103/155] [Core] Move api.event and api.plugin to core package --- .../java/io/cucumber/core/api/Scenario.java | 2 +- .../cucumber/core/backend/StepDefinition.java | 2 +- .../core/{api => }/event/Argument.java | 2 +- .../core/{api => }/event/EmbedEvent.java | 2 +- .../cucumber/core/{api => }/event/Event.java | 2 +- .../core/{api => }/event/EventHandler.java | 2 +- .../core/{api => }/event/EventPublisher.java | 2 +- .../core/{api => }/event/HookTestStep.java | 2 +- .../core/{api => }/event/HookType.java | 2 +- .../{api => }/event/PickleStepTestStep.java | 2 +- .../cucumber/core/{api => }/event/Result.java | 2 +- .../event/SnippetsSuggestedEvent.java | 2 +- .../{api => }/event/StepDefinedEvent.java | 2 +- .../core/{api => }/event/StepDefinition.java | 2 +- .../core/{api => }/event/TestCase.java | 2 +- .../core/{api => }/event/TestCaseEvent.java | 2 +- .../{api => }/event/TestCaseFinished.java | 2 +- .../core/{api => }/event/TestCaseStarted.java | 2 +- .../core/{api => }/event/TestRunFinished.java | 2 +- .../core/{api => }/event/TestRunStarted.java | 2 +- .../core/{api => }/event/TestSourceRead.java | 2 +- .../core/{api => }/event/TestStep.java | 5 +-- .../{api => }/event/TestStepFinished.java | 2 +- .../core/{api => }/event/TestStepStarted.java | 2 +- .../{api => }/event/TimeStampedEvent.java | 2 +- .../core/{api => }/event/WriteEvent.java | 2 +- .../core/eventbus/AbstractEventBus.java | 2 +- .../core/eventbus/AbstractEventPublisher.java | 6 ++-- .../io/cucumber/core/eventbus/EventBus.java | 4 +-- .../cucumber/core/options/PluginOption.java | 8 ++--- .../core/plugin/CanonicalEventOrder.java | 14 ++++---- .../plugin/CanonicalOrderEventPublisher.java | 4 +-- .../core/{api => }/plugin/ColorAware.java | 2 +- .../plugin/ConcurrentEventListener.java | 8 ++--- .../core/plugin/DefaultSummaryPrinter.java | 10 ++---- .../core/{api => }/plugin/EventListener.java | 6 ++-- .../cucumber/core/plugin/HTMLFormatter.java | 27 ++++++++------- .../cucumber/core/plugin/JSONFormatter.java | 33 +++++++++---------- .../cucumber/core/plugin/JUnitFormatter.java | 26 +++++++-------- .../core/plugin/NullSummaryPrinter.java | 2 -- .../java/io/cucumber/core/plugin/Options.java | 2 +- .../core/{api => }/plugin/Plugin.java | 2 +- .../cucumber/core/plugin/PluginFactory.java | 1 - .../java/io/cucumber/core/plugin/Plugins.java | 11 ++----- .../cucumber/core/plugin/PrettyFormatter.java | 28 ++++++++-------- .../core/plugin/ProgressFormatter.java | 16 ++++----- .../cucumber/core/plugin/RerunFormatter.java | 12 +++---- .../java/io/cucumber/core/plugin/Stats.java | 19 +++++------ .../core/{api => }/plugin/StrictAware.java | 2 +- .../core/{api => }/plugin/SummaryPrinter.java | 2 +- .../cucumber/core/plugin/TestNGFormatter.java | 26 +++++++-------- .../core/plugin/TestSourcesModel.java | 2 +- .../core/plugin/TimelineFormatter.java | 17 +++++----- .../core/plugin/UndefinedStepsTracker.java | 9 +++-- .../plugin/UnusedStepsSummaryPrinter.java | 5 +-- .../cucumber/core/plugin/UsageFormatter.java | 14 ++++---- .../io/cucumber/core/runner/CachingGlue.java | 2 +- .../core/runner/DefinitionArgument.java | 2 +- .../io/cucumber/core/runner/HookTestStep.java | 4 +-- .../core/runner/PickleStepTestStep.java | 6 ++-- .../java/io/cucumber/core/runner/Runner.java | 4 +-- .../io/cucumber/core/runner/Scenario.java | 10 +++--- .../io/cucumber/core/runner/TestCase.java | 10 +++--- .../io/cucumber/core/runner/TestStep.java | 10 +++--- .../io/cucumber/core/runtime/Runtime.java | 21 ++++++------ .../runtime/ThreadLocalRunnerSupplier.java | 4 +-- .../TimeServiceEventBus.java | 2 +- .../cucumber/core/plugin/timeline/vis.min.js | 6 ++-- .../core/{api => }/event/ResultTest.java | 17 +++++----- .../core/options/CucumberOptions.java | 2 +- .../CucumberOptionsAnnotationParserTest.java | 4 +-- .../core/options/RuntimeOptionsTest.java | 12 +++---- .../core/plugin/CanonicalEventOrderTest.java | 15 ++++----- .../io/cucumber/core/plugin/FormatterSpy.java | 15 ++++----- .../core/plugin/HTMLFormatterTest.java | 2 +- .../core/plugin/JSONFormatterTest.java | 4 +-- .../core/plugin/JUnitFormatterTest.java | 2 +- .../core/plugin/JsonParallelRuntimeTest.java | 2 +- .../core/plugin/PluginFactoryTest.java | 10 +++--- .../io/cucumber/core/plugin/PluginsTest.java | 8 ++--- .../core/plugin/PrettyFormatterTest.java | 2 +- .../core/plugin/RerunFormatterTest.java | 2 +- .../io/cucumber/core/plugin/StatsTest.java | 2 +- .../cucumber/core/plugin/StubFormatter.java | 3 +- .../core/plugin/TestNGFormatterTest.java | 2 +- .../core/plugin/TimelineFormatterTest.java | 2 +- .../plugin/UndefinedStepsTrackerTest.java | 4 +-- .../plugin/UnusedStepsSummaryPrinterTest.java | 10 +++--- .../core/plugin/UsageFormatterTest.java | 10 +++--- .../io/cucumber/core/runner/EventBusTest.java | 13 ++++---- .../cucumber/core/runner/HookOrderTest.java | 1 + .../io/cucumber/core/runner/HookTest.java | 1 + .../core/runner/HookTestStepTest.java | 8 ++--- .../core/runner/PickleStepTestStepTest.java | 18 +++++----- .../io/cucumber/core/runner/RunnerTest.java | 1 + .../core/runner/ScenarioResultTest.java | 6 ++-- .../core/runner/StepDurationTimeService.java | 8 ++--- .../io/cucumber/core/runner/TestCaseTest.java | 8 ++--- .../core/runner/TestDefinitionArgument.java | 2 +- .../io/cucumber/core/runner/TestHelper.java | 27 +++++++-------- .../cucumber/core/runtime/ExitStatusTest.java | 7 ++-- .../io/cucumber/core/runtime/RuntimeTest.java | 25 +++++++------- .../runtime/SingletonRunnerSupplierTest.java | 1 - .../core/runtime/TestFeatureSupplier.java | 2 +- .../ThreadLocalRunnerSupplierTest.java | 5 ++- .../cucumber/java/JavaStepDefinitionTest.java | 8 ++--- .../main/java/io/cucumber/junit/Cucumber.java | 8 ++--- .../io/cucumber/junit/CucumberOptions.java | 2 +- .../java/io/cucumber/junit/JUnitReporter.java | 14 ++++---- .../io/cucumber/junit/FeatureRunnerTest.java | 2 +- .../junit/InvokeMethodsAroundEventsTest.java | 8 ++--- .../io/cucumber/junit/JUnitReporterTest.java | 4 +-- .../io/cucumber/testng/CucumberOptions.java | 2 +- .../testng/TestCaseResultListener.java | 6 ++-- .../cucumber/testng/TestNGCucumberRunner.java | 8 ++--- .../testng/TestCaseResultListenerTest.java | 4 +-- 116 files changed, 368 insertions(+), 417 deletions(-) rename core/src/main/java/io/cucumber/core/{api => }/event/Argument.java (91%) rename core/src/main/java/io/cucumber/core/{api => }/event/EmbedEvent.java (90%) rename core/src/main/java/io/cucumber/core/{api => }/event/Event.java (85%) rename core/src/main/java/io/cucumber/core/{api => }/event/EventHandler.java (69%) rename core/src/main/java/io/cucumber/core/{api => }/event/EventPublisher.java (98%) rename core/src/main/java/io/cucumber/core/{api => }/event/HookTestStep.java (90%) rename core/src/main/java/io/cucumber/core/{api => }/event/HookType.java (85%) rename core/src/main/java/io/cucumber/core/{api => }/event/PickleStepTestStep.java (97%) rename core/src/main/java/io/cucumber/core/{api => }/event/Result.java (98%) rename core/src/main/java/io/cucumber/core/{api => }/event/SnippetsSuggestedEvent.java (94%) rename core/src/main/java/io/cucumber/core/{api => }/event/StepDefinedEvent.java (89%) rename core/src/main/java/io/cucumber/core/{api => }/event/StepDefinition.java (94%) rename core/src/main/java/io/cucumber/core/{api => }/event/TestCase.java (92%) rename core/src/main/java/io/cucumber/core/{api => }/event/TestCaseEvent.java (90%) rename core/src/main/java/io/cucumber/core/{api => }/event/TestCaseFinished.java (90%) rename core/src/main/java/io/cucumber/core/{api => }/event/TestCaseStarted.java (88%) rename core/src/main/java/io/cucumber/core/{api => }/event/TestRunFinished.java (83%) rename core/src/main/java/io/cucumber/core/{api => }/event/TestRunStarted.java (82%) rename core/src/main/java/io/cucumber/core/{api => }/event/TestSourceRead.java (89%) rename core/src/main/java/io/cucumber/core/{api => }/event/TestStep.java (73%) rename core/src/main/java/io/cucumber/core/{api => }/event/TestStepFinished.java (96%) rename core/src/main/java/io/cucumber/core/{api => }/event/TestStepStarted.java (95%) rename core/src/main/java/io/cucumber/core/{api => }/event/TimeStampedEvent.java (90%) rename core/src/main/java/io/cucumber/core/{api => }/event/WriteEvent.java (87%) rename core/src/main/java/io/cucumber/core/{api => }/plugin/ColorAware.java (91%) rename core/src/main/java/io/cucumber/core/{api => }/plugin/ConcurrentEventListener.java (87%) rename core/src/main/java/io/cucumber/core/{api => }/plugin/EventListener.java (83%) rename core/src/main/java/io/cucumber/core/{api => }/plugin/Plugin.java (96%) rename core/src/main/java/io/cucumber/core/{api => }/plugin/StrictAware.java (90%) rename core/src/main/java/io/cucumber/core/{api => }/plugin/SummaryPrinter.java (79%) rename core/src/main/java/io/cucumber/core/{runner => runtime}/TimeServiceEventBus.java (91%) rename core/src/test/java/io/cucumber/core/{api => }/event/ResultTest.java (86%) diff --git a/core/src/main/java/io/cucumber/core/api/Scenario.java b/core/src/main/java/io/cucumber/core/api/Scenario.java index 3467617975..c0f1113c89 100644 --- a/core/src/main/java/io/cucumber/core/api/Scenario.java +++ b/core/src/main/java/io/cucumber/core/api/Scenario.java @@ -1,6 +1,6 @@ package io.cucumber.core.api; -import io.cucumber.core.api.event.Result; +import io.cucumber.core.event.Result; import java.util.Collection; diff --git a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java index feb8f88cb6..32bd2c1afa 100644 --- a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java @@ -5,7 +5,7 @@ import java.util.List; -public interface StepDefinition extends io.cucumber.core.api.event.StepDefinition { +public interface StepDefinition extends io.cucumber.core.event.StepDefinition { /** * Returns a list of arguments. Return null if the step definition * doesn't match at all. Return an empty List if it matches with 0 arguments diff --git a/core/src/main/java/io/cucumber/core/api/event/Argument.java b/core/src/main/java/io/cucumber/core/event/Argument.java similarity index 91% rename from core/src/main/java/io/cucumber/core/api/event/Argument.java rename to core/src/main/java/io/cucumber/core/event/Argument.java index bc3f1ea623..f75b61262e 100644 --- a/core/src/main/java/io/cucumber/core/api/event/Argument.java +++ b/core/src/main/java/io/cucumber/core/event/Argument.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; /** * Represents an argument in for a step definition. diff --git a/core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java b/core/src/main/java/io/cucumber/core/event/EmbedEvent.java similarity index 90% rename from core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java rename to core/src/main/java/io/cucumber/core/event/EmbedEvent.java index b21c6d773f..62397ae68b 100644 --- a/core/src/main/java/io/cucumber/core/api/event/EmbedEvent.java +++ b/core/src/main/java/io/cucumber/core/event/EmbedEvent.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/api/event/Event.java b/core/src/main/java/io/cucumber/core/event/Event.java similarity index 85% rename from core/src/main/java/io/cucumber/core/api/event/Event.java rename to core/src/main/java/io/cucumber/core/event/Event.java index 8e92dc3b40..e7ae8dece3 100644 --- a/core/src/main/java/io/cucumber/core/api/event/Event.java +++ b/core/src/main/java/io/cucumber/core/event/Event.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; public interface Event { diff --git a/core/src/main/java/io/cucumber/core/api/event/EventHandler.java b/core/src/main/java/io/cucumber/core/event/EventHandler.java similarity index 69% rename from core/src/main/java/io/cucumber/core/api/event/EventHandler.java rename to core/src/main/java/io/cucumber/core/event/EventHandler.java index ae514f4ff6..9f460b0228 100644 --- a/core/src/main/java/io/cucumber/core/api/event/EventHandler.java +++ b/core/src/main/java/io/cucumber/core/event/EventHandler.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; public interface EventHandler { diff --git a/core/src/main/java/io/cucumber/core/api/event/EventPublisher.java b/core/src/main/java/io/cucumber/core/event/EventPublisher.java similarity index 98% rename from core/src/main/java/io/cucumber/core/api/event/EventPublisher.java rename to core/src/main/java/io/cucumber/core/event/EventPublisher.java index 2fe290a6cb..08a46641c0 100644 --- a/core/src/main/java/io/cucumber/core/api/event/EventPublisher.java +++ b/core/src/main/java/io/cucumber/core/event/EventPublisher.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; public interface EventPublisher { diff --git a/core/src/main/java/io/cucumber/core/api/event/HookTestStep.java b/core/src/main/java/io/cucumber/core/event/HookTestStep.java similarity index 90% rename from core/src/main/java/io/cucumber/core/api/event/HookTestStep.java rename to core/src/main/java/io/cucumber/core/event/HookTestStep.java index 8a897d7786..c31a1b7591 100644 --- a/core/src/main/java/io/cucumber/core/api/event/HookTestStep.java +++ b/core/src/main/java/io/cucumber/core/event/HookTestStep.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; /** * Hooks are invoked before and after each scenario and before and diff --git a/core/src/main/java/io/cucumber/core/api/event/HookType.java b/core/src/main/java/io/cucumber/core/event/HookType.java similarity index 85% rename from core/src/main/java/io/cucumber/core/api/event/HookType.java rename to core/src/main/java/io/cucumber/core/event/HookType.java index 58e3f39ea2..43d2a366b1 100644 --- a/core/src/main/java/io/cucumber/core/api/event/HookType.java +++ b/core/src/main/java/io/cucumber/core/event/HookType.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import static java.util.Locale.ROOT; diff --git a/core/src/main/java/io/cucumber/core/api/event/PickleStepTestStep.java b/core/src/main/java/io/cucumber/core/event/PickleStepTestStep.java similarity index 97% rename from core/src/main/java/io/cucumber/core/api/event/PickleStepTestStep.java rename to core/src/main/java/io/cucumber/core/event/PickleStepTestStep.java index b5c3075dac..c605617ac1 100644 --- a/core/src/main/java/io/cucumber/core/api/event/PickleStepTestStep.java +++ b/core/src/main/java/io/cucumber/core/event/PickleStepTestStep.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/api/event/Result.java b/core/src/main/java/io/cucumber/core/event/Result.java similarity index 98% rename from core/src/main/java/io/cucumber/core/api/event/Result.java rename to core/src/main/java/io/cucumber/core/event/Result.java index 53d32ba4d0..b476a41b36 100644 --- a/core/src/main/java/io/cucumber/core/api/event/Result.java +++ b/core/src/main/java/io/cucumber/core/event/Result.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.io.PrintWriter; import java.io.StringWriter; diff --git a/core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java b/core/src/main/java/io/cucumber/core/event/SnippetsSuggestedEvent.java similarity index 94% rename from core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java rename to core/src/main/java/io/cucumber/core/event/SnippetsSuggestedEvent.java index b84ea9fc6c..ac3118c0ef 100644 --- a/core/src/main/java/io/cucumber/core/api/event/SnippetsSuggestedEvent.java +++ b/core/src/main/java/io/cucumber/core/event/SnippetsSuggestedEvent.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import gherkin.pickles.PickleLocation; diff --git a/core/src/main/java/io/cucumber/core/api/event/StepDefinedEvent.java b/core/src/main/java/io/cucumber/core/event/StepDefinedEvent.java similarity index 89% rename from core/src/main/java/io/cucumber/core/api/event/StepDefinedEvent.java rename to core/src/main/java/io/cucumber/core/event/StepDefinedEvent.java index f3b5f8fd80..3a25cef961 100644 --- a/core/src/main/java/io/cucumber/core/api/event/StepDefinedEvent.java +++ b/core/src/main/java/io/cucumber/core/event/StepDefinedEvent.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/api/event/StepDefinition.java b/core/src/main/java/io/cucumber/core/event/StepDefinition.java similarity index 94% rename from core/src/main/java/io/cucumber/core/api/event/StepDefinition.java rename to core/src/main/java/io/cucumber/core/event/StepDefinition.java index c2f69dcb58..fa41502bfa 100644 --- a/core/src/main/java/io/cucumber/core/api/event/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/event/StepDefinition.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; public interface StepDefinition { diff --git a/core/src/main/java/io/cucumber/core/api/event/TestCase.java b/core/src/main/java/io/cucumber/core/event/TestCase.java similarity index 92% rename from core/src/main/java/io/cucumber/core/api/event/TestCase.java rename to core/src/main/java/io/cucumber/core/event/TestCase.java index 412d4b3232..ac19208ec5 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestCase.java +++ b/core/src/main/java/io/cucumber/core/event/TestCase.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import gherkin.pickles.PickleTag; diff --git a/core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java b/core/src/main/java/io/cucumber/core/event/TestCaseEvent.java similarity index 90% rename from core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java rename to core/src/main/java/io/cucumber/core/event/TestCaseEvent.java index ff32a59c21..b53b8ce44d 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestCaseEvent.java +++ b/core/src/main/java/io/cucumber/core/event/TestCaseEvent.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java b/core/src/main/java/io/cucumber/core/event/TestCaseFinished.java similarity index 90% rename from core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java rename to core/src/main/java/io/cucumber/core/event/TestCaseFinished.java index f9aaa2878a..01d4aa08dc 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestCaseFinished.java +++ b/core/src/main/java/io/cucumber/core/event/TestCaseFinished.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java b/core/src/main/java/io/cucumber/core/event/TestCaseStarted.java similarity index 88% rename from core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java rename to core/src/main/java/io/cucumber/core/event/TestCaseStarted.java index 583fef41c0..ba57efe8d8 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestCaseStarted.java +++ b/core/src/main/java/io/cucumber/core/event/TestCaseStarted.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java b/core/src/main/java/io/cucumber/core/event/TestRunFinished.java similarity index 83% rename from core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java rename to core/src/main/java/io/cucumber/core/event/TestRunFinished.java index c75a5b24e3..ea8d176154 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestRunFinished.java +++ b/core/src/main/java/io/cucumber/core/event/TestRunFinished.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java b/core/src/main/java/io/cucumber/core/event/TestRunStarted.java similarity index 82% rename from core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java rename to core/src/main/java/io/cucumber/core/event/TestRunStarted.java index e7a43fc1d3..d4daf7d883 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestRunStarted.java +++ b/core/src/main/java/io/cucumber/core/event/TestRunStarted.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java b/core/src/main/java/io/cucumber/core/event/TestSourceRead.java similarity index 89% rename from core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java rename to core/src/main/java/io/cucumber/core/event/TestSourceRead.java index 9c9d63a17e..9ffe38593e 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestSourceRead.java +++ b/core/src/main/java/io/cucumber/core/event/TestSourceRead.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/api/event/TestStep.java b/core/src/main/java/io/cucumber/core/event/TestStep.java similarity index 73% rename from core/src/main/java/io/cucumber/core/api/event/TestStep.java rename to core/src/main/java/io/cucumber/core/event/TestStep.java index af57497b06..df8832d17b 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestStep.java +++ b/core/src/main/java/io/cucumber/core/event/TestStep.java @@ -1,7 +1,4 @@ -package io.cucumber.core.api.event; - -import io.cucumber.core.api.event.TestCaseFinished; -import io.cucumber.core.api.event.TestCaseStarted; +package io.cucumber.core.event; /** * A test step can either represent the execution of a hook diff --git a/core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java b/core/src/main/java/io/cucumber/core/event/TestStepFinished.java similarity index 96% rename from core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java rename to core/src/main/java/io/cucumber/core/event/TestStepFinished.java index 98baebfd87..ae1b550fcc 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestStepFinished.java +++ b/core/src/main/java/io/cucumber/core/event/TestStepFinished.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java b/core/src/main/java/io/cucumber/core/event/TestStepStarted.java similarity index 95% rename from core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java rename to core/src/main/java/io/cucumber/core/event/TestStepStarted.java index b46fe83c70..bb4b3e06a5 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TestStepStarted.java +++ b/core/src/main/java/io/cucumber/core/event/TestStepStarted.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java b/core/src/main/java/io/cucumber/core/event/TimeStampedEvent.java similarity index 90% rename from core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java rename to core/src/main/java/io/cucumber/core/event/TimeStampedEvent.java index a3cd79f55a..17ccb42bf5 100644 --- a/core/src/main/java/io/cucumber/core/api/event/TimeStampedEvent.java +++ b/core/src/main/java/io/cucumber/core/event/TimeStampedEvent.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/api/event/WriteEvent.java b/core/src/main/java/io/cucumber/core/event/WriteEvent.java similarity index 87% rename from core/src/main/java/io/cucumber/core/api/event/WriteEvent.java rename to core/src/main/java/io/cucumber/core/event/WriteEvent.java index dbc5f4c023..412f5236fe 100644 --- a/core/src/main/java/io/cucumber/core/api/event/WriteEvent.java +++ b/core/src/main/java/io/cucumber/core/event/WriteEvent.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.event; +package io.cucumber.core.event; import java.time.Instant; diff --git a/core/src/main/java/io/cucumber/core/eventbus/AbstractEventBus.java b/core/src/main/java/io/cucumber/core/eventbus/AbstractEventBus.java index 0588eab219..c231ec72a4 100644 --- a/core/src/main/java/io/cucumber/core/eventbus/AbstractEventBus.java +++ b/core/src/main/java/io/cucumber/core/eventbus/AbstractEventBus.java @@ -1,6 +1,6 @@ package io.cucumber.core.eventbus; -import io.cucumber.core.api.event.Event; +import io.cucumber.core.event.Event; public abstract class AbstractEventBus extends AbstractEventPublisher implements EventBus { diff --git a/core/src/main/java/io/cucumber/core/eventbus/AbstractEventPublisher.java b/core/src/main/java/io/cucumber/core/eventbus/AbstractEventPublisher.java index 4a96d877ce..b37a703cc6 100644 --- a/core/src/main/java/io/cucumber/core/eventbus/AbstractEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/eventbus/AbstractEventPublisher.java @@ -1,8 +1,8 @@ package io.cucumber.core.eventbus; -import io.cucumber.core.api.event.Event; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.event.Event; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; import java.util.ArrayList; import java.util.HashMap; diff --git a/core/src/main/java/io/cucumber/core/eventbus/EventBus.java b/core/src/main/java/io/cucumber/core/eventbus/EventBus.java index 419587723f..c16bf48169 100644 --- a/core/src/main/java/io/cucumber/core/eventbus/EventBus.java +++ b/core/src/main/java/io/cucumber/core/eventbus/EventBus.java @@ -2,8 +2,8 @@ import java.time.Instant; -import io.cucumber.core.api.event.Event; -import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.event.Event; +import io.cucumber.core.event.EventPublisher; public interface EventBus extends EventPublisher { diff --git a/core/src/main/java/io/cucumber/core/options/PluginOption.java b/core/src/main/java/io/cucumber/core/options/PluginOption.java index b286bc5009..6016f167f8 100644 --- a/core/src/main/java/io/cucumber/core/options/PluginOption.java +++ b/core/src/main/java/io/cucumber/core/options/PluginOption.java @@ -1,9 +1,9 @@ package io.cucumber.core.options; -import io.cucumber.core.api.plugin.Plugin; -import io.cucumber.core.api.plugin.SummaryPrinter; -import io.cucumber.core.api.plugin.ConcurrentEventListener; -import io.cucumber.core.api.plugin.EventListener; +import io.cucumber.core.plugin.Plugin; +import io.cucumber.core.plugin.SummaryPrinter; +import io.cucumber.core.plugin.ConcurrentEventListener; +import io.cucumber.core.plugin.EventListener; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.logging.Logger; import io.cucumber.core.logging.LoggerFactory; diff --git a/core/src/main/java/io/cucumber/core/plugin/CanonicalEventOrder.java b/core/src/main/java/io/cucumber/core/plugin/CanonicalEventOrder.java index 6a3e5d35e8..dd78fe5858 100644 --- a/core/src/main/java/io/cucumber/core/plugin/CanonicalEventOrder.java +++ b/core/src/main/java/io/cucumber/core/plugin/CanonicalEventOrder.java @@ -1,12 +1,12 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.Event; -import io.cucumber.core.api.event.SnippetsSuggestedEvent; -import io.cucumber.core.api.event.StepDefinedEvent; -import io.cucumber.core.api.event.TestCaseEvent; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.event.TestRunStarted; -import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.event.Event; +import io.cucumber.core.event.SnippetsSuggestedEvent; +import io.cucumber.core.event.StepDefinedEvent; +import io.cucumber.core.event.TestCaseEvent; +import io.cucumber.core.event.TestRunFinished; +import io.cucumber.core.event.TestRunStarted; +import io.cucumber.core.event.TestSourceRead; import java.util.Comparator; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java b/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java index 34e6da6032..8562b027d5 100644 --- a/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java +++ b/core/src/main/java/io/cucumber/core/plugin/CanonicalOrderEventPublisher.java @@ -1,7 +1,7 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.Event; -import io.cucumber.core.api.event.TestRunFinished; +import io.cucumber.core.event.Event; +import io.cucumber.core.event.TestRunFinished; import io.cucumber.core.eventbus.AbstractEventPublisher; import java.util.LinkedList; diff --git a/core/src/main/java/io/cucumber/core/api/plugin/ColorAware.java b/core/src/main/java/io/cucumber/core/plugin/ColorAware.java similarity index 91% rename from core/src/main/java/io/cucumber/core/api/plugin/ColorAware.java rename to core/src/main/java/io/cucumber/core/plugin/ColorAware.java index 642a1c7905..ee823d2979 100644 --- a/core/src/main/java/io/cucumber/core/api/plugin/ColorAware.java +++ b/core/src/main/java/io/cucumber/core/plugin/ColorAware.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.plugin; +package io.cucumber.core.plugin; /** * Interface for Plugins that use ANSI escape codes to print coloured output. diff --git a/core/src/main/java/io/cucumber/core/api/plugin/ConcurrentEventListener.java b/core/src/main/java/io/cucumber/core/plugin/ConcurrentEventListener.java similarity index 87% rename from core/src/main/java/io/cucumber/core/api/plugin/ConcurrentEventListener.java rename to core/src/main/java/io/cucumber/core/plugin/ConcurrentEventListener.java index e9ddd3c482..f0af4135e2 100644 --- a/core/src/main/java/io/cucumber/core/api/plugin/ConcurrentEventListener.java +++ b/core/src/main/java/io/cucumber/core/plugin/ConcurrentEventListener.java @@ -1,8 +1,8 @@ -package io.cucumber.core.api.plugin; +package io.cucumber.core.plugin; -import io.cucumber.core.api.event.Event; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.event.Event; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.TestCase; /** * Listens to pickle execution events. Can be used to diff --git a/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java index 5b18fe6db1..6cd155ee0f 100644 --- a/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/DefaultSummaryPrinter.java @@ -1,12 +1,8 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.plugin.SummaryPrinter; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.plugin.EventListener; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.plugin.ColorAware; -import io.cucumber.core.api.plugin.StrictAware; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.TestRunFinished; import java.io.PrintStream; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/api/plugin/EventListener.java b/core/src/main/java/io/cucumber/core/plugin/EventListener.java similarity index 83% rename from core/src/main/java/io/cucumber/core/api/plugin/EventListener.java rename to core/src/main/java/io/cucumber/core/plugin/EventListener.java index ac1f027bb2..c313a4add4 100644 --- a/core/src/main/java/io/cucumber/core/api/plugin/EventListener.java +++ b/core/src/main/java/io/cucumber/core/plugin/EventListener.java @@ -1,7 +1,7 @@ -package io.cucumber.core.api.plugin; +package io.cucumber.core.plugin; -import io.cucumber.core.api.event.Event; -import io.cucumber.core.api.event.EventPublisher; +import io.cucumber.core.event.Event; +import io.cucumber.core.event.EventPublisher; /** * Listens to pickle execution events. Can be used to diff --git a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index 815ab0bf05..7f4011aa1e 100644 --- a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -1,19 +1,18 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.HookTestStep; -import io.cucumber.core.api.event.PickleStepTestStep; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.event.TestCase; -import io.cucumber.core.api.event.EmbedEvent; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.plugin.EventListener; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.TestCaseStarted; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.event.TestSourceRead; -import io.cucumber.core.api.event.TestStepFinished; -import io.cucumber.core.api.event.TestStepStarted; -import io.cucumber.core.api.event.WriteEvent; +import io.cucumber.core.event.HookTestStep; +import io.cucumber.core.event.PickleStepTestStep; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.TestCase; +import io.cucumber.core.event.EmbedEvent; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.TestCaseStarted; +import io.cucumber.core.event.TestRunFinished; +import io.cucumber.core.event.TestSourceRead; +import io.cucumber.core.event.TestStepFinished; +import io.cucumber.core.event.TestStepStarted; +import io.cucumber.core.event.WriteEvent; import io.cucumber.core.exception.CucumberException; import gherkin.ast.Background; import gherkin.ast.DataTable; diff --git a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java index 213bc96766..1d0ce96426 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java @@ -1,21 +1,20 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.HookTestStep; -import io.cucumber.core.api.event.HookType; -import io.cucumber.core.api.event.PickleStepTestStep; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.event.TestCase; -import io.cucumber.core.api.event.TestStep; -import io.cucumber.core.api.event.EmbedEvent; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.plugin.EventListener; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.TestCaseStarted; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.event.TestSourceRead; -import io.cucumber.core.api.event.TestStepFinished; -import io.cucumber.core.api.event.TestStepStarted; -import io.cucumber.core.api.event.WriteEvent; +import io.cucumber.core.event.HookTestStep; +import io.cucumber.core.event.HookType; +import io.cucumber.core.event.PickleStepTestStep; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.TestCase; +import io.cucumber.core.event.TestStep; +import io.cucumber.core.event.EmbedEvent; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.TestCaseStarted; +import io.cucumber.core.event.TestRunFinished; +import io.cucumber.core.event.TestSourceRead; +import io.cucumber.core.event.TestStepFinished; +import io.cucumber.core.event.TestStepStarted; +import io.cucumber.core.event.WriteEvent; import gherkin.ast.Background; import gherkin.ast.Feature; import gherkin.ast.ScenarioDefinition; @@ -358,7 +357,7 @@ private Map createMatchMap(TestStep step, Result result) { PickleStepTestStep testStep = (PickleStepTestStep) step; if (!testStep.getDefinitionArgument().isEmpty()) { List> argumentList = new ArrayList>(); - for (io.cucumber.core.api.event.Argument argument : testStep.getDefinitionArgument()) { + for (io.cucumber.core.event.Argument argument : testStep.getDefinitionArgument()) { Map argumentMap = new HashMap(); if (argument.getValue() != null) { argumentMap.put("val", argument.getValue()); diff --git a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java index 11285c3b89..6756f99086 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java @@ -1,16 +1,14 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.PickleStepTestStep; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.plugin.EventListener; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.TestCaseFinished; -import io.cucumber.core.api.event.TestCaseStarted; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.event.TestSourceRead; -import io.cucumber.core.api.event.TestStepFinished; -import io.cucumber.core.api.plugin.StrictAware; +import io.cucumber.core.event.PickleStepTestStep; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.TestCaseFinished; +import io.cucumber.core.event.TestCaseStarted; +import io.cucumber.core.event.TestRunFinished; +import io.cucumber.core.event.TestSourceRead; +import io.cucumber.core.event.TestStepFinished; import io.cucumber.core.exception.CucumberException; import org.w3c.dom.Document; @@ -206,9 +204,9 @@ final class TestCase { private final List steps = new ArrayList<>(); private final List results = new ArrayList<>(); - private final io.cucumber.core.api.event.TestCase testCase; + private final io.cucumber.core.event.TestCase testCase; - TestCase(io.cucumber.core.api.event.TestCase testCase) { + TestCase(io.cucumber.core.event.TestCase testCase) { this.testCase = testCase; } @@ -221,7 +219,7 @@ void writeElement(Element tc) { tc.setAttribute("name", calculateElementName(testCase)); } - private String calculateElementName(io.cucumber.core.api.event.TestCase testCase) { + private String calculateElementName(io.cucumber.core.event.TestCase testCase) { String testCaseName = testCase.getName(); if (testCaseName.equals(previousTestCaseName)) { return getUniqueTestNameForScenarioExample(testCaseName, ++exampleNumber); diff --git a/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java index 467de751c1..3c0bf85d0d 100644 --- a/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/NullSummaryPrinter.java @@ -1,7 +1,5 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.plugin.SummaryPrinter; - public final class NullSummaryPrinter implements SummaryPrinter { @SuppressWarnings("WeakerAccess") // Used by PluginFactory diff --git a/core/src/main/java/io/cucumber/core/plugin/Options.java b/core/src/main/java/io/cucumber/core/plugin/Options.java index 1f709cbc0e..583495e7e1 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Options.java +++ b/core/src/main/java/io/cucumber/core/plugin/Options.java @@ -9,7 +9,7 @@ public interface Options { interface Plugin { - Class pluginClass(); + Class pluginClass(); String argument(); diff --git a/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java b/core/src/main/java/io/cucumber/core/plugin/Plugin.java similarity index 96% rename from core/src/main/java/io/cucumber/core/api/plugin/Plugin.java rename to core/src/main/java/io/cucumber/core/plugin/Plugin.java index ff3427a158..035721df09 100644 --- a/core/src/main/java/io/cucumber/core/api/plugin/Plugin.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugin.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.plugin; +package io.cucumber.core.plugin; import java.io.File; import java.net.URI; diff --git a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java index f7a474fd84..1690f9fedb 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java +++ b/core/src/main/java/io/cucumber/core/plugin/PluginFactory.java @@ -1,6 +1,5 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.plugin.Plugin; import io.cucumber.core.exception.CucumberException; import java.io.File; diff --git a/core/src/main/java/io/cucumber/core/plugin/Plugins.java b/core/src/main/java/io/cucumber/core/plugin/Plugins.java index 50192650dd..8fbe88ab40 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Plugins.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugins.java @@ -1,13 +1,8 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.plugin.Plugin; -import io.cucumber.core.api.plugin.ConcurrentEventListener; -import io.cucumber.core.api.event.Event; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.plugin.EventListener; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.plugin.ColorAware; -import io.cucumber.core.api.plugin.StrictAware; +import io.cucumber.core.event.Event; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java index 3dd0fd8263..0ddb631266 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java @@ -1,20 +1,18 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.Argument; -import io.cucumber.core.api.plugin.EventListener; -import io.cucumber.core.api.event.PickleStepTestStep; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.event.TestCase; -import io.cucumber.core.api.event.TestStep; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.TestCaseStarted; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.event.TestSourceRead; -import io.cucumber.core.api.event.TestStepFinished; -import io.cucumber.core.api.event.TestStepStarted; -import io.cucumber.core.api.event.WriteEvent; -import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.event.Argument; +import io.cucumber.core.event.PickleStepTestStep; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.TestCase; +import io.cucumber.core.event.TestStep; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.TestCaseStarted; +import io.cucumber.core.event.TestRunFinished; +import io.cucumber.core.event.TestSourceRead; +import io.cucumber.core.event.TestStepFinished; +import io.cucumber.core.event.TestStepStarted; +import io.cucumber.core.event.WriteEvent; import io.cucumber.core.util.FixJava; import io.cucumber.core.util.Mapper; import gherkin.ast.Background; diff --git a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java index 5d0f281d9a..99688fb4f8 100644 --- a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java @@ -1,14 +1,12 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.PickleStepTestStep; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.plugin.ConcurrentEventListener; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.event.TestStepFinished; -import io.cucumber.core.api.event.WriteEvent; -import io.cucumber.core.api.plugin.ColorAware; +import io.cucumber.core.event.PickleStepTestStep; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.TestRunFinished; +import io.cucumber.core.event.TestStepFinished; +import io.cucumber.core.event.WriteEvent; import java.util.HashMap; import java.util.Map; diff --git a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java index ea1e62cbef..56ded200e9 100644 --- a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java @@ -1,12 +1,10 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.TestCase; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.plugin.EventListener; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.TestCaseFinished; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.plugin.StrictAware; +import io.cucumber.core.event.TestCase; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.TestCaseFinished; +import io.cucumber.core.event.TestRunFinished; import io.cucumber.core.feature.FeatureWithLines; import java.util.ArrayList; diff --git a/core/src/main/java/io/cucumber/core/plugin/Stats.java b/core/src/main/java/io/cucumber/core/plugin/Stats.java index f291fe1c71..d35ab3e293 100755 --- a/core/src/main/java/io/cucumber/core/plugin/Stats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Stats.java @@ -1,16 +1,13 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.event.PickleStepTestStep; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.plugin.EventListener; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.TestCaseFinished; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.event.TestRunStarted; -import io.cucumber.core.api.event.TestStepFinished; -import io.cucumber.core.api.plugin.ColorAware; -import io.cucumber.core.api.plugin.StrictAware; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.PickleStepTestStep; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.TestCaseFinished; +import io.cucumber.core.event.TestRunFinished; +import io.cucumber.core.event.TestRunStarted; +import io.cucumber.core.event.TestStepFinished; import java.io.PrintStream; import java.text.DecimalFormat; diff --git a/core/src/main/java/io/cucumber/core/api/plugin/StrictAware.java b/core/src/main/java/io/cucumber/core/plugin/StrictAware.java similarity index 90% rename from core/src/main/java/io/cucumber/core/api/plugin/StrictAware.java rename to core/src/main/java/io/cucumber/core/plugin/StrictAware.java index 6955552df3..cdbbf00767 100755 --- a/core/src/main/java/io/cucumber/core/api/plugin/StrictAware.java +++ b/core/src/main/java/io/cucumber/core/plugin/StrictAware.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.plugin; +package io.cucumber.core.plugin; /** * Interface for Plugins that need to know if the Runtime is strict. diff --git a/core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/SummaryPrinter.java similarity index 79% rename from core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java rename to core/src/main/java/io/cucumber/core/plugin/SummaryPrinter.java index 2cfb04ba9c..45db5edf00 100644 --- a/core/src/main/java/io/cucumber/core/api/plugin/SummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/SummaryPrinter.java @@ -1,4 +1,4 @@ -package io.cucumber.core.api.plugin; +package io.cucumber.core.plugin; /** * Interface for plugins that print a summary after test execution. diff --git a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java index f0465bebe8..656b21dfaf 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java @@ -1,16 +1,14 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.PickleStepTestStep; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.plugin.EventListener; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.TestCaseFinished; -import io.cucumber.core.api.event.TestCaseStarted; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.event.TestSourceRead; -import io.cucumber.core.api.event.TestStepFinished; -import io.cucumber.core.api.plugin.StrictAware; +import io.cucumber.core.event.PickleStepTestStep; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.TestCaseFinished; +import io.cucumber.core.event.TestCaseStarted; +import io.cucumber.core.event.TestRunFinished; +import io.cucumber.core.event.TestSourceRead; +import io.cucumber.core.event.TestStepFinished; import io.cucumber.core.exception.CucumberException; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -218,10 +216,10 @@ final class TestCase { private final List steps = new ArrayList<>(); private final List results = new ArrayList<>(); private final List hooks = new ArrayList<>(); - private final io.cucumber.core.api.event.TestCase testCase; + private final io.cucumber.core.event.TestCase testCase; private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); - TestCase(io.cucumber.core.api.event.TestCase testCase) { + TestCase(io.cucumber.core.event.TestCase testCase) { this.testCase = testCase; } @@ -230,7 +228,7 @@ private void start(Element element) { element.setAttribute("started-at", dateFormat.format(new Date())); } - private String calculateElementName(io.cucumber.core.api.event.TestCase testCase) { + private String calculateElementName(io.cucumber.core.event.TestCase testCase) { String testCaseName = testCase.getName(); if (testCaseName.equals(previousTestCaseName)) { return testCaseName + "_" + ++exampleNumber; diff --git a/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java b/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java index a077da1241..dded4c74ee 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java @@ -1,6 +1,6 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.event.TestSourceRead; import gherkin.AstBuilder; import gherkin.GherkinDialect; import gherkin.GherkinDialectProvider; diff --git a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index 0322534920..1a9970cc53 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -1,14 +1,13 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.TestCase; -import io.cucumber.core.api.plugin.ConcurrentEventListener; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.TestCaseEvent; -import io.cucumber.core.api.event.TestCaseFinished; -import io.cucumber.core.api.event.TestCaseStarted; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.event.TestCase; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.TestCaseEvent; +import io.cucumber.core.event.TestCaseFinished; +import io.cucumber.core.event.TestCaseStarted; +import io.cucumber.core.event.TestRunFinished; +import io.cucumber.core.event.TestSourceRead; import io.cucumber.core.exception.CucumberException; import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; diff --git a/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java index f5b68d31b3..22cea30c16 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java +++ b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java @@ -1,10 +1,9 @@ package io.cucumber.core.plugin; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.plugin.EventListener; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.SnippetsSuggestedEvent; -import io.cucumber.core.api.event.TestSourceRead; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.SnippetsSuggestedEvent; +import io.cucumber.core.event.TestSourceRead; import gherkin.AstBuilder; import gherkin.GherkinDialect; import gherkin.GherkinDialectProvider; diff --git a/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java index 7c6c060528..f54c9df495 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java @@ -4,10 +4,7 @@ import java.util.Map.Entry; import java.util.TreeMap; -import io.cucumber.core.api.event.*; -import io.cucumber.core.api.plugin.ColorAware; -import io.cucumber.core.api.plugin.EventListener; -import io.cucumber.core.api.plugin.SummaryPrinter; +import io.cucumber.core.event.*; public class UnusedStepsSummaryPrinter implements ColorAware, EventListener, SummaryPrinter { diff --git a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java index 4834f44976..12b702b056 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java @@ -4,14 +4,12 @@ import gherkin.deps.com.google.gson.GsonBuilder; import gherkin.deps.com.google.gson.JsonPrimitive; import gherkin.deps.com.google.gson.JsonSerializer; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.plugin.EventListener; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.PickleStepTestStep; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.event.TestStepFinished; -import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.PickleStepTestStep; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.TestRunFinished; +import io.cucumber.core.event.TestStepFinished; import java.time.Duration; import java.util.ArrayList; diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 822a95c7a4..b6b26dd7c0 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.event.StepDefinedEvent; +import io.cucumber.core.event.StepDefinedEvent; import io.cucumber.core.backend.DuplicateStepDefinitionException; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; diff --git a/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java b/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java index ddbaeb7aff..138063649e 100644 --- a/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java +++ b/core/src/main/java/io/cucumber/core/runner/DefinitionArgument.java @@ -1,6 +1,6 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.event.Argument; +import io.cucumber.core.event.Argument; import io.cucumber.core.stepexpression.ExpressionArgument; import java.util.ArrayList; diff --git a/core/src/main/java/io/cucumber/core/runner/HookTestStep.java b/core/src/main/java/io/cucumber/core/runner/HookTestStep.java index 3244f23bf2..b5aa510763 100644 --- a/core/src/main/java/io/cucumber/core/runner/HookTestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/HookTestStep.java @@ -1,8 +1,8 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.event.HookType; +import io.cucumber.core.event.HookType; -final class HookTestStep extends TestStep implements io.cucumber.core.api.event.HookTestStep { +final class HookTestStep extends TestStep implements io.cucumber.core.event.HookTestStep { private final HookType hookType; HookTestStep(HookType hookType, HookDefinitionMatch definitionMatch) { diff --git a/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java index 4097ee03ce..84b95e8106 100644 --- a/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java @@ -1,14 +1,14 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.event.Argument; -import io.cucumber.core.api.event.TestCase; +import io.cucumber.core.event.Argument; +import io.cucumber.core.event.TestCase; import gherkin.pickles.PickleStep; import io.cucumber.core.eventbus.EventBus; import java.util.Collections; import java.util.List; -final class PickleStepTestStep extends TestStep implements io.cucumber.core.api.event.PickleStepTestStep { +final class PickleStepTestStep extends TestStep implements io.cucumber.core.event.PickleStepTestStep { private final String uri; private final PickleStep step; private final List afterStepHookSteps; diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index 0abee74b57..1c9d7fbdc8 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -1,7 +1,7 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.event.HookType; -import io.cucumber.core.api.event.SnippetsSuggestedEvent; +import io.cucumber.core.event.HookType; +import io.cucumber.core.event.SnippetsSuggestedEvent; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; diff --git a/core/src/main/java/io/cucumber/core/runner/Scenario.java b/core/src/main/java/io/cucumber/core/runner/Scenario.java index 5cb93be974..a911073da8 100644 --- a/core/src/main/java/io/cucumber/core/runner/Scenario.java +++ b/core/src/main/java/io/cucumber/core/runner/Scenario.java @@ -1,9 +1,9 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.event.EmbedEvent; -import io.cucumber.core.api.event.TestCase; -import io.cucumber.core.api.event.WriteEvent; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.EmbedEvent; +import io.cucumber.core.event.TestCase; +import io.cucumber.core.event.WriteEvent; import gherkin.pickles.PickleTag; import io.cucumber.core.eventbus.EventBus; @@ -21,7 +21,7 @@ class Scenario implements io.cucumber.core.api.Scenario { private final EventBus bus; private final TestCase testCase; - Scenario(EventBus bus, io.cucumber.core.api.event.TestCase testCase) { + Scenario(EventBus bus, io.cucumber.core.event.TestCase testCase) { this.bus = bus; this.testCase = testCase; } diff --git a/core/src/main/java/io/cucumber/core/runner/TestCase.java b/core/src/main/java/io/cucumber/core/runner/TestCase.java index 1965b8e411..97cbea8264 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestCase.java +++ b/core/src/main/java/io/cucumber/core/runner/TestCase.java @@ -1,9 +1,9 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.event.TestStep; -import io.cucumber.core.api.event.TestCaseFinished; -import io.cucumber.core.api.event.TestCaseStarted; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.TestStep; +import io.cucumber.core.event.TestCaseFinished; +import io.cucumber.core.event.TestCaseStarted; import gherkin.events.PickleEvent; import gherkin.pickles.PickleTag; import io.cucumber.core.eventbus.EventBus; @@ -14,7 +14,7 @@ import java.util.ArrayList; import java.util.List; -final class TestCase implements io.cucumber.core.api.event.TestCase { +final class TestCase implements io.cucumber.core.event.TestCase { private final PickleEvent pickleEvent; private final List testSteps; private final boolean dryRun; diff --git a/core/src/main/java/io/cucumber/core/runner/TestStep.java b/core/src/main/java/io/cucumber/core/runner/TestStep.java index 15e5a123dc..e3241e645d 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/TestStep.java @@ -1,10 +1,10 @@ package io.cucumber.core.runner; import io.cucumber.core.backend.Pending; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.event.TestCase; -import io.cucumber.core.api.event.TestStepFinished; -import io.cucumber.core.api.event.TestStepStarted; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.TestCase; +import io.cucumber.core.event.TestStepFinished; +import io.cucumber.core.event.TestStepStarted; import io.cucumber.core.backend.StepDefinitionMatch; import io.cucumber.core.eventbus.EventBus; @@ -12,7 +12,7 @@ import java.time.Instant; import java.util.Arrays; -abstract class TestStep implements io.cucumber.core.api.event.TestStep { +abstract class TestStep implements io.cucumber.core.event.TestStep { private static final String[] ASSUMPTION_VIOLATED_EXCEPTIONS = { "org.junit.AssumptionViolatedException", "org.junit.internal.AssumptionViolatedException", diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index e432d1f75d..e52485980d 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -1,15 +1,15 @@ package io.cucumber.core.runtime; import gherkin.events.PickleEvent; -import io.cucumber.core.api.plugin.ConcurrentEventListener; -import io.cucumber.core.api.event.EventHandler; -import io.cucumber.core.api.event.EventPublisher; -import io.cucumber.core.api.event.Result; -import io.cucumber.core.api.event.TestCaseFinished; -import io.cucumber.core.api.event.TestRunFinished; -import io.cucumber.core.api.event.TestRunStarted; -import io.cucumber.core.api.event.TestSourceRead; -import io.cucumber.core.api.plugin.Plugin; +import io.cucumber.core.plugin.ConcurrentEventListener; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.TestCaseFinished; +import io.cucumber.core.event.TestRunFinished; +import io.cucumber.core.event.TestRunStarted; +import io.cucumber.core.event.TestSourceRead; +import io.cucumber.core.plugin.Plugin; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.exception.CompositeCucumberException; import io.cucumber.core.exception.CucumberException; @@ -24,7 +24,6 @@ import io.cucumber.core.order.PickleOrder; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.plugin.Plugins; -import io.cucumber.core.runner.TimeServiceEventBus; import io.cucumber.core.logging.Logger; import io.cucumber.core.logging.LoggerFactory; @@ -41,7 +40,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import static io.cucumber.core.api.event.Result.SEVERITY; +import static io.cucumber.core.event.Result.SEVERITY; import static java.util.Collections.emptyList; import static java.util.Collections.max; import static java.util.Collections.min; diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java index a4ddaa988a..35c23ff4e3 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java @@ -2,8 +2,8 @@ import java.time.Instant; -import io.cucumber.core.api.event.Event; -import io.cucumber.core.api.event.EventHandler; +import io.cucumber.core.event.Event; +import io.cucumber.core.event.EventHandler; import io.cucumber.core.eventbus.AbstractEventBus; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.runner.Options; diff --git a/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java b/core/src/main/java/io/cucumber/core/runtime/TimeServiceEventBus.java similarity index 91% rename from core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java rename to core/src/main/java/io/cucumber/core/runtime/TimeServiceEventBus.java index 8191280181..3d2789f98e 100644 --- a/core/src/main/java/io/cucumber/core/runner/TimeServiceEventBus.java +++ b/core/src/main/java/io/cucumber/core/runtime/TimeServiceEventBus.java @@ -1,4 +1,4 @@ -package io.cucumber.core.runner; +package io.cucumber.core.runtime; import java.time.Clock; import java.time.Instant; diff --git a/core/src/main/resources/io/cucumber/core/plugin/timeline/vis.min.js b/core/src/main/resources/io/cucumber/core/plugin/timeline/vis.min.js index 1136c8a151..b8c6d0243e 100644 --- a/core/src/main/resources/io/cucumber/core/plugin/timeline/vis.min.js +++ b/core/src/main/resources/io/cucumber/core/plugin/timeline/vis.min.js @@ -24,7 +24,7 @@ */ "use strict";!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(o){if(i[o])return i[o].exports;var n=i[o]={i:o,l:!1,exports:{}};return t[o].call(n.exports,n,n.exports,e),n.l=!0,n.exports}var i={};return e.m=t,e.c=i,e.d=function(t,i,o){e.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(i,"a",i),i},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=123)}([function(t,e,i){e.__esModule=!0,e.default=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}},function(t,e,i){e.__esModule=!0;var o=i(169),n=function(t){return t&&t.__esModule?t:{default:t}}(o);e.default=function(){function t(t,e){for(var i=0;i2&&void 0!==arguments[2]&&arguments[2];for(var s in t)void 0!==i[s]&&(null===i[s]||"object"!==(0,c.default)(i[s])?n(t,i,s,o):"object"===(0,c.default)(t[s])&&e.fillIfDefined(t[s],i[s],o))},e.extend=function(t,e){for(var i=1;i3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(o))throw new TypeError("Arrays are not supported by deepExtend");for(var r=0;r3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(o))throw new TypeError("Arrays are not supported by deepExtend");for(var r in o)if(o.hasOwnProperty(r)&&-1===t.indexOf(r))if(o[r]&&o[r].constructor===Object)void 0===i[r]&&(i[r]={}),i[r].constructor===Object?e.deepExtend(i[r],o[r]):n(i,o,r,s);else if(Array.isArray(o[r])){i[r]=[];for(var a=0;a2&&void 0!==arguments[2]&&arguments[2],s=arguments.length>3&&void 0!==arguments[3]&&arguments[3];for(var r in i)if(i.hasOwnProperty(r)||!0===o)if(i[r]&&i[r].constructor===Object)void 0===t[r]&&(t[r]={}),t[r].constructor===Object?e.deepExtend(t[r],i[r],o):n(t,i,r,s);else if(Array.isArray(i[r])){t[r]=[];for(var a=0;a=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,o)):t.attachEvent("on"+e,i)},e.removeEventListener=function(t,e,i,o){t.removeEventListener?(void 0===o&&(o=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,o)):t.detachEvent("on"+e,i)},e.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},e.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},e.hasParent=function(t,e){for(var i=t;i;){if(i===e)return!0;i=i.parentNode}return!1},e.option={},e.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},e.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},e.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},e.option.asSize=function(t,i){return"function"==typeof t&&(t=t()),e.isString(t)?t:e.isNumber(t)?t+"px":i||null},e.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},e.hexToRGB=function(t){var e=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;t=t.replace(e,function(t,e,i,o){return e+e+i+i+o+o});var i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return i?{r:parseInt(i[1],16),g:parseInt(i[2],16),b:parseInt(i[3],16)}:null},e.overrideOpacity=function(t,i){var o;return-1!=t.indexOf("rgba")?t:-1!=t.indexOf("rgb")?(o=t.substr(t.indexOf("(")+1).replace(")","").split(","),"rgba("+o[0]+","+o[1]+","+o[2]+","+i+")"):(o=e.hexToRGB(t),null==o?t:"rgba("+o.r+","+o.g+","+o.b+","+i+")")},e.RGBToHex=function(t,e,i){return"#"+((1<<24)+(t<<16)+(e<<8)+i).toString(16).slice(1)},e.parseColor=function(t){var i;if(!0===e.isString(t)){if(!0===e.isValidRGB(t)){var o=t.substr(4).substr(0,t.length-5).split(",").map(function(t){return parseInt(t)});t=e.RGBToHex(o[0],o[1],o[2])}if(!0===e.isValidHex(t)){var n=e.hexToHSV(t),s={h:n.h,s:.8*n.s,v:Math.min(1,1.02*n.v)},r={h:n.h,s:Math.min(1,1.25*n.s),v:.8*n.v},a=e.HSVToHex(r.h,r.s,r.v),h=e.HSVToHex(s.h,s.s,s.v);i={background:t,border:a,highlight:{background:h,border:a},hover:{background:h,border:a}}}else i={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else i={},i.background=t.background||void 0,i.border=t.border||void 0,e.isString(t.highlight)?i.highlight={border:t.highlight,background:t.highlight}:(i.highlight={},i.highlight.background=t.highlight&&t.highlight.background||void 0,i.highlight.border=t.highlight&&t.highlight.border||void 0),e.isString(t.hover)?i.hover={border:t.hover,background:t.hover}:(i.hover={},i.hover.background=t.hover&&t.hover.background||void 0,i.hover.border=t.hover&&t.hover.border||void 0);return i},e.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var o=Math.min(t,Math.min(e,i)),n=Math.max(t,Math.max(e,i));if(o==n)return{h:0,s:0,v:o};var s=t==o?e-i:i==o?t-e:i-t;return{h:60*((t==o?3:i==o?1:5)-s/(n-o))/360,s:(n-o)/n,v:n}};var v={split:function(t){var e={};return t.split(";").forEach(function(t){if(""!=t.trim()){var i=t.split(":"),o=i[0].trim(),n=i[1].trim();e[o]=n}}),e},join:function(t){return(0,l.default)(t).map(function(e){return e+": "+t[e]}).join("; ")}};e.addCssText=function(t,i){var o=v.split(t.style.cssText),n=v.split(i),s=e.extend(o,n);t.style.cssText=v.join(s)},e.removeCssText=function(t,e){var i=v.split(t.style.cssText),o=v.split(e);for(var n in o)o.hasOwnProperty(n)&&delete i[n];t.style.cssText=v.join(i)},e.HSVToRGB=function(t,e,i){var o,n,s,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:o=i,n=l,s=h;break;case 1:o=d,n=i,s=h;break;case 2:o=h,n=i,s=l;break;case 3:o=h,n=d,s=i;break;case 4:o=l,n=h,s=i;break;case 5:o=i,n=h,s=d}return{r:Math.floor(255*o),g:Math.floor(255*n),b:Math.floor(255*s)}},e.HSVToHex=function(t,i,o){var n=e.HSVToRGB(t,i,o);return e.RGBToHex(n.r,n.g,n.b)},e.hexToHSV=function(t){var i=e.hexToRGB(t);return e.RGBToHSV(i.r,i.g,i.b)},e.isValidHex=function(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)},e.isValidRGB=function(t){return t=t.replace(" ",""),/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t)},e.isValidRGBA=function(t){return t=t.replace(" ",""),/rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(.{1,3})\)/i.test(t)},e.selectiveBridgeObject=function(t,i){if(null!==i&&"object"===(void 0===i?"undefined":(0,c.default)(i))){for(var o=(0,h.default)(i),n=0;n0&&e(o,t[n-1])<0;n--)t[n]=t[n-1];t[n]=o}return t},e.mergeOptions=function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=function(t){return null!==t&&void 0!==t},s=function(t){return null!==t&&"object"===(void 0===t?"undefined":(0,c.default)(t))};if(!s(t))throw new Error("Parameter mergeTarget must be an object");if(!s(e))throw new Error("Parameter options must be an object");if(!n(i))throw new Error("Parameter option must have a value");if(!s(o))throw new Error("Parameter globalOptions must be an object");var r=e[i],a=s(o)&&!function(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}(o),d=a?o[i]:void 0,l=d?d.enabled:void 0;if(void 0!==r){if("boolean"==typeof r)return s(t[i])||(t[i]={}),void(t[i].enabled=r);if(null===r&&!s(t[i])){if(!n(d))return;t[i]=(0,h.default)(d)}if(s(r)){var u=!0;void 0!==r.enabled?u=r.enabled:void 0!==l&&(u=d.enabled),function(t,e,i){s(t[i])||(t[i]={});var o=e[i],n=t[i];for(var r in o)o.hasOwnProperty(r)&&(n[r]=o[r])}(t,e,i),t[i].enabled=u}}},e.binarySearchCustom=function(t,e,i,o){for(var n=0,s=0,r=t.length-1;s<=r&&n<1e4;){var a=Math.floor((s+r)/2),h=t[a],d=void 0===o?h[i]:h[i][o],l=e(d);if(0==l)return a;-1==l?s=a+1:r=a-1,n++}return-1},e.binarySearchValue=function(t,e,i,o,n){var s,r,a,h,d=0,l=0,u=t.length-1;for(n=void 0!=n?n:function(t,e){return t==e?0:t0)return"before"==o?Math.max(0,h-1):h;if(n(r,e)<0&&n(a,e)>0)return"before"==o?h:Math.min(t.length-1,h+1);n(r,e)<0?l=h+1:u=h-1,d++}return-1},e.easingFunctions={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return t*(2-t)},easeInOutQuad:function(t){return t<.5?2*t*t:(4-2*t)*t-1},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return--t*t*t+1},easeInOutCubic:function(t){return t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return 1- --t*t*t*t},easeInOutQuart:function(t){return t<.5?8*t*t*t*t:1-8*--t*t*t*t},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return 1+--t*t*t*t*t},easeInOutQuint:function(t){return t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t}},e.getScrollBarWidth=function(){var t=document.createElement("p");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.visibility="hidden",e.style.width="200px",e.style.height="150px",e.style.overflow="hidden",e.appendChild(t),document.body.appendChild(e);var i=t.offsetWidth;e.style.overflow="scroll";var o=t.offsetWidth;return i==o&&(o=e.clientWidth),document.body.removeChild(e),i-o},e.topMost=function(t,e){var i=void 0;Array.isArray(e)||(e=[e]);var o=!0,n=!1,s=void 0;try{for(var a,h=(0,r.default)(t);!(o=(a=h.next()).done);o=!0){var d=a.value;if(d){i=d[e[0]];for(var l=1;ln?1:or)&&(s=h,r=d)}return s},n.prototype.min=function(t){var e,i,o=this._data,n=(0,l.default)(o),s=null,r=null;for(e=0,i=n.length;e0?(o=e[t].redundant[0],e[t].redundant.shift()):(o=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(o)):(o=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(o)),e[t].used.push(o),o},e.getDOMElement=function(t,e,i,o){var n;return e.hasOwnProperty(t)?e[t].redundant.length>0?(n=e[t].redundant[0],e[t].redundant.shift()):(n=document.createElement(t),void 0!==o?i.insertBefore(n,o):i.appendChild(n)):(n=document.createElement(t),e[t]={used:[],redundant:[]},void 0!==o?i.insertBefore(n,o):i.appendChild(n)),e[t].used.push(n),n},e.drawPoint=function(t,i,o,n,s,r){var a;if("circle"==o.style?(a=e.getSVGElement("circle",n,s),a.setAttributeNS(null,"cx",t),a.setAttributeNS(null,"cy",i),a.setAttributeNS(null,"r",.5*o.size)):(a=e.getSVGElement("rect",n,s),a.setAttributeNS(null,"x",t-.5*o.size),a.setAttributeNS(null,"y",i-.5*o.size),a.setAttributeNS(null,"width",o.size),a.setAttributeNS(null,"height",o.size)),void 0!==o.styles&&a.setAttributeNS(null,"style",o.styles),a.setAttributeNS(null,"class",o.className+" vis-point"),r){var h=e.getSVGElement("text",n,s);r.xOffset&&(t+=r.xOffset),r.yOffset&&(i+=r.yOffset),r.content&&(h.textContent=r.content),r.className&&h.setAttributeNS(null,"class",r.className+" vis-label"),h.setAttributeNS(null,"x",t),h.setAttributeNS(null,"y",i)}return a},e.drawBar=function(t,i,o,n,s,r,a,h){if(0!=n){n<0&&(n*=-1,i-=n);var d=e.getSVGElement("rect",r,a);d.setAttributeNS(null,"x",t-.5*o),d.setAttributeNS(null,"y",i),d.setAttributeNS(null,"width",o),d.setAttributeNS(null,"height",n),d.setAttributeNS(null,"class",s),h&&d.setAttributeNS(null,"style",h)}}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0}),e.printStyle=void 0;var n=i(19),s=o(n),r=i(6),a=o(r),h=i(8),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=!1,v=void 0,g="background: #FFeeee; color: #dd0000",y=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"validate",value:function(e,i,o){m=!1,v=i;var n=i;return void 0!==o&&(n=i[o]),t.parse(e,n,[]),m}},{key:"parse",value:function(e,i,o){for(var n in e)e.hasOwnProperty(n)&&t.check(n,e,i,o)}},{key:"check",value:function(e,i,o,n){if(void 0===o[e]&&void 0===o.__any__)return void t.getSuggestion(e,o,n);var s=e,r=!0;void 0===o[e]&&void 0!==o.__any__&&(s="__any__",r="object"===t.getType(i[e]));var a=o[s];r&&void 0!==a.__type__&&(a=a.__type__),t.checkFields(e,i,o,s,a,n)}},{key:"checkFields",value:function(e,i,o,n,s,r){var a=function(i){console.log("%c"+i+t.printLocation(r,e),g)},h=t.getType(i[e]),l=s[h];void 0!==l?"array"===t.getType(l)&&-1===l.indexOf(i[e])?(a('Invalid option detected in "'+e+'". Allowed values are:'+t.print(l)+' not "'+i[e]+'". '),m=!0):"object"===h&&"__any__"!==n&&(r=f.copyAndExtendArray(r,e),t.parse(i[e],o[n],r)):void 0===s.any&&(a('Invalid type received for "'+e+'". Expected: '+t.print((0,d.default)(s))+". Received ["+h+'] "'+i[e]+'"'),m=!0)}},{key:"getType",value:function(t){var e=void 0===t?"undefined":(0,a.default)(t);return"object"===e?null===t?"null":t instanceof Boolean?"boolean":t instanceof Number?"number":t instanceof String?"string":Array.isArray(t)?"array":t instanceof Date?"date":void 0!==t.nodeType?"dom":!0===t._isAMomentObject?"moment":"object":"number"===e?"number":"boolean"===e?"boolean":"string"===e?"string":void 0===e?"undefined":e}},{key:"getSuggestion",value:function(e,i,o){var n=t.findInOptions(e,i,o,!1),s=t.findInOptions(e,v,[],!0),r=void 0 ;r=void 0!==n.indexMatch?" in "+t.printLocation(n.path,e,"")+'Perhaps it was incomplete? Did you mean: "'+n.indexMatch+'"?\n\n':s.distance<=4&&n.distance>s.distance?" in "+t.printLocation(n.path,e,"")+"Perhaps it was misplaced? Matching option found at: "+t.printLocation(s.path,s.closestMatch,""):n.distance<=8?'. Did you mean "'+n.closestMatch+'"?'+t.printLocation(n.path,e):". Did you mean one of these: "+t.print((0,d.default)(i))+t.printLocation(o,e),console.log('%cUnknown option detected: "'+e+'"'+r,g),m=!0}},{key:"findInOptions",value:function(e,i,o){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=1e9,r="",a=[],h=e.toLowerCase(),d=void 0;for(var l in i){var u=void 0;if(void 0!==i[l].__type__&&!0===n){var c=t.findInOptions(e,i[l],f.copyAndExtendArray(o,l));s>c.distance&&(r=c.closestMatch,a=c.path,s=c.distance,d=c.indexMatch)}else-1!==l.toLowerCase().indexOf(h)&&(d=l),u=t.levenshteinDistance(e,l),s>u&&(r=l,a=f.copyArray(o),s=u)}return{closestMatch:r,path:a,distance:s,indexMatch:d}}},{key:"printLocation",value:function(t,e){for(var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"Problem value found at: \n",o="\n\n"+i+"options = {\n",n=0;n0&&(this.enableBorderDashes(t,e),t.stroke(),this.disableBorderDashes(t,e)),t.restore()}},{key:"performFill",value:function(t,e){this.enableShadow(t,e),t.fill(),this.disableShadow(t,e),this.performStroke(t,e)}},{key:"_addBoundingBoxMargin",value:function(t){this.boundingBox.left-=t,this.boundingBox.top-=t,this.boundingBox.bottom+=t,this.boundingBox.right+=t}},{key:"_updateBoundingBox",value:function(t,e,i,o,n){void 0!==i&&this.resize(i,o,n),this.left=t-this.width/2,this.top=e-this.height/2,this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width}},{key:"updateBoundingBox",value:function(t,e,i,o,n){this._updateBoundingBox(t,e,i,o,n)}},{key:"getDimensionsFromLabel",value:function(t,e,i){this.textSize=this.labelModule.getTextSize(t,e,i);var o=this.textSize.width,n=this.textSize.height;return 0===o&&(o=14,n=14),{width:o,height:n}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{size:this.options.size};if(this.needsRefresh(e,i)){this.labelModule.getTextSize(t,e,i);var n=2*o.size;this.width=n,this.height=n,this.radius=.5*this.width}}},{key:"_drawShape",value:function(t,e,i,o,n,s,r,a){if(this.resize(t,s,r,a),this.left=o-this.width/2,this.top=n-this.height/2,this.initContextForDraw(t,a),t[e](o,n,a.size),this.performFill(t,a),void 0!==this.options.label){this.labelModule.calculateLabelSize(t,s,r,o,n,"hanging");var h=n+.5*this.height+.5*this.labelModule.size.height;this.labelModule.draw(t,o,h,s,r,"hanging")}this.updateBoundingBox(o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height))}}]),e}(m.default);e.default=v},function(t,e,i){var o=i(78),n=i(51);t.exports=function(t){return o(n(t))}},function(t,e,i){var o=i(20),n=i(39);t.exports=i(21)?function(t,e,i){return o.f(t,e,n(1,i))}:function(t,e,i){return t[e]=i,t}},function(t,e,i){var o=i(32);t.exports=function(t){if(!o(t))throw TypeError(t+" is not an object!");return t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,i){t.exports={default:i(138),__esModule:!0}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}e.__esModule=!0;var n=i(188),s=o(n),r=i(77),a=o(r);e.default=function(){function t(t,e){var i=[],o=!0,n=!1,s=void 0;try{for(var r,h=(0,a.default)(t);!(o=(r=h.next()).done)&&(i.push(r.value),!e||i.length!==e);o=!0);}catch(t){n=!0,s=t}finally{try{!o&&h.return&&h.return()}finally{if(n)throw s}}return i}return function(e,i){if(Array.isArray(e))return e;if((0,s.default)(Object(e)))return t(e,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()},function(t,e){t.exports={}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,i){var o=i(84),n=i(58);t.exports=Object.keys||function(t){return o(t,n)}},function(t,e,i){function o(t,e,i){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0,this.z=void 0!==i?i:0}o.subtract=function(t,e){var i=new o;return i.x=t.x-e.x,i.y=t.y-e.y,i.z=t.z-e.z,i},o.add=function(t,e){var i=new o;return i.x=t.x+e.x,i.y=t.y+e.y,i.z=t.z+e.z,i},o.avg=function(t,e){return new o((t.x+e.x)/2,(t.y+e.y)/2,(t.z+e.z)/2)},o.crossProduct=function(t,e){var i=new o;return i.x=t.y*e.z-t.z*e.y,i.y=t.z*e.x-t.x*e.z,i.z=t.x*e.y-t.y*e.x,i},o.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},t.exports=o},function(t,e,i){var o,n,s;!function(i,r){n=[],o=r,void 0!==(s="function"==typeof o?o.apply(e,n):o)&&(t.exports=s)}(0,function(){function t(t){var e,i=t&&t.preventDefault||!1,o=t&&t.container||window,n={},s={keydown:{},keyup:{}},r={};for(e=97;e<=122;e++)r[String.fromCharCode(e)]={code:e-97+65,shift:!1};for(e=65;e<=90;e++)r[String.fromCharCode(e)]={code:e,shift:!0};for(e=0;e<=9;e++)r[""+e]={code:48+e,shift:!1};for(e=1;e<=12;e++)r["F"+e]={code:111+e,shift:!1};for(e=0;e<=9;e++)r["num"+e]={code:96+e,shift:!1};r["num*"]={code:106,shift:!1},r["num+"]={code:107,shift:!1},r["num-"]={code:109,shift:!1},r["num/"]={code:111,shift:!1},r["num."]={code:110,shift:!1},r.left={code:37,shift:!1},r.up={code:38,shift:!1},r.right={code:39,shift:!1},r.down={code:40,shift:!1},r.space={code:32,shift:!1},r.enter={code:13,shift:!1},r.shift={code:16,shift:void 0},r.esc={code:27,shift:!1},r.backspace={code:8,shift:!1},r.tab={code:9,shift:!1},r.ctrl={code:17,shift:!1},r.alt={code:18,shift:!1},r.delete={code:46,shift:!1},r.pageup={code:33,shift:!1},r.pagedown={code:34,shift:!1},r["="]={code:187,shift:!1},r["-"]={code:189,shift:!1},r["]"]={code:221,shift:!1},r["["]={code:219,shift:!1};var a=function(t){d(t,"keydown")},h=function(t){d(t,"keyup")},d=function(t,e){if(void 0!==s[e][t.keyCode]){for(var o=s[e][t.keyCode],n=0;n=4*a){var c=0,p=s.clone();switch(o[h].repeat){case"daily":d.day()!=l.day()&&(c=1),d.dayOfYear(n.dayOfYear()),d.year(n.year()),d.subtract(7,"days"),l.dayOfYear(n.dayOfYear()),l.year(n.year()),l.subtract(7-c,"days"),p.add(1,"weeks");break;case"weekly":var f=l.diff(d,"days"),m=d.day();d.date(n.date()),d.month(n.month()),d.year(n.year()),l=d.clone(),d.day(m),l.day(m),l.add(f,"days"),d.subtract(1,"weeks"),l.subtract(1,"weeks"),p.add(1,"weeks");break;case"monthly":d.month()!=l.month()&&(c=1),d.month(n.month()),d.year(n.year()),d.subtract(1,"months"),l.month(n.month()),l.year(n.year()),l.subtract(1,"months"),l.add(c,"months"),p.add(1,"months");break;case"yearly":d.year()!=l.year()&&(c=1),d.year(n.year()),d.subtract(1,"years"),l.year(n.year()),l.subtract(1,"years"),l.add(c,"years"),p.add(1,"years");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",o[h].repeat)}for(;d=e[o].start&&e[n].end<=e[o].end?e[n].remove=!0:e[n].start>=e[o].start&&e[n].start<=e[o].end?(e[o].end=e[n].end,e[n].remove=!0):e[n].end>=e[o].start&&e[n].end<=e[o].end&&(e[o].start=e[n].start,e[n].remove=!0));for(o=0;o=r&&nt.range.end){var h={start:t.range.start,end:i};return i=e.correctTimeForHidden(t.options.moment,t.body.hiddenDates,h,i),n=t.range.conversion(o,r),(i.valueOf()-n.offset)*n.scale}return i=e.correctTimeForHidden(t.options.moment,t.body.hiddenDates,t.range,i),n=t.range.conversion(o,r),(i.valueOf()-n.offset)*n.scale},e.toTime=function(t,i,o){if(0==t.body.hiddenDates.length){var n=t.range.conversion(o);return new Date(i/n.scale+n.offset)}var s=e.getHiddenDurationBetween(t.body.hiddenDates,t.range.start,t.range.end),r=t.range.end-t.range.start-s,a=r*i/o,h=e.getAccumulatedHiddenDuration(t.body.hiddenDates,t.range,a);return new Date(h+a+t.range.start)},e.getHiddenDurationBetween=function(t,e,i){for(var o=0,n=0;n=e&&r=e&&r<=i&&(o+=r-s)}return o},e.correctTimeForHidden=function(t,i,o,n){return n=t(n).toDate().valueOf(),n-=e.getHiddenDurationBefore(t,i,o,n)},e.getHiddenDurationBefore=function(t,e,i,o){var n=0;o=t(o).toDate().valueOf();for(var s=0;s=i.start&&a=a&&(n+=a-r)}return n},e.getAccumulatedHiddenDuration=function(t,e,i){for(var o=0,n=0,s=e.start,r=0;r=e.start&&h=i)break;o+=h-a}}return o},e.snapAwayFromHidden=function(t,i,o,n){var s=e.isHidden(i,t);return 1==s.hidden?o<0?1==n?s.startDate-(s.endDate-i)-1:s.startDate-1:1==n?s.endDate+(i-s.startDate)+1:s.endDate+1:i},e.isHidden=function(t,e){for(var i=0;i=o&&t0){var e=[];if(Array.isArray(this.options.dataAttributes))e=this.options.dataAttributes;else{if("all"!=this.options.dataAttributes)return;e=(0,h.default)(this.data)}for(var i=0;ithis.max&&this.flush(),clearTimeout(this._timeout),this.queue.length>0&&"number"==typeof this.delay){var t=this;this._timeout=setTimeout(function(){t.flush()},this.delay)}},o.prototype.flush=function(){for(;this._queue.length>0;){var t=this._queue.shift();t.fn.apply(t.context||t.fn,t.args||[])}},t.exports=o},function(t,e){function i(t){if(t)return o(t)}function o(t){for(var e in i.prototype)t[e]=i.prototype[e];return t}t.exports=i,i.prototype.on=i.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},i.prototype.once=function(t,e){function i(){o.off(t,i),e.apply(this,arguments)}var o=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},i.prototype.off=i.prototype.removeListener=i.prototype.removeAllListeners=i.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var o,n=0;n=.4*v}if(this.options.showMinorLabels&&m){var k=this._repaintMinorText(c,y,t,b);k.style.width=_+"px"}f&&this.options.showMajorLabels?(c>0&&(void 0==w&&(w=c),k=this._repaintMajorText(c,s.getLabelMajor(),t,b)),g=this._repaintMajorLine(c,_,t,b)):m?g=this._repaintMinorLine(c,_,t,b):g&&(g.style.width=parseInt(g.style.width)+_+"px")}if(1e3!==x||u||(console.warn("Something is wrong with the Timeline scale. Limited drawing of grid lines to 1000 lines."),u=!0),this.options.showMajorLabels){var S=this.body.util.toTime(0),D=s.getLabelMajor(S),M=D.length*(this.props.majorCharWidth||10)+10;(void 0==w||Mt.left&&this.shape.topt.top}},{key:"isBoundingBoxOverlappingWith",value:function(t){return this.shape.boundingBox.leftt.left&&this.shape.boundingBox.topt.top}}],[{key:"updateGroupOptions",value:function(t,e,i){if(void 0!==i){var o=t.group;if(void 0!==e&&void 0!==e.group&&o!==e.group)throw new Error("updateGroupOptions: group values in options don't match.");if("number"==typeof o||"string"==typeof o&&""!=o){var n=i.get(o);h.selectiveNotDeepExtend(["font"],t,n),t.color=h.parseColor(t.color)}}}},{key:"parseOptions",value:function(e,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},s=arguments[4],r=["color","fixed","shadow"];if(h.selectiveNotDeepExtend(r,e,i,o),t.checkMass(i),h.mergeOptions(e,i,"shadow",n),void 0!==i.color&&null!==i.color){var a=h.parseColor(i.color);h.fillIfDefined(e.color,a)}else!0===o&&null===i.color&&(e.color=h.bridgeObject(n.color));void 0!==i.fixed&&null!==i.fixed&&("boolean"==typeof i.fixed?(e.fixed.x=i.fixed,e.fixed.y=i.fixed):(void 0!==i.fixed.x&&"boolean"==typeof i.fixed.x&&(e.fixed.x=i.fixed.x),void 0!==i.fixed.y&&"boolean"==typeof i.fixed.y&&(e.fixed.y=i.fixed.y))),!0===o&&null===i.font&&(e.font=h.bridgeObject(n.font)),t.updateGroupOptions(e,i,s),void 0!==i.scaling&&h.mergeOptions(e.scaling,i.scaling,"label",n.scaling)}},{key:"checkMass",value:function(t,e){if(void 0!==t.mass&&t.mass<=0){var i="";void 0!==e&&(i=" in node id: "+e),console.log("%cNegative or zero mass disallowed"+i+", setting mass to 1.",C),t.mass=1}}}]),t}();e.default=O},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(6),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(2),u=function(){function t(){(0,a.default)(this,t)}return(0,d.default)(t,null,[{key:"choosify",value:function(t,e){var i=["node","edge","label"],o=!0,n=l.topMost(e,"chosen");if("boolean"==typeof n)o=n;else if("object"===(void 0===n?"undefined":(0,s.default)(n))){if(-1===i.indexOf(t))throw new Error("choosify: subOption '"+t+"' should be one of '"+i.join("', '")+"'");var r=l.topMost(e,["chosen",t]);"boolean"!=typeof r&&"function"!=typeof r||(o=r)}return o}},{key:"pointInRect",value:function(t,e,i){if(t.width<=0||t.height<=0)return!1;if(void 0!==i){var o={x:e.x-i.x,y:e.y-i.y};if(0!==i.angle){var n=-i.angle;e={x:Math.cos(n)*o.x-Math.sin(n)*o.y,y:Math.sin(n)*o.x+Math.cos(n)*o.y}}else e=o}var s=t.x+t.width,r=t.y+t.width;return t.lefte.x&&t.tope.y}},{key:"isValidLabel",value:function(t){return"string"==typeof t&&""!==t}}]),t}();e.default=u},function(t,e,i){i(125);for(var o=i(18),n=i(26),s=i(31),r=i(13)("toStringTag"),a="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),h=0;hdocument.F=Object<\/script>"),t.close(),h=t.F;o--;)delete h.prototype[s[o]];return h()};t.exports=Object.create||function(t,e){var i;return null!==t?(a.prototype=o(t),i=new a,a.prototype=null,i[r]=t):i=h(),void 0===e?i:n(i,e)}},function(t,e){var i=Math.ceil,o=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?o:i)(t)}},function(t,e,i){var o=i(57)("keys"),n=i(40);t.exports=function(t){return o[t]||(o[t]=n(t))}},function(t,e,i){var o=i(18),n=o["__core-js_shared__"]||(o["__core-js_shared__"]={});t.exports=function(t){return n[t]||(n[t]={})}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,i){var o=i(20).f,n=i(22),s=i(13)("toStringTag");t.exports=function(t,e,i){t&&!n(t=i?t:t.prototype,s)&&o(t,s,{configurable:!0,value:e})}},function(t,e,i){var o=i(135)(!0);i(79)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,i=this._i;return i>=e.length?{value:void 0,done:!0}:(t=o(e,i),this._i+=t.length,{value:t,done:!1})})},function(t,e,i){e.f=i(13)},function(t,e,i){var o=i(18),n=i(7),s=i(52),r=i(61),a=i(20).f;t.exports=function(t){var e=n.Symbol||(n.Symbol=s?{}:o.Symbol||{});"_"==t.charAt(0)||t in e||a(e,t,{value:r.f(t)})}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e){var i=p().hours(0).minutes(0).seconds(0).milliseconds(0),o=i.clone().add(-3,"days").valueOf(),n=i.clone().add(3,"days").valueOf();this.millisecondsPerPixelCache=void 0,void 0===e?(this.start=o,this.end=n):(this.start=e.start||o,this.end=e.end||n),this.rolling=!1,this.body=t,this.deltaDifference=0,this.scaleOffset=0,this.startToFront=!1,this.endToFront=!0,this.defaultOptions={rtl:!1,start:null,end:null,moment:p,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10,rollingMode:{follow:!1,offset:.5}},this.options=c.extend({},this.defaultOptions),this.props={touch:{}},this.animationTimer=null,this.body.emitter.on("panstart",this._onDragStart.bind(this)),this.body.emitter.on("panmove",this._onDrag.bind(this)),this.body.emitter.on("panend",this._onDragEnd.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.body.dom.rollingModeBtn.addEventListener("click",this.startRolling.bind(this)),this.setOptions(e)}function s(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}var r=i(8),a=o(r),h=i(19),d=o(h),l=i(6),u=o(l),c=i(2),p=i(9),f=i(16),m=i(36);n.prototype=new f,n.prototype.setOptions=function(t){if(t){var e=["animation","direction","min","max","zoomMin","zoomMax","moveable","zoomable","moment","activate","hiddenDates","zoomKey","rtl","showCurrentTime","rollingMode","horizontalScroll"];c.selectiveExtend(e,this.options,t),t.rollingMode&&t.rollingMode.follow&&this.startRolling(),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},n.prototype.startRolling=function(){function t(){e.stopRolling(),e.rolling=!0;var i=e.end-e.start,o=c.convert(new Date,"Date").valueOf(),n=o-i*e.options.rollingMode.offset,s=o+i*(1-e.options.rollingMode.offset),r={animation:!1};e.setRange(n,s,r),i=1/e.conversion(e.body.domProps.center.width).scale/10,i<30&&(i=30),i>1e3&&(i=1e3),e.body.dom.rollingModeBtn.style.visibility="hidden",e.currentTimeTimer=setTimeout(t,i)}var e=this;t()},n.prototype.stopRolling=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),this.rolling=!1,this.body.dom.rollingModeBtn.style.visibility="visible")},n.prototype.setRange=function(t,e,i,o,n){i||(i={}),!0!==i.byUser&&(i.byUser=!1);var s=this,r=void 0!=t?c.convert(t,"Date").valueOf():null,h=void 0!=e?c.convert(e,"Date").valueOf():null;if(this._cancelAnimation(),this.millisecondsPerPixelCache=void 0,i.animation){var l=this.start,p=this.end,f="object"===(0,u.default)(i.animation)&&"duration"in i.animation?i.animation.duration:500,v="object"===(0,u.default)(i.animation)&&"easingFunction"in i.animation?i.animation.easingFunction:"easeInOutQuad",g=c.easingFunctions[v];if(!g)throw new Error("Unknown easing function "+(0,d.default)(v)+". Choose from: "+(0,a.default)(c.easingFunctions).join(", "));var y=(new Date).valueOf(),b=!1;return function t(){if(!s.props.touch.dragging){var e=(new Date).valueOf(),a=e-y,d=g(a/f),u=a>f,c=u||null===r?r:l+(r-l)*d,v=u||null===h?h:p+(h-p)*d;_=s._applyRange(c,v),m.updateHiddenDates(s.options.moment,s.body,s.options.hiddenDates),b=b||_;var w={start:new Date(s.start),end:new Date(s.end),byUser:i.byUser,event:i.event};if(n&&n(d,_,u),_&&s.body.emitter.emit("rangechange",w),u){if(b&&(s.body.emitter.emit("rangechanged",w),o))return o()}else s.animationTimer=setTimeout(t,20)}}()}var _=this._applyRange(r,h);if(m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),_){var w={start:new Date(this.start),end:new Date(this.end),byUser:i.byUser,event:i.event};if(this.body.emitter.emit("rangechange",w),clearTimeout(s.timeoutID),s.timeoutID=setTimeout(function(){s.body.emitter.emit("rangechanged",w)},200),o)return o()}},n.prototype.getMillisecondsPerPixel=function(){return void 0===this.millisecondsPerPixelCache&&(this.millisecondsPerPixelCache=(this.end-this.start)/this.body.dom.center.clientWidth),this.millisecondsPerPixelCache},n.prototype._cancelAnimation=function(){this.animationTimer&&(clearTimeout(this.animationTimer),this.animationTimer=null)},n.prototype._applyRange=function(t,e){var i,o=null!=t?c.convert(t,"Date").valueOf():this.start,n=null!=e?c.convert(e,"Date").valueOf():this.end,s=null!=this.options.max?c.convert(this.options.max,"Date").valueOf():null,r=null!=this.options.min?c.convert(this.options.min,"Date").valueOf():null;if(isNaN(o)||null===o)throw new Error('Invalid start "'+t+'"');if(isNaN(n)||null===n)throw new Error('Invalid end "'+e+'"');if(ns&&(n=s)),null!==s&&n>s&&(i=n-s,o-=i,n-=i,null!=r&&o=this.start-.5&&n<=this.end?(o=this.start,n=this.end):(i=a-(n-o),o-=i/2,n+=i/2)}}if(null!==this.options.zoomMax){var h=parseFloat(this.options.zoomMax);h<0&&(h=0),n-o>h&&(this.end-this.start===h&&othis.end?(o=this.start,n=this.end):(i=n-o-h,o+=i/2,n-=i/2))}var d=this.start!=o||this.end!=n;return o>=this.start&&o<=this.end||n>=this.start&&n<=this.end||this.start>=o&&this.start<=n||this.end>=o&&this.end<=n||this.body.emitter.emit("checkRangedItems"),this.start=o,this.end=n,d},n.prototype.getRange=function(){return{start:this.start,end:this.end}},n.prototype.conversion=function(t,e){return n.conversion(this.start,this.end,t,e)},n.conversion=function(t,e,i,o){return void 0===o&&(o=0),0!=i&&e-t!=0?{offset:t,scale:i/(e-t-o)}:{offset:0,scale:1}},n.prototype._onDragStart=function(t){this.deltaDifference=0,this.previousDelta=0,this.options.moveable&&this._isInsideRange(t)&&this.props.touch.allowDragging&&(this.stopRolling(),this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.dragging=!0,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},n.prototype._onDrag=function(t){if(t&&this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging){var e=this.options.direction;s(e);var i="horizontal"==e?t.deltaX:t.deltaY;i-=this.deltaDifference;var o=this.props.touch.end-this.props.touch.start;o-=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);var n,r="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height;n=this.options.rtl?i/r*o:-i/r*o;var a=this.props.touch.start+n,h=this.props.touch.end+n,d=m.snapAwayFromHidden(this.body.hiddenDates,a,this.previousDelta-i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,this.previousDelta-i,!0);if(d!=a||l!=h)return this.deltaDifference+=i,this.props.touch.start=d,this.props.touch.end=l,void this._onDrag(t);this.previousDelta=i,this._applyRange(a,h);var u=new Date(this.start),c=new Date(this.end);this.body.emitter.emit("rangechange",{start:u,end:c,byUser:!0,event:t}),this.body.emitter.emit("panmove")}},n.prototype._onDragEnd=function(t){this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.dragging=!1,this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end),byUser:!0,event:t}))},n.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),!(this.options.zoomKey&&!t[this.options.zoomKey]&&this.options.zoomable||!this.options.zoomable&&this.options.moveable)&&this.options.zoomable&&this.options.moveable&&this._isInsideRange(t)&&e){var i;i=e<0?1-e/5:1/(1+e/5);var o;if(this.rolling)o=this.start+(this.end-this.start)*this.options.rollingMode.offset;else{var n=this.getPointer({x:t.clientX,y:t.clientY},this.body.dom.center);o=this._pointerToDate(n)}this.zoom(i,o,e,t),t.preventDefault()}},n.prototype._onTouch=function(t){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null,this.scaleOffset=0,this.deltaDifference=0,c.preventDefault(t)},n.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable){c.preventDefault(t),this.props.touch.allowDragging=!1,this.props.touch.center||(this.props.touch.center=this.getPointer(t.center,this.body.dom.center)),this.stopRolling();var e=1/(t.scale+this.scaleOffset),i=this._pointerToDate(this.props.touch.center),o=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),n=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,i),s=o-n,r=i-n+(this.props.touch.start-(i-n))*e,a=i+s+(this.props.touch.end-(i+s))*e;this.startToFront=1-e<=0,this.endToFront=e-1<=0;var h=m.snapAwayFromHidden(this.body.hiddenDates,r,1-e,!0),d=m.snapAwayFromHidden(this.body.hiddenDates,a,e-1,!0);h==r&&d==a||(this.props.touch.start=h,this.props.touch.end=d,this.scaleOffset=1-t.scale,r=h,a=d);var l={animation:!1,byUser:!0,event:t};this.setRange(r,a,l),this.startToFront=!1,this.endToFront=!0}},n.prototype._isInsideRange=function(t){var e,i=t.center?t.center.x:t.clientX;e=this.options.rtl?i-c.getAbsoluteLeft(this.body.dom.centerContainer):c.getAbsoluteRight(this.body.dom.centerContainer)-i;var o=this.body.util.toTime(e);return o>=this.start&&o<=this.end},n.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(s(i),"horizontal"==i)return this.body.util.toTime(t.x).valueOf();var o=this.body.domProps.center.height;return e=this.conversion(o),t.y/e.scale+e.offset},n.prototype.getPointer=function(t,e){return this.options.rtl?{x:c.getAbsoluteRight(e)-t.x,y:t.y-c.getAbsoluteTop(e)}:{x:t.x-c.getAbsoluteLeft(e),y:t.y-c.getAbsoluteTop(e)}},n.prototype.zoom=function(t,e,i,o){null==e&&(e=(this.start+this.end)/2);var n=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),s=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,e),r=n-s,a=e-s+(this.start-(e-s))*t,h=e+r+(this.end-(e+r))*t;this.startToFront=!(i>0),this.endToFront=!(-i>0) +;var s=this.options.showMinorLabels&&"none"!==this.options.orientation.axis,r=this.options.showMajorLabels&&"none"!==this.options.orientation.axis;t.minorLabelHeight=s?t.minorCharHeight:0,t.majorLabelHeight=r?t.majorCharHeight:0,t.height=t.minorLabelHeight+t.majorLabelHeight,t.width=e.offsetWidth,t.minorLineHeight=this.body.domProps.root.height-t.majorLabelHeight-("top"==this.options.orientation.axis?this.body.domProps.bottom.height:this.body.domProps.top.height),t.minorLineWidth=1,t.majorLineHeight=t.minorLineHeight+t.majorLabelHeight,t.majorLineWidth=1;var a=e.nextSibling,h=i.nextSibling;return e.parentNode&&e.parentNode.removeChild(e),i.parentNode&&i.parentNode.removeChild(i),e.style.height=this.props.height+"px",this._repaintLabels(),a?o.insertBefore(e,a):o.appendChild(e),h?this.body.dom.backgroundVertical.insertBefore(i,h):this.body.dom.backgroundVertical.appendChild(i),this._isResized()||n},o.prototype._repaintLabels=function(){var t=this.options.orientation.axis,e=r.convert(this.body.range.start,"Number"),i=r.convert(this.body.range.end,"Number"),o=this.body.util.toTime((this.props.minorCharWidth||10)*this.options.maxMinorChars).valueOf(),n=o-d.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this.body.range,o);n-=this.body.util.toTime(0).valueOf();var s=new h(new Date(e),new Date(i),n,this.body.hiddenDates,this.options);s.setMoment(this.options.moment),this.options.format&&s.setFormat(this.options.format),this.options.timeAxis&&s.setScale(this.options.timeAxis),this.step=s;var a=this.dom;a.redundant.lines=a.lines,a.redundant.majorTexts=a.majorTexts,a.redundant.minorTexts=a.minorTexts,a.lines=[],a.majorTexts=[],a.minorTexts=[];var l,c,p,f,m,v,g,y,b,_=0,w=void 0,x=0;for(s.start(),l=s.getCurrent(),p=this.body.util.toScreen(l);s.hasNext()&&x<1e3;){switch(x++,f=s.isMajor(),b=s.getClassName(),y=s.getLabelMinor(),l,c=p,s.next(),l=s.getCurrent(),s.isMajor(),p=this.body.util.toScreen(l),v=_,_=p-c,s.scale){case"week":m=!0;break;default:m=_>=.4*v}if(this.options.showMinorLabels&&m){var k=this._repaintMinorText(c,y,t,b);k.style.width=_+"px"}f&&this.options.showMajorLabels?(c>0&&(void 0==w&&(w=c),k=this._repaintMajorText(c,s.getLabelMajor(),t,b)),g=this._repaintMajorLine(c,_,t,b)):m?g=this._repaintMinorLine(c,_,t,b):g&&(g.style.width=parseInt(g.style.width)+_+"px")}if(1e3!==x||u||(console.warn("Something is wrong with the Timeline scale. Limited drawing of grid lines to 1000 lines."),u=!0),this.options.showMajorLabels){var S=this.body.util.toTime(0),D=s.getLabelMajor(S),M=D.length*(this.props.majorCharWidth||10)+10;(void 0==w||Mt.left&&this.shape.topt.top}},{key:"isBoundingBoxOverlappingWith",value:function(t){return this.shape.boundingBox.leftt.left&&this.shape.boundingBox.topt.top}}],[{key:"updateGroupOptions",value:function(t,e,i){if(void 0!==i){var o=t.group;if(void 0!==e&&void 0!==e.group&&o!==e.group)throw new Error("updateGroupOptions: group values in options don't match.");if("number"==typeof o||"string"==typeof o&&""!=o){var n=i.get(o);h.selectiveNotDeepExtend(["font"],t,n),t.color=h.parseColor(t.color)}}}},{key:"parseOptions",value:function(e,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},s=arguments[4],r=["color","fixed","shadow"];if(h.selectiveNotDeepExtend(r,e,i,o),t.checkMass(i),h.mergeOptions(e,i,"shadow",n),void 0!==i.color&&null!==i.color){var a=h.parseColor(i.color);h.fillIfDefined(e.color,a)}else!0===o&&null===i.color&&(e.color=h.bridgeObject(n.color));void 0!==i.fixed&&null!==i.fixed&&("boolean"==typeof i.fixed?(e.fixed.x=i.fixed,e.fixed.y=i.fixed):(void 0!==i.fixed.x&&"boolean"==typeof i.fixed.x&&(e.fixed.x=i.fixed.x),void 0!==i.fixed.y&&"boolean"==typeof i.fixed.y&&(e.fixed.y=i.fixed.y))),!0===o&&null===i.font&&(e.font=h.bridgeObject(n.font)),t.updateGroupOptions(e,i,s),void 0!==i.scaling&&h.mergeOptions(e.scaling,i.scaling,"label",n.scaling)}},{key:"checkMass",value:function(t,e){if(void 0!==t.mass&&t.mass<=0){var i="";void 0!==e&&(i=" in node id: "+e),console.log("%cNegative or zero mass disallowed"+i+", setting mass to 1.",C),t.mass=1}}}]),t}();e.default=O},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(6),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(2),u=function(){function t(){(0,a.default)(this,t)}return(0,d.default)(t,null,[{key:"choosify",value:function(t,e){var i=["node","edge","label"],o=!0,n=l.topMost(e,"chosen");if("boolean"==typeof n)o=n;else if("object"===(void 0===n?"undefined":(0,s.default)(n))){if(-1===i.indexOf(t))throw new Error("choosify: subOption '"+t+"' should be one of '"+i.join("', '")+"'");var r=l.topMost(e,["chosen",t]);"boolean"!=typeof r&&"function"!=typeof r||(o=r)}return o}},{key:"pointInRect",value:function(t,e,i){if(t.width<=0||t.height<=0)return!1;if(void 0!==i){var o={x:e.x-i.x,y:e.y-i.y};if(0!==i.angle){var n=-i.angle;e={x:Math.cos(n)*o.x-Math.sin(n)*o.y,y:Math.sin(n)*o.x+Math.cos(n)*o.y}}else e=o}var s=t.x+t.width,r=t.y+t.width;return t.lefte.x&&t.tope.y}},{key:"isValidLabel",value:function(t){return"string"==typeof t&&""!==t}}]),t}();e.default=u},function(t,e,i){i(125);for(var o=i(18),n=i(26),s=i(31),r=i(13)("toStringTag"),a="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),h=0;hdocument.F=Object<\/script>"),t.close(),h=t.F;o--;)delete h.prototype[s[o]];return h()};t.exports=Object.create||function(t,e){var i;return null!==t?(a.prototype=o(t),i=new a,a.prototype=null,i[r]=t):i=h(),void 0===e?i:n(i,e)}},function(t,e){var i=Math.ceil,o=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?o:i)(t)}},function(t,e,i){var o=i(57)("keys"),n=i(40);t.exports=function(t){return o[t]||(o[t]=n(t))}},function(t,e,i){var o=i(18),n=o["__core-js_shared__"]||(o["__core-js_shared__"]={});t.exports=function(t){return n[t]||(n[t]={})}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,i){var o=i(20).f,n=i(22),s=i(13)("toStringTag");t.exports=function(t,e,i){t&&!n(t=i?t:t.prototype,s)&&o(t,s,{configurable:!0,value:e})}},function(t,e,i){var o=i(135)(!0);i(79)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,i=this._i;return i>=e.length?{value:void 0,done:!0}:(t=o(e,i),this._i+=t.length,{value:t,done:!1})})},function(t,e,i){e.f=i(13)},function(t,e,i){var o=i(18),n=i(7),s=i(52),r=i(61),a=i(20).f;t.exports=function(t){var e=n.Symbol||(n.Symbol=s?{}:o.Symbol||{});"_"==t.charAt(0)||t in e||a(e,t,{value:r.f(t)})}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e){var i=p().hours(0).minutes(0).seconds(0).milliseconds(0),o=i.clone().add(-3,"days").valueOf(),n=i.clone().add(3,"days").valueOf();this.millisecondsPerPixelCache=void 0,void 0===e?(this.start=o,this.end=n):(this.start=e.start||o,this.end=e.end||n),this.rolling=!1,this.body=t,this.deltaDifference=0,this.scaleOffset=0,this.startToFront=!1,this.endToFront=!0,this.defaultOptions={rtl:!1,start:null,end:null,moment:p,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10,rollingMode:{follow:!1,offset:.5}},this.options=c.extend({},this.defaultOptions),this.props={touch:{}},this.animationTimer=null,this.body.emitter.on("panstart",this._onDragStart.bind(this)),this.body.emitter.on("panmove",this._onDrag.bind(this)),this.body.emitter.on("panend",this._onDragEnd.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.body.dom.rollingModeBtn.addEventListener("click",this.startRolling.bind(this)),this.setOptions(e)}function s(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}var r=i(8),a=o(r),h=i(19),d=o(h),l=i(6),u=o(l),c=i(2),p=i(9),f=i(16),m=i(36);n.prototype=new f,n.prototype.setOptions=function(t){if(t){var e=["animation","direction","min","max","zoomMin","zoomMax","moveable","zoomable","moment","activate","hiddenDates","zoomKey","rtl","showCurrentTime","rollingMode","horizontalScroll"];c.selectiveExtend(e,this.options,t),t.rollingMode&&t.rollingMode.follow&&this.startRolling(),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},n.prototype.startRolling=function(){function t(){e.stopRolling(),e.rolling=!0;var i=e.end-e.start,o=c.convert(new Date,"Date").valueOf(),n=o-i*e.options.rollingMode.offset,s=o+i*(1-e.options.rollingMode.offset),r={animation:!1};e.setRange(n,s,r),i=1/e.conversion(e.body.domProps.center.width).scale/10,i<30&&(i=30),i>1e3&&(i=1e3),e.body.dom.rollingModeBtn.style.visibility="hidden",e.currentTimeTimer=setTimeout(t,i)}var e=this;t()},n.prototype.stopRolling=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),this.rolling=!1,this.body.dom.rollingModeBtn.style.visibility="visible")},n.prototype.setRange=function(t,e,i,o,n){i||(i={}),!0!==i.byUser&&(i.byUser=!1);var s=this,r=void 0!=t?c.convert(t,"Date").valueOf():null,h=void 0!=e?c.convert(e,"Date").valueOf():null;if(this._cancelAnimation(),this.millisecondsPerPixelCache=void 0,i.animation){var l=this.start,p=this.end,f="object"===(0,u.default)(i.animation)&&"duration"in i.animation?i.animation.duration:500,v="object"===(0,u.default)(i.animation)&&"easingFunction"in i.animation?i.animation.easingFunction:"easeInOutQuad",g=c.easingFunctions[v];if(!g)throw new Error("Unknown easing function "+(0,d.default)(v)+". Choose from: "+(0,a.default)(c.easingFunctions).join(", "));var y=(new Date).valueOf(),b=!1;return function t(){if(!s.props.touch.dragging){var e=(new Date).valueOf(),a=e-y,d=g(a/f),u=a>f,c=u||null===r?r:l+(r-l)*d,v=u||null===h?h:p+(h-p)*d;_=s._applyRange(c,v),m.updateHiddenDates(s.options.moment,s.body,s.options.hiddenDates),b=b||_;var w={start:new Date(s.start),end:new Date(s.end),byUser:i.byUser,event:io.cucumber.core.event};if(n&&n(d,_,u),_&&s.body.emitter.emit("rangechange",w),u){if(b&&(s.body.emitter.emit("rangechanged",w),o))return o()}else s.animationTimer=setTimeout(t,20)}}()}var _=this._applyRange(r,h);if(m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),_){var w={start:new Date(this.start),end:new Date(this.end),byUser:i.byUser,event:io.cucumber.core.event};if(this.body.emitter.emit("rangechange",w),clearTimeout(s.timeoutID),s.timeoutID=setTimeout(function(){s.body.emitter.emit("rangechanged",w)},200),o)return o()}},n.prototype.getMillisecondsPerPixel=function(){return void 0===this.millisecondsPerPixelCache&&(this.millisecondsPerPixelCache=(this.end-this.start)/this.body.dom.center.clientWidth),this.millisecondsPerPixelCache},n.prototype._cancelAnimation=function(){this.animationTimer&&(clearTimeout(this.animationTimer),this.animationTimer=null)},n.prototype._applyRange=function(t,e){var i,o=null!=t?c.convert(t,"Date").valueOf():this.start,n=null!=e?c.convert(e,"Date").valueOf():this.end,s=null!=this.options.max?c.convert(this.options.max,"Date").valueOf():null,r=null!=this.options.min?c.convert(this.options.min,"Date").valueOf():null;if(isNaN(o)||null===o)throw new Error('Invalid start "'+t+'"');if(isNaN(n)||null===n)throw new Error('Invalid end "'+e+'"');if(ns&&(n=s)),null!==s&&n>s&&(i=n-s,o-=i,n-=i,null!=r&&o=this.start-.5&&n<=this.end?(o=this.start,n=this.end):(i=a-(n-o),o-=i/2,n+=i/2)}}if(null!==this.options.zoomMax){var h=parseFloat(this.options.zoomMax);h<0&&(h=0),n-o>h&&(this.end-this.start===h&&othis.end?(o=this.start,n=this.end):(i=n-o-h,o+=i/2,n-=i/2))}var d=this.start!=o||this.end!=n;return o>=this.start&&o<=this.end||n>=this.start&&n<=this.end||this.start>=o&&this.start<=n||this.end>=o&&this.end<=n||this.body.emitter.emit("checkRangedItems"),this.start=o,this.end=n,d},n.prototype.getRange=function(){return{start:this.start,end:this.end}},n.prototype.conversion=function(t,e){return n.conversion(this.start,this.end,t,e)},n.conversion=function(t,e,i,o){return void 0===o&&(o=0),0!=i&&e-t!=0?{offset:t,scale:i/(e-t-o)}:{offset:0,scale:1}},n.prototype._onDragStart=function(t){this.deltaDifference=0,this.previousDelta=0,this.options.moveable&&this._isInsideRange(t)&&this.props.touch.allowDragging&&(this.stopRolling(),this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.dragging=!0,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},n.prototype._onDrag=function(t){if(t&&this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging){var e=this.options.direction;s(e);var i="horizontal"==e?t.deltaX:t.deltaY;i-=this.deltaDifference;var o=this.props.touch.end-this.props.touch.start;o-=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);var n,r="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height;n=this.options.rtl?i/r*o:-i/r*o;var a=this.props.touch.start+n,h=this.props.touch.end+n,d=m.snapAwayFromHidden(this.body.hiddenDates,a,this.previousDelta-i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,this.previousDelta-i,!0);if(d!=a||l!=h)return this.deltaDifference+=i,this.props.touch.start=d,this.props.touch.end=l,void this._onDrag(t);this.previousDelta=i,this._applyRange(a,h);var u=new Date(this.start),c=new Date(this.end);this.body.emitter.emit("rangechange",{start:u,end:c,byUser:!0,event:t}),this.body.emitter.emit("panmove")}},n.prototype._onDragEnd=function(t){this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.dragging=!1,this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end),byUser:!0,event:t}))},n.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),!(this.options.zoomKey&&!t[this.options.zoomKey]&&this.options.zoomable||!this.options.zoomable&&this.options.moveable)&&this.options.zoomable&&this.options.moveable&&this._isInsideRange(t)&&e){var i;i=e<0?1-e/5:1/(1+e/5);var o;if(this.rolling)o=this.start+(this.end-this.start)*this.options.rollingMode.offset;else{var n=this.getPointer({x:t.clientX,y:t.clientY},this.body.dom.center);o=this._pointerToDate(n)}this.zoom(i,o,e,t),t.preventDefault()}},n.prototype._onTouch=function(t){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null,this.scaleOffset=0,this.deltaDifference=0,c.preventDefault(t)},n.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable){c.preventDefault(t),this.props.touch.allowDragging=!1,this.props.touch.center||(this.props.touch.center=this.getPointer(t.center,this.body.dom.center)),this.stopRolling();var e=1/(t.scale+this.scaleOffset),i=this._pointerToDate(this.props.touch.center),o=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),n=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,i),s=o-n,r=i-n+(this.props.touch.start-(i-n))*e,a=i+s+(this.props.touch.end-(i+s))*e;this.startToFront=1-e<=0,this.endToFront=e-1<=0;var h=m.snapAwayFromHidden(this.body.hiddenDates,r,1-e,!0),d=m.snapAwayFromHidden(this.body.hiddenDates,a,e-1,!0);h==r&&d==a||(this.props.touch.start=h,this.props.touch.end=d,this.scaleOffset=1-t.scale,r=h,a=d);var l={animation:!1,byUser:!0,event:t};this.setRange(r,a,l),this.startToFront=!1,this.endToFront=!0}},n.prototype._isInsideRange=function(t){var e,i=t.center?t.center.x:t.clientX;e=this.options.rtl?i-c.getAbsoluteLeft(this.body.dom.centerContainer):c.getAbsoluteRight(this.body.dom.centerContainer)-i;var o=this.body.util.toTime(e);return o>=this.start&&o<=this.end},n.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(s(i),"horizontal"==i)return this.body.util.toTime(t.x).valueOf();var o=this.body.domProps.center.height;return e=this.conversion(o),t.y/e.scale+e.offset},n.prototype.getPointer=function(t,e){return this.options.rtl?{x:c.getAbsoluteRight(e)-t.x,y:t.y-c.getAbsoluteTop(e)}:{x:t.x-c.getAbsoluteLeft(e),y:t.y-c.getAbsoluteTop(e)}},n.prototype.zoom=function(t,e,i,o){null==e&&(e=(this.start+this.end)/2);var n=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),s=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,e),r=n-s,a=e-s+(this.start-(e-s))*t,h=e+r+(this.end-(e+r))*t;this.startToFront=!(i>0),this.endToFront=!(-i>0) ;var d=m.snapAwayFromHidden(this.body.hiddenDates,a,i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,-i,!0);d==a&&l==h||(a=d,h=l);var u={animation:!1,byUser:!0,event:o};this.setRange(a,h,u),this.startToFront=!1,this.endToFront=!0},n.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,o=this.end+e*t;this.start=i,this.end=o},n.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,o=this.start-i,n=this.end-i,s={animation:!1,byUser:!0,event:null};this.setRange(o,n,s)},t.exports=n},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(){}var s=i(19),r=o(s),a=i(6),h=o(a),d=i(44),l=i(10),u=i(37),c=i(2),p=i(45),f=i(97),m=i(36),v=i(46);d(n.prototype),n.prototype._create=function(t){function e(t){this.isActive()&&this.emit("mousewheel",t);var e=0,i=0;if("detail"in t&&(i=-1*t.detail),"wheelDelta"in t&&(i=t.wheelDelta),"wheelDeltaY"in t&&(i=t.wheelDeltaY),"wheelDeltaX"in t&&(e=-1*t.wheelDeltaX),"axis"in t&&t.axis===t.HORIZONTAL_AXIS&&(e=-1*i,i=0),"deltaY"in t&&(i=-1*t.deltaY),"deltaX"in t&&(e=t.deltaX),this.options.zoomKey&&!t[this.options.zoomKey])if(t.preventDefault(),this.options.verticalScroll&&Math.abs(i)>=Math.abs(e)){var o=this.props.scrollTop,n=o+i;this.isActive()&&(this._setScrollTop(n),this._redraw(),this.emit("scroll",t))}else if(this.options.horizontalScroll){var s=Math.abs(e)>=Math.abs(i)?e:i,r=s/120*(this.range.end-this.range.start)/20,a=this.range.start+r,h=this.range.end+r,d={animation:!1,byUser:!0,event:t};this.range.setRange(a,h,d)}}function i(t){if(s.options.verticalScroll&&(t.preventDefault(),s.isActive())){var e=-t.target.scrollTop;s._setScrollTop(e),s._redraw(),s.emit("scrollSide",t)}}function o(t){if(t.preventDefault&&t.preventDefault(),!(!t.target.className.indexOf("vis")>-1||a))return t.dataTransfer.dropEffect="move",a=!0,!1}function n(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation();try{var e=JSON.parse(t.dataTransfer.getData("text"));if(!e||!e.content)return}catch(t){return!1}return a=!1,t.center={x:t.clientX,y:t.clientY},"item"!==e.target?s.itemSet._onAddItem(t):s.itemSet._onDropObjectOnItem(t),s.emit("drop",s.getEventProperties(t)),!1}this.dom={},this.dom.container=t,this.dom.root=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.backgroundVertical=document.createElement("div"),this.dom.backgroundHorizontal=document.createElement("div"),this.dom.centerContainer=document.createElement("div"),this.dom.leftContainer=document.createElement("div"),this.dom.rightContainer=document.createElement("div"),this.dom.center=document.createElement("div"),this.dom.left=document.createElement("div"),this.dom.right=document.createElement("div"),this.dom.top=document.createElement("div"),this.dom.bottom=document.createElement("div"),this.dom.shadowTop=document.createElement("div"),this.dom.shadowBottom=document.createElement("div"),this.dom.shadowTopLeft=document.createElement("div"),this.dom.shadowBottomLeft=document.createElement("div"),this.dom.shadowTopRight=document.createElement("div"),this.dom.shadowBottomRight=document.createElement("div"),this.dom.rollingModeBtn=document.createElement("div"),this.dom.root.className="vis-timeline",this.dom.background.className="vis-panel vis-background",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical",this.dom.backgroundHorizontal.className="vis-panel vis-background vis-horizontal",this.dom.centerContainer.className="vis-panel vis-center",this.dom.leftContainer.className="vis-panel vis-left",this.dom.rightContainer.className="vis-panel vis-right",this.dom.top.className="vis-panel vis-top",this.dom.bottom.className="vis-panel vis-bottom",this.dom.left.className="vis-content",this.dom.center.className="vis-content",this.dom.right.className="vis-content",this.dom.shadowTop.className="vis-shadow vis-top",this.dom.shadowBottom.className="vis-shadow vis-bottom",this.dom.shadowTopLeft.className="vis-shadow vis-top",this.dom.shadowBottomLeft.className="vis-shadow vis-bottom",this.dom.shadowTopRight.className="vis-shadow vis-top",this.dom.shadowBottomRight.className="vis-shadow vis-bottom",this.dom.rollingModeBtn.className="vis-rolling-mode-btn",this.dom.root.appendChild(this.dom.background),this.dom.root.appendChild(this.dom.backgroundVertical),this.dom.root.appendChild(this.dom.backgroundHorizontal),this.dom.root.appendChild(this.dom.centerContainer),this.dom.root.appendChild(this.dom.leftContainer),this.dom.root.appendChild(this.dom.rightContainer),this.dom.root.appendChild(this.dom.top),this.dom.root.appendChild(this.dom.bottom),this.dom.root.appendChild(this.dom.bottom),this.dom.root.appendChild(this.dom.rollingModeBtn),this.dom.centerContainer.appendChild(this.dom.center),this.dom.leftContainer.appendChild(this.dom.left),this.dom.rightContainer.appendChild(this.dom.right),this.dom.centerContainer.appendChild(this.dom.shadowTop),this.dom.centerContainer.appendChild(this.dom.shadowBottom),this.dom.leftContainer.appendChild(this.dom.shadowTopLeft),this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft),this.dom.rightContainer.appendChild(this.dom.shadowTopRight),this.dom.rightContainer.appendChild(this.dom.shadowBottomRight),this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0},this.on("rangechange",function(){!0===this.initialDrawDone&&this._redraw()}.bind(this)),this.on("rangechanged",function(){this.initialRangeChangeDone||(this.initialRangeChangeDone=!0)}.bind(this)),this.on("touch",this._onTouch.bind(this)),this.on("panmove",this._onDrag.bind(this));var s=this;this._origRedraw=this._redraw.bind(this),this._redraw=c.throttle(this._origRedraw),this.on("_change",function(t){s.itemSet&&s.itemSet.initialItemSetDrawn&&t&&1==t.queue?s._redraw():s._origRedraw()}),this.hammer=new l(this.dom.root);var r=this.hammer.get("pinch").set({enable:!0});u.disablePreventDefaultVertically(r),this.hammer.get("pan").set({threshold:5,direction:l.DIRECTION_HORIZONTAL}),this.listeners={},["tap","doubletap","press","pinch","pan","panstart","panmove","panend"].forEach(function(t){var e=function(e){s.isActive()&&s.emit(t,e)};s.hammer.on(t,e),s.listeners[t]=e}),u.onTouch(this.hammer,function(t){s.emit("touch",t)}.bind(this)),u.onRelease(this.hammer,function(t){s.emit("release",t)}.bind(this)),this.dom.centerContainer.addEventListener?(this.dom.centerContainer.addEventListener("mousewheel",e.bind(this),!1),this.dom.centerContainer.addEventListener("DOMMouseScroll",e.bind(this),!1)):this.dom.centerContainer.attachEvent("onmousewheel",e.bind(this)),this.dom.left.parentNode.addEventListener("scroll",i.bind(this)),this.dom.right.parentNode.addEventListener("scroll",i.bind(this));var a=!1;if(this.dom.center.addEventListener("dragover",o.bind(this),!1),this.dom.center.addEventListener("drop",n.bind(this),!1),this.customTimes=[],this.touch={},this.redrawCount=0,this.initialDrawDone=!1,this.initialRangeChangeDone=!1,!t)throw new Error("No container provided");t.appendChild(this.dom.root)},n.prototype.setOptions=function(t){if(t){var e=["width","height","minHeight","maxHeight","autoResize","start","end","clickToUse","dataAttributes","hiddenDates","locale","locales","moment","rtl","zoomKey","horizontalScroll","verticalScroll"];if(c.selectiveExtend(e,this.options,t),this.dom.rollingModeBtn.style.visibility="hidden",this.options.rtl&&(this.dom.container.style.direction="rtl",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical-rtl"),this.options.verticalScroll&&(this.options.rtl?this.dom.rightContainer.className="vis-panel vis-right vis-vertical-scroll":this.dom.leftContainer.className="vis-panel vis-left vis-vertical-scroll"),"object"!==(0,h.default)(this.options.orientation)&&(this.options.orientation={item:void 0,axis:void 0}),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation={item:t.orientation,axis:t.orientation}:"object"===(0,h.default)(t.orientation)&&("item"in t.orientation&&(this.options.orientation.item=t.orientation.item),"axis"in t.orientation&&(this.options.orientation.axis=t.orientation.axis))),"both"===this.options.orientation.axis){if(!this.timeAxis2){var i=this.timeAxis2=new p(this.body);i.setOptions=function(t){var e=t?c.extend({},t):{};e.orientation="top",p.prototype.setOptions.call(i,e)},this.components.push(i)}}else if(this.timeAxis2){var o=this.components.indexOf(this.timeAxis2);-1!==o&&this.components.splice(o,1),this.timeAxis2.destroy(),this.timeAxis2=null}if("function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),"hiddenDates"in this.options&&m.convertHiddenOptions(this.options.moment,this.body,this.options.hiddenDates),"clickToUse"in t&&(t.clickToUse?this.activator||(this.activator=new f(this.dom.root)):this.activator&&(this.activator.destroy(),delete this.activator)),"showCustomTime"in t)throw new Error("Option `showCustomTime` is deprecated. Create a custom time bar via timeline.addCustomTime(time [, id])");this._initAutoResize()}if(this.components.forEach(function(e){return e.setOptions(t)}),"configure"in t){this.configurator||(this.configurator=this._createConfigurator()),this.configurator.setOptions(t.configure);var n=c.deepExtend({},this.options);this.components.forEach(function(t){c.deepExtend(n,t.options)}),this.configurator.setModuleOptions({global:n})}this._redraw()},n.prototype.isActive=function(){return!this.activator||this.activator.active},n.prototype.destroy=function(){this.setItems(null),this.setGroups(null),this.off(),this._stopAutoResize(),this.dom.root.parentNode&&this.dom.root.parentNode.removeChild(this.dom.root),this.dom=null,this.activator&&(this.activator.destroy(),delete this.activator);for(var t in this.listeners)this.listeners.hasOwnProperty(t)&&delete this.listeners[t];this.listeners=null,this.hammer=null,this.components.forEach(function(t){return t.destroy()}),this.body=null},n.prototype.setCustomTime=function(t,e){var i=this.customTimes.filter(function(t){return e===t.options.id});if(0===i.length)throw new Error("No custom time bar found with id "+(0,r.default)(e));i.length>0&&i[0].setCustomTime(t)},n.prototype.getCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+(0,r.default)(t));return e[0].getCustomTime()},n.prototype.setCustomTimeTitle=function(t,e){var i=this.customTimes.filter(function(t){return t.options.id===e});if(0===i.length)throw new Error("No custom time bar found with id "+(0,r.default)(e));if(i.length>0)return i[0].setCustomTitle(t)},n.prototype.getEventProperties=function(t){return{event:t}},n.prototype.addCustomTime=function(t,e){var i=void 0!==t?c.convert(t,"Date").valueOf():new Date;if(this.customTimes.some(function(t){return t.options.id===e}))throw new Error("A custom time with id "+(0,r.default)(e)+" already exists");var o=new v(this.body,c.extend({},this.options,{time:i,id:e}));return this.customTimes.push(o),this.components.push(o),this._redraw(),e},n.prototype.removeCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+(0,r.default)(t));e.forEach(function(t){this.customTimes.splice(this.customTimes.indexOf(t),1),this.components.splice(this.components.indexOf(t),1),t.destroy()}.bind(this))},n.prototype.getVisibleItems=function(){return this.itemSet&&this.itemSet.getVisibleItems()||[]},n.prototype.fit=function(t,e){var i=this.getDataRange();if(null!==i.min||null!==i.max){var o=i.max-i.min,n=new Date(i.min.valueOf()-.01*o),s=new Date(i.max.valueOf()+.01*o),r=!t||void 0===t.animation||t.animation;this.range.setRange(n,s,{animation:r},e)}},n.prototype.getDataRange=function(){throw new Error("Cannot invoke abstract method getDataRange")},n.prototype.setWindow=function(t,e,i,o){"function"==typeof arguments[2]&&(o=arguments[2],i={});var n,s;1==arguments.length?(s=arguments[0],n=void 0===s.animation||s.animation,this.range.setRange(s.start,s.end,{animation:n})):2==arguments.length&&"function"==typeof arguments[1]?(s=arguments[0],o=arguments[1],n=void 0===s.animation||s.animation,this.range.setRange(s.start,s.end,{animation:n},o)):(n=!i||void 0===i.animation||i.animation,this.range.setRange(t,e,{animation:n},o))},n.prototype.moveTo=function(t,e,i){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.range.end-this.range.start,n=c.convert(t,"Date").valueOf(),s=n-o/2,r=n+o/2,a=!e||void 0===e.animation||e.animation;this.range.setRange(s,r,{animation:a},i)},n.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},n.prototype.zoomIn=function(t,e,i){if(!(!t||t<0||t>1)){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.getWindow(),n=o.start.valueOf(),s=o.end.valueOf(),r=s-n,a=r/(1+t),h=(r-a)/2,d=n+h,l=s-h;this.setWindow(d,l,e,i)}},n.prototype.zoomOut=function(t,e,i){if(!(!t||t<0||t>1)){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.getWindow(),n=o.start.valueOf(),s=o.end.valueOf(),r=s-n,a=n-r*t/2,h=s+r*t/2;this.setWindow(a,h,e,i)}},n.prototype.redraw=function(){this._redraw()},n.prototype._redraw=function(){this.redrawCount++;var t=!1,e=this.options,i=this.props,o=this.dom;if(o&&o.container&&0!=o.root.offsetWidth){m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),"top"==e.orientation?(c.addClassName(o.root,"vis-top"),c.removeClassName(o.root,"vis-bottom")):(c.removeClassName(o.root,"vis-top"),c.addClassName(o.root,"vis-bottom")),o.root.style.maxHeight=c.option.asSize(e.maxHeight,""),o.root.style.minHeight=c.option.asSize(e.minHeight,""),o.root.style.width=c.option.asSize(e.width,""),i.border.left=(o.centerContainer.offsetWidth-o.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(o.centerContainer.offsetHeight-o.centerContainer.clientHeight)/2,i.border.bottom=i.border.top,i.borderRootHeight=o.root.offsetHeight-o.root.clientHeight,i.borderRootWidth=o.root.offsetWidth-o.root.clientWidth,0===o.centerContainer.clientHeight&&(i.border.left=i.border.top,i.border.right=i.border.left),0===o.root.clientHeight&&(i.borderRootWidth=i.borderRootHeight),i.center.height=o.center.offsetHeight,i.left.height=o.left.offsetHeight,i.right.height=o.right.offsetHeight,i.top.height=o.top.clientHeight||-i.border.top,i.bottom.height=o.bottom.clientHeight||-i.border.bottom;var n=Math.max(i.left.height,i.center.height,i.right.height),s=i.top.height+n+i.bottom.height+i.borderRootHeight+i.border.top+i.border.bottom;o.root.style.height=c.option.asSize(e.height,s+"px"),i.root.height=o.root.offsetHeight,i.background.height=i.root.height-i.borderRootHeight;var r=i.root.height-i.top.height-i.bottom.height-i.borderRootHeight;i.centerContainer.height=r,i.leftContainer.height=r,i.rightContainer.height=i.leftContainer.height,i.root.width=o.root.offsetWidth,i.background.width=i.root.width-i.borderRootWidth,this.initialDrawDone||(i.scrollbarWidth=c.getScrollBarWidth()),e.verticalScroll?e.rtl?(i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth+i.scrollbarWidth||-i.border.right):(i.left.width=o.leftContainer.clientWidth+i.scrollbarWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right):(i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right),this._setDOM();var a=this._updateScrollTop();"top"!=e.orientation.item&&(a+=Math.max(i.centerContainer.height-i.center.height-i.border.top-i.border.bottom,0)),o.center.style.top=a+"px";var h=0==i.scrollTop?"hidden":"",d=i.scrollTop==i.scrollTopMin?"hidden":"";o.shadowTop.style.visibility=h,o.shadowBottom.style.visibility=d,o.shadowTopLeft.style.visibility=h,o.shadowBottomLeft.style.visibility=d,o.shadowTopRight.style.visibility=h,o.shadowBottomRight.style.visibility=d,e.verticalScroll&&(o.rightContainer.className="vis-panel vis-right vis-vertical-scroll",o.leftContainer.className="vis-panel vis-left vis-vertical-scroll",o.shadowTopRight.style.visibility="hidden",o.shadowBottomRight.style.visibility="hidden",o.shadowTopLeft.style.visibility="hidden",o.shadowBottomLeft.style.visibility="hidden",o.left.style.top="0px",o.right.style.top="0px"),(!e.verticalScroll||i.center.heighti.centerContainer.height;this.hammer.get("pan").set({direction:u?l.DIRECTION_ALL:l.DIRECTION_HORIZONTAL}),this.components.forEach(function(e){t=e.redraw()||t});if(t){if(this.redrawCount<5)return void this.body.emitter.emit("_change");console.log("WARNING: infinite loop in redraw?")}else this.redrawCount=0;this.body.emitter.emit("changed")}},n.prototype._setDOM=function(){var t=this.props,e=this.dom;t.leftContainer.width=t.left.width,t.rightContainer.width=t.right.width;var i=t.root.width-t.left.width-t.right.width-t.borderRootWidth;t.center.width=i,t.centerContainer.width=i,t.top.width=i,t.bottom.width=i,e.background.style.height=t.background.height+"px",e.backgroundVertical.style.height=t.background.height+"px",e.backgroundHorizontal.style.height=t.centerContainer.height+"px",e.centerContainer.style.height=t.centerContainer.height+"px",e.leftContainer.style.height=t.leftContainer.height+"px",e.rightContainer.style.height=t.rightContainer.height+"px",e.background.style.width=t.background.width+"px",e.backgroundVertical.style.width=t.centerContainer.width+"px",e.backgroundHorizontal.style.width=t.background.width+"px",e.centerContainer.style.width=t.center.width+"px",e.top.style.width=t.top.width+"px",e.bottom.style.width=t.bottom.width+"px",e.background.style.left="0",e.background.style.top="0",e.backgroundVertical.style.left=t.left.width+t.border.left+"px",e.backgroundVertical.style.top="0",e.backgroundHorizontal.style.left="0",e.backgroundHorizontal.style.top=t.top.height+"px",e.centerContainer.style.left=t.left.width+"px",e.centerContainer.style.top=t.top.height+"px",e.leftContainer.style.left="0",e.leftContainer.style.top=t.top.height+"px",e.rightContainer.style.left=t.left.width+t.center.width+"px",e.rightContainer.style.top=t.top.height+"px",e.top.style.left=t.left.width+"px",e.top.style.top="0",e.bottom.style.left=t.left.width+"px",e.bottom.style.top=t.top.height+t.centerContainer.height+"px",e.center.style.left="0",e.left.style.left="0",e.right.style.left="0"},n.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},n.prototype.setCurrentTime=function(t){if(!this.currentTime)throw new Error("Option showCurrentTime must be true");this.currentTime.setCurrentTime(t)},n.prototype.getCurrentTime=function(){if(!this.currentTime)throw new Error("Option showCurrentTime must be true");return this.currentTime.getCurrentTime()},n.prototype._toTime=function(t){return m.toTime(this,t,this.props.center.width)},n.prototype._toGlobalTime=function(t){return m.toTime(this,t,this.props.root.width)},n.prototype._toScreen=function(t){return m.toScreen(this,t,this.props.center.width)},n.prototype._toGlobalScreen=function(t){return m.toScreen(this,t,this.props.root.width)},n.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},n.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){if(1!=t.options.autoResize)return void t._stopAutoResize();t.dom.root&&(t.dom.root.offsetWidth==t.props.lastWidth&&t.dom.root.offsetHeight==t.props.lastHeight||(t.props.lastWidth=t.dom.root.offsetWidth,t.props.lastHeight=t.dom.root.offsetHeight,t.props.scrollbarWidth=c.getScrollBarWidth(),t.body.emitter.emit("_change")))},c.addEventListener(window,"resize",this._onResize),t.dom.root&&(t.props.lastWidth=t.dom.root.offsetWidth,t.props.lastHeight=t.dom.root.offsetHeight),this.watchTimer=setInterval(this._onResize,1e3)},n.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),this._onResize&&(c.removeEventListener(window,"resize",this._onResize),this._onResize=null)},n.prototype._onTouch=function(t){this.touch.allowDragging=!0,this.touch.initialScrollTop=this.props.scrollTop},n.prototype._onPinch=function(t){this.touch.allowDragging=!1},n.prototype._onDrag=function(t){if(t&&this.touch.allowDragging){var e=t.deltaY,i=this._getScrollTop(),o=this._setScrollTop(this.touch.initialScrollTop+e);this.options.verticalScroll&&(this.dom.left.parentNode.scrollTop=-this.props.scrollTop,this.dom.right.parentNode.scrollTop=-this.props.scrollTop),o!=i&&this.emit("verticalDrag")}},n.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},n.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("top"!=this.options.orientation.item&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTop0&&this.current.milliseconds()0&&this.current.seconds()0&&this.current.minutes()0&&this.current.hours()0?t.step:1,this.autoScale=!1)},o.prototype.setAutoScale=function(t){this.autoScale=t},o.prototype.setMinimumStep=function(t){if(void 0!=t){31104e9>t&&(this.scale="year",this.step=1e3),15552e9>t&&(this.scale="year",this.step=500),31104e8>t&&(this.scale="year",this.step=100),15552e8>t&&(this.scale="year",this.step=50),31104e7>t&&(this.scale="year",this.step=10),15552e7>t&&(this.scale="year",this.step=5),31104e6>t&&(this.scale="year",this.step=1),7776e6>t&&(this.scale="month",this.step=3),2592e6>t&&(this.scale="month",this.step=1),432e6>t&&(this.scale="day",this.step=5),1728e5>t&&(this.scale="day",this.step=2),864e5>t&&(this.scale="day",this.step=1),432e5>t&&(this.scale="weekday",this.step=1),144e5>t&&(this.scale="hour",this.step=4),36e5>t&&(this.scale="hour",this.step=1),9e5>t&&(this.scale="minute",this.step=15),6e5>t&&(this.scale="minute",this.step=10),3e5>t&&(this.scale="minute",this.step=5),6e4>t&&(this.scale="minute",this.step=1),15e3>t&&(this.scale="second",this.step=15),1e4>t&&(this.scale="second",this.step=10),5e3>t&&(this.scale="second",this.step=5),1e3>t&&(this.scale="second",this.step=1),200>t&&(this.scale="millisecond",this.step=200),100>t&&(this.scale="millisecond",this.step=100),50>t&&(this.scale="millisecond",this.step=50),10>t&&(this.scale="millisecond",this.step=10),5>t&&(this.scale="millisecond",this.step=5),1>t&&(this.scale="millisecond",this.step=1)}},o.snap=function(t,e,i){var o=n(t);if("year"==e){var s=o.year()+Math.round(o.month()/12);o.year(Math.round(s/i)*i),o.month(0),o.date(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("month"==e)o.date()>15?(o.date(1),o.add(1,"month")):o.date(1),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("week"==e)o.weekday()>2?(o.weekday(0),o.add(1,"week")):o.weekday(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("day"==e){switch(i){case 5:case 2:o.hours(24*Math.round(o.hours()/24));break;default:o.hours(12*Math.round(o.hours()/12))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("weekday"==e){switch(i){case 5:case 2:o.hours(12*Math.round(o.hours()/12));break;default:o.hours(6*Math.round(o.hours()/6))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("hour"==e){switch(i){case 4:o.minutes(60*Math.round(o.minutes()/60));break;default:o.minutes(30*Math.round(o.minutes()/30))}o.seconds(0),o.milliseconds(0)}else if("minute"==e){switch(i){case 15:case 10:o.minutes(5*Math.round(o.minutes()/5)),o.seconds(0);break;case 5:o.seconds(60*Math.round(o.seconds()/60));break;default:o.seconds(30*Math.round(o.seconds()/30))}o.milliseconds(0)}else if("second"==e)switch(i){case 15:case 10:o.seconds(5*Math.round(o.seconds()/5)),o.milliseconds(0);break;case 5:o.milliseconds(1e3*Math.round(o.milliseconds()/1e3));break;default:o.milliseconds(500*Math.round(o.milliseconds()/500))}else if("millisecond"==e){var r=i>5?i/2:1;o.milliseconds(Math.round(o.milliseconds()/r)*r)}return o},o.prototype.isMajor=function(){if(1==this.switchedYear)switch(this.scale){case"year":case"month":case"week":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedMonth)switch(this.scale){case"week":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedDay)switch(this.scale){case"millisecond":case"second":case"minute":case"hour":return!0;default:return!1}var t=this.moment(this.current);switch(this.scale){case"millisecond":return 0==t.milliseconds();case"second":return 0==t.seconds();case"minute":return 0==t.hours()&&0==t.minutes();case"hour":return 0==t.hours();case"weekday":case"day":case"week":return 1==t.date();case"month":return 0==t.month();case"year":default:return!1}},o.prototype.getLabelMinor=function(t){if(void 0==t&&(t=this.current),t instanceof Date&&(t=this.moment(t)),"function"==typeof this.format.minorLabels)return this.format.minorLabels(t,this.scale,this.step);var e=this.format.minorLabels[this.scale];switch(this.scale){case"week":if(this.isMajor()&&0!==t.weekday())return"";default:return e&&e.length>0?this.moment(t).format(e):""}},o.prototype.getLabelMajor=function(t){if(void 0==t&&(t=this.current),t instanceof Date&&(t=this.moment(t)),"function"==typeof this.format.majorLabels)return this.format.majorLabels(t,this.scale,this.step);var e=this.format.majorLabels[this.scale];return e&&e.length>0?this.moment(t).format(e):""},o.prototype.getClassName=function(){function t(t){return t/a%2==0?" vis-even":" vis-odd"}function e(t){return t.isSame(new Date,"day")?" vis-today":t.isSame(n().add(1,"day"),"day")?" vis-tomorrow":t.isSame(n().add(-1,"day"),"day")?" vis-yesterday":""}function i(t){return t.isSame(new Date,"week")?" vis-current-week":""}function o(t){return t.isSame(new Date,"month")?" vis-current-month":""}var n=this.moment,s=this.moment(this.current),r=s.locale?s.locale("en"):s.lang("en"),a=this.step,h=[];switch(this.scale){case"millisecond":h.push(e(r)),h.push(t(r.milliseconds()));break;case"second":h.push(e(r)),h.push(t(r.seconds()));break;case"minute":h.push(e(r)),h.push(t(r.minutes()));break;case"hour":h.push("vis-h"+r.hours()+(4==this.step?"-h"+(r.hours()+4):"")),h.push(e(r)),h.push(t(r.hours()));break;case"weekday":h.push("vis-"+r.format("dddd").toLowerCase()),h.push(e(r)),h.push(i(r)),h.push(t(r.date()));break;case"day":h.push("vis-day"+r.date()),h.push("vis-"+r.format("MMMM").toLowerCase()),h.push(e(r)),h.push(o(r)),h.push(this.step<=2?e(r):""),h.push(this.step<=2?"vis-"+r.format("dddd").toLowerCase():""), h.push(t(r.date()-1));break;case"week":h.push("vis-week"+r.format("w")),h.push(i(r)),h.push(t(r.week()));break;case"month":h.push("vis-"+r.format("MMMM").toLowerCase()),h.push(o(r)),h.push(t(r.month()));break;case"year":h.push("vis-year"+r.year()),h.push(function(t){return t.isSame(new Date,"year")?" vis-current-year":""}(r)),h.push(t(r.year()))}return h.filter(String).join(" ")},t.exports=o},function(t,e,i){function o(t,e){this.body=t,this.defaultOptions={rtl:!1,showCurrentTime:!0,moment:r,locales:a,locale:"en"},this.options=n.extend({},this.defaultOptions),this.offset=0,this._create(),this.setOptions(e)}var n=i(2),s=i(16),r=i(9),a=i(98);o.prototype=new s,o.prototype._create=function(){var t=document.createElement("div");t.className="vis-current-time",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},o.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},o.prototype.setOptions=function(t){t&&n.selectiveExtend(["rtl","showCurrentTime","moment","locale","locales"],this.options,t)},o.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=this.options.moment((new Date).valueOf()+this.offset),i=this.body.util.toScreen(e),o=this.options.locales[this.options.locale];o||(this.warned||(console.log("WARNING: options.locales['"+this.options.locale+"'] not found. See http://visjs.org/docs/timeline/#Localization"),this.warned=!0),o=this.options.locales.en);var n=o.current+" "+o.time+": "+e.format("dddd, MMMM Do YYYY, H:mm:ss");n=n.charAt(0).toUpperCase()+n.substring(1),this.options.rtl?this.bar.style.right=i+"px":this.bar.style.left=i+"px",this.bar.title=n}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},o.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,o=1/i/10;o<30&&(o=30),o>1e3&&(o=1e3),e.redraw(),e.body.emitter.emit("currentTimeTick"),e.currentTimeTimer=setTimeout(t,o)}var e=this;t()},o.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},o.prototype.setCurrentTime=function(t){var e=n.convert(t,"Date").valueOf(),i=(new Date).valueOf();this.offset=e-i,this.redraw()},o.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)},t.exports=o},function(t,e,i){function o(t,e,i){if(this.groupId=t,this.subgroups={},this.subgroupStack={},this.subgroupStackAll=!1,this.doInnerStack=!1,this.subgroupIndex=0,this.subgroupOrderer=e&&e.subgroupOrder,this.itemSet=i,this.isVisible=null,this.stackDirty=!0,e&&e.nestedGroups&&(this.nestedGroups=e.nestedGroups,0==e.showNested?this.showNested=!1:this.showNested=!0),e&&e.subgroupStack)if("boolean"==typeof e.subgroupStack)this.doInnerStack=e.subgroupStack,this.subgroupStackAll=e.subgroupStack;else for(var o in e.subgroupStack)this.subgroupStack[o]=e.subgroupStack[o],this.doInnerStack=this.doInnerStack||e.subgroupStack[o];this.nestedInGroup=null,this.dom={},this.props={label:{width:0,height:0}},this.className=null,this.items={},this.visibleItems=[],this.itemsInRange=[],this.orderedItems={byStart:[],byEnd:[]},this.checkRangedItems=!1;var n=this;this.itemSet.body.emitter.on("checkRangedItems",function(){n.checkRangedItems=!0}),this._create(),this.setData(e)}var n=i(8),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(100);o.prototype._create=function(){var t=document.createElement("div");this.itemSet.options.groupEditable.order?t.className="vis-label draggable":t.className="vis-label",this.dom.label=t;var e=document.createElement("div");e.className="vis-inner",t.appendChild(e),this.dom.inner=e;var i=document.createElement("div");i.className="vis-group",i["timeline-group"]=this,this.dom.foreground=i,this.dom.background=document.createElement("div"),this.dom.background.className="vis-group",this.dom.axis=document.createElement("div"),this.dom.axis.className="vis-group",this.dom.marker=document.createElement("div"),this.dom.marker.style.visibility="hidden",this.dom.marker.style.position="absolute",this.dom.marker.innerHTML="",this.dom.background.appendChild(this.dom.marker)},o.prototype.setData=function(t){var e,i;if(this.itemSet.options&&this.itemSet.options.groupTemplate?(i=this.itemSet.options.groupTemplate.bind(this),e=i(t,this.dom.inner)):e=t&&t.content,e instanceof Element){for(this.dom.inner.appendChild(e);this.dom.inner.firstChild;)this.dom.inner.removeChild(this.dom.inner.firstChild);this.dom.inner.appendChild(e)}else e instanceof Object?i(t,this.dom.inner):this.dom.inner.innerHTML=void 0!==e&&null!==e?e:this.groupId||"";if(this.dom.label.title=t&&t.title||"",this.dom.inner.firstChild?r.removeClassName(this.dom.inner,"vis-hidden"):r.addClassName(this.dom.inner,"vis-hidden"),t&&t.nestedGroups){this.nestedGroups&&this.nestedGroups==t.nestedGroups||(this.nestedGroups=t.nestedGroups),void 0===t.showNested&&void 0!==this.showNested||(0==t.showNested?this.showNested=!1:this.showNested=!0),r.addClassName(this.dom.label,"vis-nesting-group");var o=this.itemSet.options.rtl?"collapsed-rtl":"collapsed";this.showNested?(r.removeClassName(this.dom.label,o),r.addClassName(this.dom.label,"expanded")):(r.removeClassName(this.dom.label,"expanded"),r.addClassName(this.dom.label,o))}else this.nestedGroups&&(this.nestedGroups=null,o=this.itemSet.options.rtl?"collapsed-rtl":"collapsed",r.removeClassName(this.dom.label,o),r.removeClassName(this.dom.label,"expanded"),r.removeClassName(this.dom.label,"vis-nesting-group"));t&&t.nestedInGroup&&(r.addClassName(this.dom.label,"vis-nested-group"),this.itemSet.options&&this.itemSet.options.rtl?this.dom.inner.style.paddingRight="30px":this.dom.inner.style.paddingLeft="30px");var n=t&&t.className||null;n!=this.className&&(this.className&&(r.removeClassName(this.dom.label,this.className),r.removeClassName(this.dom.foreground,this.className),r.removeClassName(this.dom.background,this.className),r.removeClassName(this.dom.axis,this.className)),r.addClassName(this.dom.label,n),r.addClassName(this.dom.foreground,n),r.addClassName(this.dom.background,n),r.addClassName(this.dom.axis,n),this.className=n),this.style&&(r.removeCssText(this.dom.label,this.style),this.style=null),t&&t.style&&(r.addCssText(this.dom.label,t.style),this.style=t.style)},o.prototype.getLabelWidth=function(){return this.props.label.width},o.prototype._didMarkerHeightChange=function(){var t=this.dom.marker.clientHeight;if(t!=this.lastMarkerHeight){this.lastMarkerHeight=t;var e={},i=0;r.forEach(this.items,function(t,o){if(t.dirty=!0,t.displayed){e[o]=t.redraw(!0),i=e[o].length}});if(i>0)for(var o=0;o0)for(var u=0;u0){var e=this;this.resetSubgroups(),r.forEach(this.visibleItems,function(i){void 0!==i.data.subgroup&&(e.subgroups[i.data.subgroup].height=Math.max(e.subgroups[i.data.subgroup].height,i.height+t.item.vertical),e.subgroups[i.data.subgroup].visible=!0)})}},o.prototype._isGroupVisible=function(t,e){return this.top<=t.body.domProps.centerContainer.height-t.body.domProps.scrollTop+e.axis&&this.top+this.height+e.axis>=-t.body.domProps.scrollTop},o.prototype._calculateHeight=function(t){var e,i=this.visibleItems;if(i.length>0){var o=i[0].top,n=i[0].top+i[0].height;if(r.forEach(i,function(t){o=Math.min(o,t.top),n=Math.max(n,t.top+t.height)}),o>t.axis){var s=o-t.axis;n-=s,r.forEach(i,function(t){t.top-=s})}e=n+t.item.vertical/2}else e=0;return e=Math.max(e,this.props.label.height)},o.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},o.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var o=this.dom.axis;o.parentNode&&o.parentNode.removeChild(o)},o.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),this.stackDirty=!0,void 0!==t.data.subgroup&&(this._addToSubgroup(t),this.orderSubgroups()),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},o.prototype._addToSubgroup=function(t,e){e=e||t.data.subgroup,void 0!=e&&void 0===this.subgroups[e]&&(this.subgroups[e]={height:0,top:0,start:t.data.start,end:t.data.end||t.data.start,visible:!1,index:this.subgroupIndex,items:[],stack:this.subgroupStackAll||this.subgroupStack[e]||!1},this.subgroupIndex++),new Date(t.data.start)new Date(this.subgroups[e].end)&&(this.subgroups[e].end=i),this.subgroups[e].items.push(t)},o.prototype._updateSubgroupsSizes=function(){var t=this;if(t.subgroups)for(var e in t.subgroups){var i=t.subgroups[e].items[0].data.end||t.subgroups[e].items[0].data.start,o=t.subgroups[e].items[0].data.start,n=i-1;t.subgroups[e].items.forEach(function(t){new Date(t.data.start)new Date(n)&&(n=e)}),t.subgroups[e].start=o,t.subgroups[e].end=new Date(n-1)}},o.prototype.orderSubgroups=function(){if(void 0!==this.subgroupOrderer){var t,e=[];if("string"==typeof this.subgroupOrderer){for(t in this.subgroups)e.push({subgroup:t,sortField:this.subgroups[t].items[0].data[this.subgroupOrderer]});e.sort(function(t,e){return t.sortField-e.sortField})}else if("function"==typeof this.subgroupOrderer){for(t in this.subgroups)e.push(this.subgroups[t].items[0].data);e.sort(this.subgroupOrderer)}if(e.length>0)for(var i=0;i=0&&(i.items.splice(o,1),i.items.length?this._updateSubgroupsSizes():delete this.subgroups[e])}}},o.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},o.prototype.order=function(){for(var t=r.toArray(this.items),e=[],i=[],o=0;o0)for(var l=0;lh}),1==this.checkRangedItems)for(this.checkRangedItems=!1,l=0;lh})}var p={},f=0;for(l=0;l0)for(var v=0;v=0&&(r=e[s],!n(r));s--)void 0===o[r.id]&&(o[r.id]=!0,i.push(r));for(s=t+1;st.start},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("div"),this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-item-overflow",this.dom.box.appendChild(this.dom.frame),this.dom.visibleFrame=document.createElement("div"),this.dom.visibleFrame.className="vis-item-visible-frame",this.dom.box.appendChild(this.dom.visibleFrame),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.frame.appendChild(this.dom.content),this.dom.box["timeline-item"]=this,this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.foreground;if(!t)throw new Error("Cannot redraw item: parent has no foreground container element");t.appendChild(this.dom.box)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var t=this.editable.updateTime||this.editable.updateGroup,e=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"")+(t?" vis-editable":" vis-readonly");this.dom.box.className=this.baseClassName+e,this.dom.content.style.maxWidth="none"}},o.prototype._getDomComponentsSizes=function(){return this.overflow="hidden"!==window.getComputedStyle(this.dom.frame).overflow,{content:{width:this.dom.content.offsetWidth},box:{height:this.dom.box.offsetHeight}}},o.prototype._updateDomComponentsSizes=function(t){this.props.content.width=t.content.width,this.height=t.box.height,this.dom.content.style.maxWidth="",this.dirty=!1},o.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.box),this._repaintDeleteButton(this.dom.box),this._repaintDragCenter(),this._repaintDragLeft(),this._repaintDragRight()},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes.bind(this)())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;return i.forEach(function(t){o=t()}),o},o.prototype.show=function(){this.displayed||this.redraw()},o.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.displayed=!1}},o.prototype.repositionX=function(t){var e,i,o=this.parent.width,n=this.conversion.toScreen(this.data.start),s=this.conversion.toScreen(this.data.end),r=void 0===this.data.align?this.options.align:this.data.align;!1===this.data.limitSize||void 0!==t&&!0!==t||(n<-o&&(n=-o),s>2*o&&(s=2*o));var a=Math.max(s-n+.5,1);switch(this.overflow?(this.options.rtl?this.right=n:this.left=n,this.width=a+this.props.content.width,i=this.props.content.width):(this.options.rtl?this.right=n:this.left=n,this.width=a,i=Math.min(s-n,this.props.content.width)),this.options.rtl?this.dom.box.style.right=this.right+"px":this.dom.box.style.left=this.left+"px",this.dom.box.style.width=a+"px",r){case"left":this.options.rtl?this.dom.content.style.right="0":this.dom.content.style.left="0";break;case"right":this.options.rtl?this.dom.content.style.right=Math.max(a-i,0)+"px":this.dom.content.style.left=Math.max(a-i,0)+"px";break;case"center":this.options.rtl?this.dom.content.style.right=Math.max((a-i)/2,0)+"px":this.dom.content.style.left=Math.max((a-i)/2,0)+"px";break;default:e=this.overflow?s>0?Math.max(-n,0):-i:n<0?-n:0,this.options.rtl?this.dom.content.style.right=e+"px":(this.dom.content.style.left=e+"px",this.dom.content.style.width="calc(100% - "+e+"px)")}},o.prototype.repositionY=function(){var t=this.options.orientation.item,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},o.prototype._repaintDragLeft=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="vis-drag-left",t.dragLeftItem=this,this.dom.box.appendChild(t),this.dom.dragLeft=t}else this.selected||this.options.itemsAlwaysDraggable.range||!this.dom.dragLeft||(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},o.prototype._repaintDragRight=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="vis-drag-right",t.dragRightItem=this,this.dom.box.appendChild(t),this.dom.dragRight=t}else this.selected||this.options.itemsAlwaysDraggable.range||!this.dom.dragRight||(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(179).default,f=function(){function t(e,i,o){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;(0,d.default)(this,t),this.parent=e,this.changedOptions=[],this.container=i,this.allowCreation=!1,this.options={},this.initialized=!1,this.popupCounter=0,this.defaultOptions={enabled:!1,filter:!0,container:void 0,showButton:!0},c.extend(this.options,this.defaultOptions),this.configureOptions=o,this.moduleOptions={},this.domElements=[],this.popupDiv={},this.popupLimit=5,this.popupHistory={},this.colorPicker=new p(n),this.wrapper=void 0}return(0,u.default)(t,[{key:"setOptions",value:function(t){if(void 0!==t){this.popupHistory={},this._removePopup();var e=!0;"string"==typeof t?this.options.filter=t:t instanceof Array?this.options.filter=t.join():"object"===(void 0===t?"undefined":(0,a.default)(t))?(void 0!==t.container&&(this.options.container=t.container),void 0!==t.filter&&(this.options.filter=t.filter),void 0!==t.showButton&&(this.options.showButton=t.showButton),void 0!==t.enabled&&(e=t.enabled)):"boolean"==typeof t?(this.options.filter=!0,e=t):"function"==typeof t&&(this.options.filter=t,e=!0),!1===this.options.filter&&(e=!1),this.options.enabled=e}this._clean()}},{key:"setModuleOptions",value:function(t){this.moduleOptions=t,!0===this.options.enabled&&(this._clean(),void 0!==this.options.container&&(this.container=this.options.container),this._create())}},{key:"_create",value:function(){var t=this;this._clean(),this.changedOptions=[];var e=this.options.filter,i=0,o=!1;for(var n in this.configureOptions)this.configureOptions.hasOwnProperty(n)&&(this.allowCreation=!1,o=!1,"function"==typeof e?(o=e(n,[]),o=o||this._handleObject(this.configureOptions[n],[n],!0)):!0!==e&&-1===e.indexOf(n)||(o=!0),!1!==o&&(this.allowCreation=!0,i>0&&this._makeItem([]),this._makeHeader(n),this._handleObject(this.configureOptions[n],[n])),i++);if(!0===this.options.showButton){var s=document.createElement("div");s.className="vis-configuration vis-config-button",s.innerHTML="generate options",s.onclick=function(){t._printOptions()},s.onmouseover=function(){s.className="vis-configuration vis-config-button hover"},s.onmouseout=function(){s.className="vis-configuration vis-config-button"},this.optionsContainer=document.createElement("div"),this.optionsContainer.className="vis-configuration vis-config-option-container",this.domElements.push(this.optionsContainer),this.domElements.push(s)}this._push()}},{key:"_push",value:function(){this.wrapper=document.createElement("div"),this.wrapper.className="vis-configuration-wrapper",this.container.appendChild(this.wrapper);for(var t=0;t1?i-1:0),n=1;n2&&void 0!==arguments[2]&&arguments[2],o=document.createElement("div");return o.className="vis-configuration vis-config-label vis-config-s"+e.length,o.innerHTML=!0===i?""+t+":":t+":",o}},{key:"_makeDropdown",value:function(t,e,i){var o=document.createElement("select");o.className="vis-configuration vis-config-select";var n=0;void 0!==e&&-1!==t.indexOf(e)&&(n=t.indexOf(e));for(var s=0;ss&&1!==s&&(a.max=Math.ceil(1.2*e),d=a.max,h="range increased"),a.value=e}else a.value=o;var l=document.createElement("input");l.className="vis-configuration vis-config-rangeinput",l.value=a.value;var u=this;a.onchange=function(){l.value=this.value,u._update(Number(this.value),i)},a.oninput=function(){l.value=this.value};var c=this._makeLabel(i[i.length-1],i),p=this._makeItem(i,c,a,l);""!==h&&this.popupHistory[p]!==d&&(this.popupHistory[p]=d,this._setupPopup(h,p))}},{key:"_setupPopup",value:function(t,e){var i=this;if(!0===this.initialized&&!0===this.allowCreation&&this.popupCounter1&&void 0!==arguments[1]?arguments[1]:[],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=!1,n=this.options.filter,s=!1;for(var r in t)if(t.hasOwnProperty(r)){o=!0;var a=t[r],h=c.copyAndExtendArray(e,r);if("function"==typeof n&&!1===(o=n(r,e))&&!(a instanceof Array)&&"string"!=typeof a&&"boolean"!=typeof a&&a instanceof Object&&(this.allowCreation=!1,o=this._handleObject(a,h,!0),this.allowCreation=!1===i),!1!==o){s=!0;var d=this._getValue(h);if(a instanceof Array)this._handleArray(a,d,h);else if("string"==typeof a)this._makeTextInput(a,d,h);else if("boolean"==typeof a)this._makeCheckbox(a,d,h);else if(a instanceof Object){var l=!0;if(-1!==e.indexOf("physics")&&this.moduleOptions.physics.solver!==r&&(l=!1),!0===l)if(void 0!==a.enabled){var u=c.copyAndExtendArray(h,"enabled"),p=this._getValue(u);if(!0===p){var f=this._makeLabel(r,h,!0);this._makeItem(h,f),s=this._handleObject(a,h)||s}else this._makeCheckbox(a,p,h)}else{var m=this._makeLabel(r,h,!0);this._makeItem(h,m),s=this._handleObject(a,h)||s}}else console.error("dont know how to handle",a,r,h)}}return s}},{key:"_handleArray",value:function(t,e,i){"string"==typeof t[0]&&"color"===t[0]?(this._makeColorField(t,e,i),t[1]!==e&&this.changedOptions.push({path:i,value:e})):"string"==typeof t[0]?(this._makeDropdown(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:e})):"number"==typeof t[0]&&(this._makeRange(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:Number(e)}))}},{key:"_update",value:function(t,e){var i=this._constructOptions(t,e);this.parent.body&&this.parent.body.emitter&&this.parent.body.emitter.emit&&this.parent.body.emitter.emit("configChange",i),this.initialized=!0,this.parent.setOptions(i)}},{key:"_constructOptions",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=i;t="true"===t||t,t="false"!==t&&t;for(var n=0;nvar options = "+(0,s.default)(t,null,2)+""}},{key:"getOptions",value:function(){for(var t={},e=0;ethis.imageObj.height?i=this.imageObj.width/this.imageObj.height:o=this.imageObj.height/this.imageObj.width),t=2*this.options.size*i,e=2*this.options.size*o}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.radius=.5*this.width}},{key:"_drawRawCircle",value:function(t,e,i,o){this.initContextForDraw(t,o),t.circle(e,i,o.size),this.performFill(t,o)}},{key:"_drawImageAtPosition",value:function(t,e){if(0!=this.imageObj.width){t.globalAlpha=1,this.enableShadow(t,e);var i=1;!0===this.options.shapeProperties.interpolation&&(i=this.imageObj.width/this.width/this.body.view.scale),this.imageObj.drawImageAtPosition(t,i,this.left,this.top,this.width,this.height),this.disableShadow(t,e)}}},{key:"_drawImageLabel",value:function(t,e,i,o,n){var s,r=0;if(void 0!==this.height){r=.5*this.height;var a=this.labelModule.getTextSize(t,o,n);a.lineCount>=1&&(r+=a.height/2)}s=i+r,this.options.label&&(this.labelOffset=r),this.labelModule.draw(t,e,s,o,n,"hanging")}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(6),a=o(r),h=i(29),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(117).default,v=i(48).default,g=i(215).default,y=i(217).default,b=i(218).default,_=i(219).default,w=function(){function t(e,i,o,n){if((0,u.default)(this,t),void 0===i)throw new Error("No body provided");this.options=f.bridgeObject(o),this.globalOptions=o,this.defaultOptions=n,this.body=i,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.selected=!1,this.hover=!1,this.labelDirty=!0,this.baseWidth=this.options.width,this.baseFontSize=this.options.font.size,this.from=void 0,this.to=void 0,this.edgeType=void 0,this.connected=!1,this.labelModule=new m(this.body,this.options,!0),this.setOptions(e)}return(0,p.default)(t,[{key:"setOptions",value:function(e){if(e){t.parseOptions(this.options,e,!0,this.globalOptions),void 0!==e.id&&(this.id=e.id),void 0!==e.from&&(this.fromId=e.from),void 0!==e.to&&(this.toId=e.to),void 0!==e.title&&(this.title=e.title),void 0!==e.value&&(e.value=parseFloat(e.value));var i=[e,this.options,this.defaultOptions];this.chooser=v.choosify("edge",i),this.updateLabelModule(e);var o=this.updateEdgeType();return this._setInteractionWidths(),this.connect(),void 0===e.hidden&&void 0===e.physics||(o=!0),o}}},{key:"getFormattingValues",value:function(){var t=!0===this.options.arrows.to||!0===this.options.arrows.to.enabled,e=!0===this.options.arrows.from||!0===this.options.arrows.from.enabled,i=!0===this.options.arrows.middle||!0===this.options.arrows.middle.enabled,o=this.options.color.inherit,n={toArrow:t,toArrowScale:this.options.arrows.to.scaleFactor,toArrowType:this.options.arrows.to.type,middleArrow:i,middleArrowScale:this.options.arrows.middle.scaleFactor,middleArrowType:this.options.arrows.middle.type,fromArrow:e,fromArrowScale:this.options.arrows.from.scaleFactor,fromArrowType:this.options.arrows.from.type,arrowStrikethrough:this.options.arrowStrikethrough,color:o?void 0:this.options.color.color,inheritsColor:o,opacity:this.options.color.opacity,hidden:this.options.hidden,length:this.options.length,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y,dashes:this.options.dashes,width:this.options.width};if(this.selected||this.hover)if(!0===this.chooser){if(this.selected){var s=this.options.selectionWidth;"function"==typeof s?n.width=s(n.width):"number"==typeof s&&(n.width+=s),n.width=Math.max(n.width,.3/this.body.view.scale),n.color=this.options.color.highlight,n.shadow=this.options.shadow.enabled}else if(this.hover){var r=this.options.hoverWidth;"function"==typeof r?n.width=r(n.width):"number"==typeof r&&(n.width+=r),n.width=Math.max(n.width,.3/this.body.view.scale),n.color=this.options.color.hover,n.shadow=this.options.shadow.enabled}}else"function"==typeof this.chooser&&(this.chooser(n,this.options.id,this.selected,this.hover),void 0!==n.color&&(n.inheritsColor=!1),!1===n.shadow&&(n.shadowColor===this.options.shadow.color&&n.shadowSize===this.options.shadow.size&&n.shadowX===this.options.shadow.x&&n.shadowY===this.options.shadow.y||(n.shadow=!0)));else n.shadow=this.options.shadow.enabled,n.width=Math.max(n.width,.3/this.body.view.scale);return n}},{key:"updateLabelModule",value:function(t){var e=[t,this.options,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,e),void 0!==this.labelModule.baseSize&&(this.baseFontSize=this.labelModule.baseSize)}},{key:"updateEdgeType",value:function(){var t=this.options.smooth,e=!1,i=!0;return void 0!==this.edgeType&&((this.edgeType instanceof y&&!0===t.enabled&&"dynamic"===t.type||this.edgeType instanceof g&&!0===t.enabled&&"cubicBezier"===t.type||this.edgeType instanceof b&&!0===t.enabled&&"dynamic"!==t.type&&"cubicBezier"!==t.type||this.edgeType instanceof _&&!1===t.type.enabled)&&(i=!1),!0===i&&(e=this.cleanup())),!0===i?!0===t.enabled?"dynamic"===t.type?(e=!0,this.edgeType=new y(this.options,this.body,this.labelModule)):"cubicBezier"===t.type?this.edgeType=new g(this.options,this.body,this.labelModule):this.edgeType=new b(this.options,this.body,this.labelModule):this.edgeType=new _(this.options,this.body,this.labelModule):this.edgeType.setOptions(this.options),e}},{key:"connect",value:function(){this.disconnect(),this.from=this.body.nodes[this.fromId]||void 0,this.to=this.body.nodes[this.toId]||void 0,this.connected=void 0!==this.from&&void 0!==this.to,!0===this.connected?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this)),this.edgeType.connect()}},{key:"disconnect",value:function(){this.from&&(this.from.detachEdge(this),this.from=void 0),this.to&&(this.to.detachEdge(this),this.to=void 0),this.connected=!1}},{key:"getTitle",value:function(){return this.title}},{key:"isSelected",value:function(){return this.selected}},{key:"getValue",value:function(){return this.options.value}},{key:"setValueRange",value:function(t,e,i){if(void 0!==this.options.value){var o=this.options.scaling.customScalingFunction(t,e,i,this.options.value),n=this.options.scaling.max-this.options.scaling.min;if(!0===this.options.scaling.label.enabled){var s=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+o*s}this.options.width=this.options.scaling.min+o*n}else this.options.width=this.baseWidth,this.options.font.size=this.baseFontSize;this._setInteractionWidths(),this.updateLabelModule()}},{key:"_setInteractionWidths",value:function(){"function"==typeof this.options.hoverWidth?this.edgeType.hoverWidth=this.options.hoverWidth(this.options.width):this.edgeType.hoverWidth=this.options.hoverWidth+this.options.width,"function"==typeof this.options.selectionWidth?this.edgeType.selectionWidth=this.options.selectionWidth(this.options.width):this.edgeType.selectionWidth=this.options.selectionWidth+this.options.width}},{key:"draw",value:function(t){var e=this.getFormattingValues();if(!e.hidden){var i=this.edgeType.getViaNode(),o={};this.edgeType.fromPoint=this.edgeType.from,this.edgeType.toPoint=this.edgeType.to,e.fromArrow&&(o.from=this.edgeType.getArrowData(t,"from",i,this.selected,this.hover,e),!1===e.arrowStrikethrough&&(this.edgeType.fromPoint=o.from.core)),e.toArrow&&(o.to=this.edgeType.getArrowData(t,"to",i,this.selected,this.hover,e),!1===e.arrowStrikethrough&&(this.edgeType.toPoint=o.to.core)),e.middleArrow&&(o.middle=this.edgeType.getArrowData(t,"middle",i,this.selected,this.hover,e)),this.edgeType.drawLine(t,e,this.selected,this.hover,i),this.drawArrows(t,o,e),this.drawLabel(t,i)}}},{key:"drawArrows",value:function(t,e,i){i.fromArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.from),i.middleArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.middle),i.toArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.to)}},{key:"drawLabel",value:function(t,e){if(void 0!==this.options.label){var i=this.from,o=this.to;if(this.labelModule.differentState(this.selected,this.hover)&&this.labelModule.getTextSize(t,this.selected,this.hover),i.id!=o.id){this.labelModule.pointToSelf=!1;var n=this.edgeType.getPoint(.5,e);t.save();var s=this._getRotation(t);0!=s.angle&&(t.translate(s.x,s.y),t.rotate(s.angle)),this.labelModule.draw(t,n.x,n.y,this.selected,this.hover),t.restore()}else{this.labelModule.pointToSelf=!0;var r,a,h=this.options.selfReferenceSize;i.shape.width>i.shape.height?(r=i.x+.5*i.shape.width,a=i.y-h):(r=i.x+h,a=i.y-.5*i.shape.height),n=this._pointOnCircle(r,a,h,.125),this.labelModule.draw(t,n.x,n.y,this.selected,this.hover)}}}},{key:"getItemsOnPoint",value:function(t){var e=[];if(this.labelModule.visible()){var i=this._getRotation();v.pointInRect(this.labelModule.getSize(),t,i)&&e.push({edgeId:this.id,labelId:0})}var o={left:t.x,top:t.y};return this.isOverlappingWith(o)&&e.push({edgeId:this.id}),e}},{key:"isOverlappingWith",value:function(t){if(this.connected){var e=this.from.x,i=this.from.y,o=this.to.x,n=this.to.y,s=t.left,r=t.top;return this.edgeType.getDistanceToEdge(e,i,o,n,s,r)<10}return!1}},{key:"_getRotation",value:function(t){var e=this.edgeType.getViaNode(),i=this.edgeType.getPoint(.5,e);void 0!==t&&this.labelModule.calculateLabelSize(t,this.selected,this.hover,i.x,i.y);var o={x:i.x,y:this.labelModule.size.yLine,angle:0};if(!this.labelModule.visible())return o;if("horizontal"===this.options.font.align)return o;var n=this.from.y-this.to.y,s=this.from.x-this.to.x,r=Math.atan2(n,s);return(r<-1&&s<0||r>0&&s<0)&&(r+=Math.PI),o.angle=r,o}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"select",value:function(){this.selected=!0}},{key:"unselect",value:function(){this.selected=!1}},{key:"cleanup",value:function(){return this.edgeType.cleanup()}},{key:"remove",value:function(){this.cleanup(),this.disconnect(),delete this.body.edges[this.id]}},{key:"endPointsValid",value:function(){return void 0!==this.body.nodes[this.fromId]&&void 0!==this.body.nodes[this.toId]}}],[{key:"parseOptions",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r=["arrowStrikethrough","id","from","hidden","hoverWidth","labelHighlightBold","length","line","opacity","physics","scaling","selectionWidth","selfReferenceSize","to","title","value","width","font","chosen","widthConstraint"];if(f.selectiveDeepExtend(r,t,e,i),v.isValidLabel(e.label)?t.label=e.label:t.label=void 0,f.mergeOptions(t,e,"smooth",o),f.mergeOptions(t,e,"shadow",o),void 0!==e.dashes&&null!==e.dashes?t.dashes=e.dashes:!0===i&&null===e.dashes&&(t.dashes=(0,d.default)(o.dashes)),void 0!==e.scaling&&null!==e.scaling?(void 0!==e.scaling.min&&(t.scaling.min=e.scaling.min),void 0!==e.scaling.max&&(t.scaling.max=e.scaling.max),f.mergeOptions(t.scaling,e.scaling,"label",o.scaling)):!0===i&&null===e.scaling&&(t.scaling=(0,d.default)(o.scaling)),void 0!==e.arrows&&null!==e.arrows)if("string"==typeof e.arrows){var h=e.arrows.toLowerCase();t.arrows.to.enabled=-1!=h.indexOf("to"),t.arrows.middle.enabled=-1!=h.indexOf("middle"),t.arrows.from.enabled=-1!=h.indexOf("from")}else{if("object"!==(0,a.default)(e.arrows))throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:"+(0,s.default)(e.arrows));f.mergeOptions(t.arrows,e.arrows,"to",o.arrows),f.mergeOptions(t.arrows,e.arrows,"middle",o.arrows),f.mergeOptions(t.arrows,e.arrows,"from",o.arrows)}else!0===i&&null===e.arrows&&(t.arrows=(0,d.default)(o.arrows));if(void 0!==e.color&&null!==e.color){var l=e.color,u=t.color;if(n)f.deepExtend(u,o.color,!1,i);else for(var c in u)u.hasOwnProperty(c)&&delete u[c];if(f.isString(u))u.color=u,u.highlight=u,u.hover=u,u.inherit=!1,void 0===l.opacity&&(u.opacity=1);else{var p=!1;void 0!==l.color&&(u.color=l.color,p=!0),void 0!==l.highlight&&(u.highlight=l.highlight,p=!0),void 0!==l.hover&&(u.hover=l.hover,p=!0),void 0!==l.inherit&&(u.inherit=l.inherit),void 0!==l.opacity&&(u.opacity=Math.min(1,Math.max(0,l.opacity))),!0===p?u.inherit=!1:void 0===u.inherit&&(u.inherit="from")}}else!0===i&&null===e.color&&(t.color=f.bridgeObject(o.color));!0===i&&null===e.font&&(t.font=f.bridgeObject(o.font))}}]),t}();e.default=w},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(118),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_findBorderPositionBezier",value:function(t,e){var i,o,n,s,r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this._getViaCoordinates(),h=0,d=0,l=1,u=this.to,c=!1;for(t.id===this.from.id&&(u=this.from,c=!0);d<=l&&h<10;){var p=.5*(d+l);if(i=this.getPoint(p,a),o=Math.atan2(u.y-i.y,u.x-i.x),n=u.distanceToBorder(e,o),s=Math.sqrt(Math.pow(i.x-u.x,2)+Math.pow(i.y-u.y,2)),r=n-s,Math.abs(r)<.2)break;r<0?!1===c?d=p:l=p:!1===c?l=p:d=p,h++}return i.t=p,i}},{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r){var a=1e9,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0,p=t,f=e;for(d=1;d<10;d++)l=.1*d,u=Math.pow(1-l,2)*t+2*l*(1-l)*r.x+Math.pow(l,2)*i,c=Math.pow(1-l,2)*e+2*l*(1-l)*r.y+Math.pow(l,2)*o,d>0&&(h=this._getDistanceToLine(p,f,u,c,n,s),a=h1&&void 0!==arguments[1]?arguments[1]:[],o=1e9,n=-1e9,s=1e9,r=-1e9;if(i.length>0)for(var a=0;ae.shape.boundingBox.left&&(s=e.shape.boundingBox.left),re.shape.boundingBox.top&&(o=e.shape.boundingBox.top),n1&&void 0!==arguments[1]?arguments[1]:[],o=1e9,n=-1e9,s=1e9,r=-1e9;if(i.length>0)for(var a=0;ae.x&&(s=e.x),re.y&&(o=e.y),nh;)o(a,i=e[h++])&&(~s(d,i)||d.push(i));return d}},function(t,e,i){var o=i(22),n=i(41),s=i(56)("IE_PROTO"),r=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=n(t),o(t,s)?t[s]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?r:null}},function(t,e,i){var o=i(50),n=i(13)("toStringTag"),s="Arguments"==o(function(){return arguments}()),r=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,i,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(i=r(e=Object(t),n))?i:s?o(e):"Object"==(a=o(e))&&"function"==typeof e.callee?"Arguments":a}},function(t,e,i){var o=i(17),n=i(7),s=i(28);t.exports=function(t,e){var i=(n.Object||{})[t]||Object[t],r={};r[t]=e(i),o(o.S+o.F*s(function(){i(1)}),"Object",r)}},function(t,e,i){var o=i(84),n=i(58).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return o(t,n)}},function(t,e,i){var o=i(42),n=i(39),s=i(25),r=i(53),a=i(22),h=i(81),d=Object.getOwnPropertyDescriptor;e.f=i(21)?d:function(t,e){if(t=s(t),e=r(e,!0),h)try{return d(t,e)}catch(t){}if(a(t,e))return n(!o.f.call(t,e),t[e])}},function(t,e,i){t.exports={default:i(162),__esModule:!0}},function(t,e,i){function o(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0}t.exports=o},function(t,e,i){function o(t,e){if(void 0===t)throw new Error("No container element defined");if(this.container=t,this.visible=!e||void 0==e.visible||e.visible,this.visible){this.frame=document.createElement("DIV"),this.frame.style.width="100%",this.frame.style.position="relative",this.container.appendChild(this.frame),this.frame.prev=document.createElement("INPUT"),this.frame.prev.type="BUTTON",this.frame.prev.value="Prev",this.frame.appendChild(this.frame.prev),this.frame.play=document.createElement("INPUT"),this.frame.play.type="BUTTON",this.frame.play.value="Play",this.frame.appendChild(this.frame.play),this.frame.next=document.createElement("INPUT"),this.frame.next.type="BUTTON",this.frame.next.value="Next",this.frame.appendChild(this.frame.next),this.frame.bar=document.createElement("INPUT"),this.frame.bar.type="BUTTON",this.frame.bar.style.position="absolute",this.frame.bar.style.border="1px solid red",this.frame.bar.style.width="100px",this.frame.bar.style.height="6px",this.frame.bar.style.borderRadius="2px",this.frame.bar.style.MozBorderRadius="2px",this.frame.bar.style.border="1px solid #7F7F7F",this.frame.bar.style.backgroundColor="#E5E5E5",this.frame.appendChild(this.frame.bar),this.frame.slide=document.createElement("INPUT"),this.frame.slide.type="BUTTON",this.frame.slide.style.margin="0px",this.frame.slide.value=" ",this.frame.slide.style.position="relative",this.frame.slide.style.left="-100px",this.frame.appendChild(this.frame.slide);var i=this;this.frame.slide.onmousedown=function(t){i._onMouseDown(t)},this.frame.prev.onclick=function(t){i.prev(t)},this.frame.play.onclick=function(t){i.togglePlay(t)},this.frame.next.onclick=function(t){i.next(t)}}this.onChangeCallback=void 0,this.values=[],this.index=void 0,this.playTimeout=void 0,this.playInterval=1e3,this.playLoop=!0}var n=i(2);o.prototype.prev=function(){var t=this.getIndex();t>0&&(t--,this.setIndex(t))},o.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},o.prototype.setIndex=function(t){if(!(tthis.values.length-1&&(o=this.values.length-1),o},o.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10;return t/(this.values.length-1)*e+3},o.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,o=this.leftToIndex(i);this.setIndex(o),n.preventDefault()},o.prototype._onMouseUp=function(t){this.frame.style.cursor="auto",n.removeEventListener(document,"mousemove",this.onmousemove),n.removeEventListener(document,"mouseup",this.onmouseup),n.preventDefault()},t.exports=o},function(t,e,i){function o(t,e,i,o){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,o)}o.prototype.isNumeric=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.prototype.setRange=function(t,e,i,o){if(!this.isNumeric(t))throw new Error("Parameter 'start' is not numeric; value: "+t);if(!this.isNumeric(e))throw new Error("Parameter 'end' is not numeric; value: "+t);if(!this.isNumeric(i))throw new Error("Parameter 'step' is not numeric; value: "+t);this._start=t||0,this._end=e||0,this.setStep(i,o)},o.prototype.setStep=function(t,e){void 0===t||t<=0||(void 0!==e&&(this.prettyStep=e),!0===this.prettyStep?this._step=o.calculatePrettyStep(t):this._step=t)},o.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),o=2*Math.pow(10,Math.round(e(t/2))),n=5*Math.pow(10,Math.round(e(t/5))),s=i;return Math.abs(o-t)<=Math.abs(s-t)&&(s=o),Math.abs(n-t)<=Math.abs(s-t)&&(s=n),s<=0&&(s=1),s},o.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},o.prototype.getStep=function(){return this._step},o.prototype.start=function(t){void 0===t&&(t=!1),this._current=this._start-this._start%this._step,t&&this.getCurrent()this._end},t.exports=o},function(t,e,i){function o(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}function n(t){return void 0===t||""===t||"string"!=typeof t?t:t.charAt(0).toUpperCase()+t.slice(1)}function s(t,e){return void 0===t||""===t?e:t+n(e)}function r(t,e,i,o){for(var n,r,a=0;ar&&(t=o(t)*r),i(e)>r&&(e=o(e)*r),this.cameraOffset.x=t,this.cameraOffset.y=e,this.calculateCameraOrientation()},o.prototype.getOffset=function(){return this.cameraOffset},o.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},o.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),void 0===t&&void 0===e||this.calculateCameraOrientation()},o.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},o.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.setOffset(this.cameraOffset.x,this.cameraOffset.y),this.calculateCameraOrientation())}, @@ -36,12 +36,12 @@ value:function(t,e,i,o,n){this.enableShadow(t,e),t.beginPath(),t.arc(i,o,n,0,2*M ;for(var a in arguments[0])n+=a+": "+arguments[0][a]+", ";n=n.slice(0,-2)}else n=arguments[r];s.push(n)}x(t+"\nArguments: "+Array.prototype.slice.call(s).join("")+"\n"+(new Error).stack),o=!1}return i.apply(this,arguments)},i)}function S(t,i){null!=e.deprecationHandler&&e.deprecationHandler(t,i),Po[t]||(x(i),Po[t]=!0)}function D(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function M(t){var e,i;for(i in t)e=t[i],D(e)?this[i]=e:this["_"+i]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function C(t,e){var i,n=l({},t);for(i in e)d(e,i)&&(o(t[i])&&o(e[i])?(n[i]={},l(n[i],t[i]),l(n[i],e[i])):null!=e[i]?n[i]=e[i]:delete n[i]);for(i in t)d(t,i)&&!d(e,i)&&o(t[i])&&(n[i]=l({},n[i]));return n}function O(t){null!=t&&this.set(t)}function E(t,e,i){var o=this._calendar[t]||this._calendar.sameElse;return D(o)?o.call(e,i):o}function T(t){var e=this._longDateFormat[t],i=this._longDateFormat[t.toUpperCase()];return e||!i?e:(this._longDateFormat[t]=i.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])}function P(){return this._invalidDate}function I(t){return this._ordinal.replace("%d",t)}function N(t,e,i,o){var n=this._relativeTime[i];return D(n)?n(t,e,i,o):n.replace(/%d/i,t)}function R(t,e){var i=this._relativeTime[t>0?"future":"past"];return D(i)?i(e):i.replace(/%s/i,e)}function A(t,e){var i=t.toLowerCase();Lo[i]=Lo[i+"s"]=Lo[e]=t}function z(t){return"string"==typeof t?Lo[t]||Lo[t.toLowerCase()]:void 0}function L(t){var e,i,o={};for(i in t)d(t,i)&&(e=z(i))&&(o[e]=t[i]);return o}function F(t,e){Fo[t]=e}function B(t){var e=[];for(var i in t)e.push({unit:i,priority:Fo[i]});return e.sort(function(t,e){return t.priority-e.priority}),e}function j(t,e,i){var o=""+Math.abs(t),n=e-o.length;return(t>=0?i?"+":"":"-")+Math.pow(10,Math.max(0,n)).toString().substr(1)+o}function H(t,e,i,o){var n=o;"string"==typeof o&&(n=function(){return this[o]()}),t&&(Wo[t]=n),e&&(Wo[e[0]]=function(){return j(n.apply(this,arguments),e[1],e[2])}),i&&(Wo[i]=function(){return this.localeData().ordinal(n.apply(this,arguments),t)})}function W(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function Y(t){var e,i,o=t.match(Bo);for(e=0,i=o.length;e=0&&jo.test(t);)t=t.replace(jo,i),jo.lastIndex=0,o-=1;return t}function U(t,e,i){an[t]=D(e)?e:function(t,o){return t&&i?i:e}}function q(t,e){return d(an,t)?an[t](e._strict,e._locale):new RegExp(X(t))}function X(t){return Z(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,o,n){return e||i||o||n}))}function Z(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function K(t,e){var i,o=e;for("string"==typeof t&&(t=[t]),r(e)&&(o=function(t,i){i[e]=_(t)}),i=0;i=0&&isFinite(a.getFullYear())&&a.setFullYear(t),a}function _t(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function wt(t,e,i){var o=7+e-i;return-(7+_t(t,0,o).getUTCDay()-e)%7+o-1}function xt(t,e,i,o,n){var s,r,a=(7+i-o)%7,h=wt(t,o,n),d=1+7*(e-1)+a+h;return d<=0?(s=t-1,r=Q(s)+d):d>Q(t)?(s=t+1,r=d-Q(t)):(s=t,r=d),{year:s,dayOfYear:r}}function kt(t,e,i){var o,n,s=wt(t.year(),e,i),r=Math.floor((t.dayOfYear()-s-1)/7)+1;return r<1?(n=t.year()-1,o=r+St(n,e,i)):r>St(t.year(),e,i)?(o=r-St(t.year(),e,i),n=t.year()+1):(n=t.year(),o=r),{week:o,year:n}}function St(t,e,i){var o=wt(t,e,i),n=wt(t+1,e,i);return(Q(t)-o+n)/7}function Dt(t){return kt(t,this._week.dow,this._week.doy).week}function Mt(){return this._week.dow}function Ct(){return this._week.doy}function Ot(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Et(t){var e=kt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function Tt(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function Pt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function It(t,e){return t?i(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:i(this._weekdays)?this._weekdays:this._weekdays.standalone}function Nt(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function Rt(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function At(t,e,i){var o,n,s,r=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],o=0;o<7;++o)s=u([2e3,1]).day(o),this._minWeekdaysParse[o]=this.weekdaysMin(s,"").toLocaleLowerCase(),this._shortWeekdaysParse[o]=this.weekdaysShort(s,"").toLocaleLowerCase(),this._weekdaysParse[o]=this.weekdays(s,"").toLocaleLowerCase();return i?"dddd"===e?(n=yn.call(this._weekdaysParse,r),-1!==n?n:null):"ddd"===e?(n=yn.call(this._shortWeekdaysParse,r),-1!==n?n:null):(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):"dddd"===e?-1!==(n=yn.call(this._weekdaysParse,r))?n:-1!==(n=yn.call(this._shortWeekdaysParse,r))?n:(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):"ddd"===e?-1!==(n=yn.call(this._shortWeekdaysParse,r))?n:-1!==(n=yn.call(this._weekdaysParse,r))?n:(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):-1!==(n=yn.call(this._minWeekdaysParse,r))?n:-1!==(n=yn.call(this._weekdaysParse,r))?n:(n=yn.call(this._shortWeekdaysParse,r),-1!==n?n:null)}function zt(t,e,i){var o,n,s;if(this._weekdaysParseExact)return At.call(this,t,e,i);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),o=0;o<7;o++){if(n=u([2e3,1]).day(o),i&&!this._fullWeekdaysParse[o]&&(this._fullWeekdaysParse[o]=new RegExp("^"+this.weekdays(n,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[o]=new RegExp("^"+this.weekdaysShort(n,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[o]=new RegExp("^"+this.weekdaysMin(n,"").replace(".",".?")+"$","i")),this._weekdaysParse[o]||(s="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[o]=new RegExp(s.replace(".",""),"i")),i&&"dddd"===e&&this._fullWeekdaysParse[o].test(t))return o;if(i&&"ddd"===e&&this._shortWeekdaysParse[o].test(t))return o;if(i&&"dd"===e&&this._minWeekdaysParse[o].test(t))return o;if(!i&&this._weekdaysParse[o].test(t))return o}}function Lt(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=Tt(t,this.localeData()),this.add(t-e,"d")):e}function Ft(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Bt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=Pt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function jt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=En),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ht(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Tn),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Wt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Pn),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Yt(){function t(t,e){return e.length-t.length}var e,i,o,n,s,r=[],a=[],h=[],d=[];for(e=0;e<7;e++)i=u([2e3,1]).day(e),o=this.weekdaysMin(i,""),n=this.weekdaysShort(i,""),s=this.weekdays(i,""),r.push(o),a.push(n),h.push(s),d.push(o),d.push(n),d.push(s);for(r.sort(t),a.sort(t),h.sort(t),d.sort(t),e=0;e<7;e++)a[e]=Z(a[e]),h[e]=Z(h[e]),d[e]=Z(d[e]);this._weekdaysRegex=new RegExp("^("+d.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function Gt(){return this.hours()%12||12}function Vt(){return this.hours()||24}function Ut(t,e){H(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Zt(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"}function Kt(t){return t?t.toLowerCase().replace("_","-"):t}function Jt(t){for(var e,i,o,n,s=0;s0;){if(o=$t(n.slice(0,e).join("-")))return o;if(i&&i.length>=e&&w(n,i,!0)>=e-1)break;e--}s++}return null}function $t(e){var i=null;if(!zn[e]&&void 0!==t&&t&&t.exports)try{i=In._abbr;!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),Qt(i)}catch(t){}return zn[e]}function Qt(t,e){var i;return t&&(i=s(e)?ie(t):te(t,e))&&(In=i),In._abbr}function te(t,e){if(null!==e){var i=An;if(e.abbr=t,null!=zn[t])S("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=zn[t]._config;else if(null!=e.parentLocale){if(null==zn[e.parentLocale])return Ln[e.parentLocale]||(Ln[e.parentLocale]=[]),Ln[e.parentLocale].push({name:t,config:e}),null;i=zn[e.parentLocale]._config}return zn[t]=new O(C(i,e)),Ln[t]&&Ln[t].forEach(function(t){te(t.name,t.config)}),Qt(t),zn[t]}return delete zn[t],null}function ee(t,e){if(null!=e){var i,o=An;null!=zn[t]&&(o=zn[t]._config),e=C(o,e),i=new O(e),i.parentLocale=zn[t],zn[t]=i,Qt(t)}else null!=zn[t]&&(null!=zn[t].parentLocale?zn[t]=zn[t].parentLocale:null!=zn[t]&&delete zn[t]);return zn[t]}function ie(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return In;if(!i(t)){if(e=$t(t))return e;t=[t]}return Jt(t)}function oe(){return Io(zn)}function ne(t){var e,i=t._a;return i&&-2===p(t).overflow&&(e=i[ln]<0||i[ln]>11?ln:i[un]<1||i[un]>ht(i[dn],i[ln])?un:i[cn]<0||i[cn]>24||24===i[cn]&&(0!==i[pn]||0!==i[fn]||0!==i[mn])?cn:i[pn]<0||i[pn]>59?pn:i[fn]<0||i[fn]>59?fn:i[mn]<0||i[mn]>999?mn:-1,p(t)._overflowDayOfYear&&(eun)&&(e=un),p(t)._overflowWeeks&&-1===e&&(e=vn),p(t)._overflowWeekday&&-1===e&&(e=gn),p(t).overflow=e),t}function se(t,e,i){return null!=t?t:null!=e?e:i}function re(t){var i=new Date(e.now());return t._useUTC?[i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate()]:[i.getFullYear(),i.getMonth(),i.getDate()]}function ae(t){var e,i,o,n,s=[];if(!t._d){for(o=re(t),t._w&&null==t._a[un]&&null==t._a[ln]&&he(t),null!=t._dayOfYear&&(n=se(t._a[dn],o[dn]),(t._dayOfYear>Q(n)||0===t._dayOfYear)&&(p(t)._overflowDayOfYear=!0),i=_t(n,0,t._dayOfYear),t._a[ln]=i.getUTCMonth(),t._a[un]=i.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=o[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[cn]&&0===t._a[pn]&&0===t._a[fn]&&0===t._a[mn]&&(t._nextDay=!0,t._a[cn]=0),t._d=(t._useUTC?_t:bt).apply(null,s),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[cn]=24),t._w&&void 0!==t._w.d&&t._w.d!==t._d.getDay()&&(p(t).weekdayMismatch=!0)}}function he(t){var e,i,o,n,s,r,a,h;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)s=1,r=4,i=se(e.GG,t._a[dn],kt(De(),1,4).year),o=se(e.W,1),((n=se(e.E,1))<1||n>7)&&(h=!0);else{s=t._locale._week.dow,r=t._locale._week.doy;var d=kt(De(),s,r);i=se(e.gg,t._a[dn],d.year),o=se(e.w,d.week),null!=e.d?((n=e.d)<0||n>6)&&(h=!0):null!=e.e?(n=e.e+s,(e.e<0||e.e>6)&&(h=!0)):n=s}o<1||o>St(i,s,r)?p(t)._overflowWeeks=!0:null!=h?p(t)._overflowWeekday=!0:(a=xt(i,o,n,s,r),t._a[dn]=a.year,t._dayOfYear=a.dayOfYear)}function de(t){var e,i,o,n,s,r,a=t._i,h=Fn.exec(a)||Bn.exec(a);if(h){for(p(t).iso=!0,e=0,i=Hn.length;e0&&p(t).unusedInput.push(r),a=a.slice(a.indexOf(o)+o.length),d+=o.length),Wo[s]?(o?p(t).empty=!1:p(t).unusedTokens.push(s),$(s,o,t)):t._strict&&!o&&p(t).unusedTokens.push(s);p(t).charsLeftOver=h-d,a.length>0&&p(t).unusedInput.push(a),t._a[cn]<=12&&!0===p(t).bigHour&&t._a[cn]>0&&(p(t).bigHour=void 0),p(t).parsedDateParts=t._a.slice(0),p(t).meridiem=t._meridiem,t._a[cn]=ye(t._locale,t._a[cn],t._meridiem),ae(t),ne(t)}function ye(t,e,i){var o;return null==i?e:null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?(o=t.isPM(i),o&&e<12&&(e+=12),o||12!==e||(e=0),e):e}function be(t){var e,i,o,n,s;if(0===t._f.length)return p(t).invalidFormat=!0,void(t._d=new Date(NaN));for(n=0;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ue(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(v(t,this),t=xe(t),t._a){var e=t._isUTC?u(t._a):De(t._a);this._isDSTShifted=this.isValid()&&w(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qe(){return!!this.isValid()&&!this._isUTC}function Xe(){return!!this.isValid()&&this._isUTC}function Ze(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Ke(t,e){var i,o,n,s=t,a=null;return Ne(t)?s={ms:t._milliseconds,d:t._days,M:t._months}:r(t)?(s={},e?s[e]=t:s.milliseconds=t):(a=Jn.exec(t))?(i="-"===a[1]?-1:1,s={y:0,d:_(a[un])*i,h:_(a[cn])*i,m:_(a[pn])*i,s:_(a[fn])*i,ms:_(Re(1e3*a[mn]))*i}):(a=$n.exec(t))?(i="-"===a[1]?-1:(a[1],1),s={y:Je(a[2],i),M:Je(a[3],i),w:Je(a[4],i),d:Je(a[5],i),h:Je(a[6],i),m:Je(a[7],i),s:Je(a[8],i)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(n=Qe(De(s.from),De(s.to)),s={},s.ms=n.milliseconds,s.M=n.months),o=new Ie(s),Ne(t)&&d(t,"_locale")&&(o._locale=t._locale),o}function Je(t,e){var i=t&&parseFloat(t.replace(",","."));return(isNaN(i)?0:i)*e}function $e(t,e){var i={milliseconds:0,months:0};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,"M").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function Qe(t,e){var i;return t.isValid()&&e.isValid()?(e=Le(e,t),t.isBefore(e)?i=$e(t,e):(i=$e(e,t),i.milliseconds=-i.milliseconds,i.months=-i.months),i):{milliseconds:0,months:0}}function ti(t,e){return function(i,o){var n,s;return null===o||isNaN(+o)||(S(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),s=i,i=o,o=s),i="string"==typeof i?+i:i,n=Ke(i,o),ei(this,n,t),this}}function ei(t,i,o,n){var s=i._milliseconds,r=Re(i._days),a=Re(i._months);t.isValid()&&(n=null==n||n,a&&pt(t,ot(t,"Month")+a*o),r&&nt(t,"Date",ot(t,"Date")+r*o),s&&t._d.setTime(t._d.valueOf()+s*o),n&&e.updateOffset(t,r||a))}function ii(t,e){var i=t.diff(e,"days",!0);return i<-6?"sameElse":i<-1?"lastWeek":i<0?"lastDay":i<1?"sameDay":i<2?"nextDay":i<7?"nextWeek":"sameElse"}function oi(t,i){var o=t||De(),n=Le(o,this).startOf("day"),s=e.calendarFormat(this,n)||"sameElse",r=i&&(D(i[s])?i[s].call(this,o):i[s]);return this.format(r||this.localeData().calendar(s,this,De(o)))}function ni(){return new g(this)}function si(t,e){var i=y(t)?t:De(t);return!(!this.isValid()||!i.isValid())&&(e=z(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()>i.valueOf():i.valueOf()9999?G(t,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):D(Date.prototype.toISOString)?this.toDate().toISOString():G(t,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function mi(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var i="["+t+'("]',o=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n=e+'[")]';return this.format(i+o+"-MM-DD[T]HH:mm:ss.SSS"+n)}function vi(t){t||(t=this.isUtc()?e.defaultFormatUtc:e.defaultFormat);var i=G(this,t);return this.localeData().postformat(i)}function gi(t,e){return this.isValid()&&(y(t)&&t.isValid()||De(t).isValid())?Ke({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function yi(t){return this.from(De(),t)}function bi(t,e){return this.isValid()&&(y(t)&&t.isValid()||De(t).isValid())?Ke({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function _i(t){return this.to(De(),t)}function wi(t){var e;return void 0===t?this._locale._abbr:(e=ie(t),null!=e&&(this._locale=e),this)}function xi(){return this._locale}function ki(t){switch(t=z(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function Si(t){return void 0===(t=z(t))||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Di(){return this._d.valueOf()-6e4*(this._offset||0)}function Mi(){return Math.floor(this.valueOf()/1e3)}function Ci(){return new Date(this.valueOf())}function Oi(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function Ei(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function Ti(){return this.isValid()?this.toISOString():null}function Pi(){return f(this)}function Ii(){return l({},p(this))}function Ni(){return p(this).overflow}function Ri(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Ai(t,e){H(0,[t,t.length],0,e)}function zi(t){return ji.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Li(t){return ji.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Fi(){return St(this.year(),1,4)}function Bi(){var t=this.localeData()._week;return St(this.year(),t.dow,t.doy)}function ji(t,e,i,o,n){var s;return null==t?kt(this,o,n).year:(s=St(t,o,n),e>s&&(e=s),Hi.call(this,t,e,i,o,n))}function Hi(t,e,i,o,n){var s=xt(t,e,i,o,n),r=_t(s.year,0,s.dayOfYear);return this.year(r.getUTCFullYear()),this.month(r.getUTCMonth()),this.date(r.getUTCDate()),this}function Wi(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function Yi(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Gi(t,e){e[mn]=_(1e3*("0."+t))}function Vi(){return this._isUTC?"UTC":""}function Ui(){return this._isUTC?"Coordinated Universal Time":""}function qi(t){return De(1e3*t)}function Xi(){return De.apply(null,arguments).parseZone()}function Zi(t){return t}function Ki(t,e,i,o){var n=ie(),s=u().set(o,e);return n[i](s,t)}function Ji(t,e,i){if(r(t)&&(e=t,t=void 0),t=t||"",null!=e)return Ki(t,e,i,"month");var o,n=[];for(o=0;o<12;o++)n[o]=Ki(t,o,i,"month");return n}function $i(t,e,i,o){"boolean"==typeof t?(r(e)&&(i=e,e=void 0),e=e||""):(e=t,i=e,t=!1,r(e)&&(i=e,e=void 0),e=e||"");var n=ie(),s=t?n._week.dow:0;if(null!=i)return Ki(e,(i+s)%7,o,"day");var a,h=[];for(a=0;a<7;a++)h[a]=Ki(e,(a+s)%7,o,"day");return h}function Qi(t,e){return Ji(t,e,"months")}function to(t,e){return Ji(t,e,"monthsShort")}function eo(t,e,i){return $i(t,e,i,"weekdays")}function io(t,e,i){return $i(t,e,i,"weekdaysShort")}function oo(t,e,i){return $i(t,e,i,"weekdaysMin")}function no(){var t=this._data;return this._milliseconds=ds(this._milliseconds),this._days=ds(this._days),this._months=ds(this._months),t.milliseconds=ds(t.milliseconds),t.seconds=ds(t.seconds),t.minutes=ds(t.minutes),t.hours=ds(t.hours),t.months=ds(t.months),t.years=ds(t.years),this}function so(t,e,i,o){var n=Ke(e,i);return t._milliseconds+=o*n._milliseconds,t._days+=o*n._days,t._months+=o*n._months,t._bubble()}function ro(t,e){return so(this,t,e,1)}function ao(t,e){return so(this,t,e,-1)}function ho(t){return t<0?Math.floor(t):Math.ceil(t)}function lo(){var t,e,i,o,n,s=this._milliseconds,r=this._days,a=this._months,h=this._data;return s>=0&&r>=0&&a>=0||s<=0&&r<=0&&a<=0||(s+=864e5*ho(co(a)+r),r=0,a=0),h.milliseconds=s%1e3,t=b(s/1e3),h.seconds=t%60,e=b(t/60),h.minutes=e%60,i=b(e/60),h.hours=i%24,r+=b(i/24),n=b(uo(r)),a+=n, r-=ho(co(n)),o=b(a/12),a%=12,h.days=r,h.months=a,h.years=o,this}function uo(t){return 4800*t/146097}function co(t){return 146097*t/4800}function po(t){if(!this.isValid())return NaN;var e,i,o=this._milliseconds;if("month"===(t=z(t))||"year"===t)return e=this._days+o/864e5,i=this._months+uo(e),"month"===t?i:i/12;switch(e=this._days+Math.round(co(this._months)),t){case"week":return e/7+o/6048e5;case"day":return e+o/864e5;case"hour":return 24*e+o/36e5;case"minute":return 1440*e+o/6e4;case"second":return 86400*e+o/1e3;case"millisecond":return Math.floor(864e5*e)+o;default:throw new Error("Unknown unit "+t)}}function fo(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*_(this._months/12):NaN}function mo(t){return function(){return this.as(t)}}function vo(){return Ke(this)}function go(t){return t=z(t),this.isValid()?this[t+"s"]():NaN}function yo(t){return function(){return this.isValid()?this._data[t]:NaN}}function bo(){return b(this.days()/7)}function _o(t,e,i,o,n){return n.relativeTime(e||1,!!i,t,o)}function wo(t,e,i){var o=Ke(t).abs(),n=Ds(o.as("s")),s=Ds(o.as("m")),r=Ds(o.as("h")),a=Ds(o.as("d")),h=Ds(o.as("M")),d=Ds(o.as("y")),l=n<=Ms.ss&&["s",n]||n0,l[4]=i,_o.apply(null,l)}function xo(t){return void 0===t?Ds:"function"==typeof t&&(Ds=t,!0)}function ko(t,e){return void 0!==Ms[t]&&(void 0===e?Ms[t]:(Ms[t]=e,"s"===t&&(Ms.ss=e-1),!0))}function So(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),i=wo(this,!t,e);return t&&(i=e.pastFuture(+this,i)),e.postformat(i)}function Do(t){return(t>0)-(t<0)||+t}function Mo(){if(!this.isValid())return this.localeData().invalidDate();var t,e,i,o=Cs(this._milliseconds)/1e3,n=Cs(this._days),s=Cs(this._months);t=b(o/60),e=b(t/60),o%=60,t%=60,i=b(s/12),s%=12;var r=i,a=s,h=n,d=e,l=t,u=o?o.toFixed(3).replace(/\.?0+$/,""):"",c=this.asSeconds();if(!c)return"P0D";var p=c<0?"-":"",f=Do(this._months)!==Do(c)?"-":"",m=Do(this._days)!==Do(c)?"-":"",v=Do(this._milliseconds)!==Do(c)?"-":"";return p+"P"+(r?f+r+"Y":"")+(a?f+a+"M":"")+(h?m+h+"D":"")+(d||l||u?"T":"")+(d?v+d+"H":"")+(l?v+l+"M":"")+(u?v+u+"S":"")}var Co,Oo;Oo=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),i=e.length>>>0,o=0;o68?1900:2e3)};var yn,bn=it("FullYear",!0);yn=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;ethis?this:t:m()}),Xn=function(){return Date.now?Date.now():+new Date},Zn=["year","quarter","month","week","day","hour","minute","second","millisecond"];Ae("Z",":"),Ae("ZZ",""),U("Z",nn),U("ZZ",nn),K(["Z","ZZ"],function(t,e,i){i._useUTC=!0,i._tzm=ze(nn,t)});var Kn=/([\+\-]|\d\d)/gi;e.updateOffset=function(){};var Jn=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,$n=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Ke.fn=Ie.prototype,Ke.invalid=Pe;var Qn=ti(1,"add"),ts=ti(-1,"subtract");e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var es=k("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});H(0,["gg",2],0,function(){return this.weekYear()%100}),H(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ai("gggg","weekYear"),Ai("ggggg","weekYear"),Ai("GGGG","isoWeekYear"),Ai("GGGGG","isoWeekYear"),A("weekYear","gg"),A("isoWeekYear","GG"),F("weekYear",1),F("isoWeekYear",1),U("G",en),U("g",en),U("GG",Xo,Go),U("gg",Xo,Go),U("GGGG",$o,Uo),U("gggg",$o,Uo),U("GGGGG",Qo,qo),U("ggggg",Qo,qo),J(["gggg","ggggg","GGGG","GGGGG"],function(t,e,i,o){e[o.substr(0,2)]=_(t)}),J(["gg","GG"],function(t,i,o,n){i[n]=e.parseTwoDigitYear(t)}),H("Q",0,"Qo","quarter"),A("quarter","Q"),F("quarter",7),U("Q",Yo),K("Q",function(t,e){e[ln]=3*(_(t)-1)}),H("D",["DD",2],"Do","date"),A("date","D"),F("date",9),U("D",Xo),U("DD",Xo,Go),U("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),K(["D","DD"],un),K("Do",function(t,e){e[un]=_(t.match(Xo)[0],10)});var is=it("Date",!0);H("DDD",["DDDD",3],"DDDo","dayOfYear"),A("dayOfYear","DDD"),F("dayOfYear",4),U("DDD",Jo),U("DDDD",Vo),K(["DDD","DDDD"],function(t,e,i){i._dayOfYear=_(t)}),H("m",["mm",2],0,"minute"),A("minute","m"),F("minute",14),U("m",Xo),U("mm",Xo,Go),K(["m","mm"],pn);var os=it("Minutes",!1);H("s",["ss",2],0,"second"),A("second","s"),F("second",15),U("s",Xo),U("ss",Xo,Go),K(["s","ss"],fn);var ns=it("Seconds",!1);H("S",0,0,function(){return~~(this.millisecond()/100)}),H(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),H(0,["SSS",3],0,"millisecond"),H(0,["SSSS",4],0,function(){return 10*this.millisecond()}),H(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),H(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),H(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),H(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),H(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),A("millisecond","ms"),F("millisecond",16),U("S",Jo,Yo),U("SS",Jo,Go),U("SSS",Jo,Vo);var ss;for(ss="SSSS";ss.length<=9;ss+="S")U(ss,tn);for(ss="S";ss.length<=9;ss+="S")K(ss,Gi);var rs=it("Milliseconds",!1);H("z",0,0,"zoneAbbr"),H("zz",0,0,"zoneName");var as=g.prototype;as.add=Qn,as.calendar=oi,as.clone=ni,as.diff=ui,as.endOf=Si,as.format=vi,as.from=gi,as.fromNow=yi,as.to=bi,as.toNow=_i,as.get=st,as.invalidAt=Ni,as.isAfter=si,as.isBefore=ri,as.isBetween=ai,as.isSame=hi,as.isSameOrAfter=di,as.isSameOrBefore=li,as.isValid=Pi,as.lang=es,as.locale=wi,as.localeData=xi,as.max=qn,as.min=Un,as.parsingFlags=Ii,as.set=rt,as.startOf=ki,as.subtract=ts,as.toArray=Oi,as.toObject=Ei,as.toDate=Ci,as.toISOString=fi,as.inspect=mi,as.toJSON=Ti,as.toString=pi,as.unix=Mi,as.valueOf=Di,as.creationData=Ri,as.year=bn,as.isLeapYear=et,as.weekYear=zi,as.isoWeekYear=Li,as.quarter=as.quarters=Wi,as.month=ft,as.daysInMonth=mt,as.week=as.weeks=Ot,as.isoWeek=as.isoWeeks=Et,as.weeksInYear=Bi,as.isoWeeksInYear=Fi,as.date=is,as.day=as.days=Lt,as.weekday=Ft,as.isoWeekday=Bt,as.dayOfYear=Yi,as.hour=as.hours=Rn,as.minute=as.minutes=os,as.second=as.seconds=ns,as.millisecond=as.milliseconds=rs,as.utcOffset=Be,as.utc=He,as.local=We,as.parseZone=Ye,as.hasAlignedHourOffset=Ge,as.isDST=Ve,as.isLocal=qe,as.isUtcOffset=Xe,as.isUtc=Ze,as.isUTC=Ze,as.zoneAbbr=Vi,as.zoneName=Ui,as.dates=k("dates accessor is deprecated. Use date instead.",is),as.months=k("months accessor is deprecated. Use month instead",ft),as.years=k("years accessor is deprecated. Use year instead",bn),as.zone=k("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",je),as.isDSTShifted=k("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ue);var hs=O.prototype;hs.calendar=E,hs.longDateFormat=T,hs.invalidDate=P,hs.ordinal=I,hs.preparse=Zi,hs.postformat=Zi,hs.relativeTime=N,hs.pastFuture=R,hs.set=M,hs.months=dt,hs.monthsShort=lt,hs.monthsParse=ct,hs.monthsRegex=gt,hs.monthsShortRegex=vt,hs.week=Dt,hs.firstDayOfYear=Ct,hs.firstDayOfWeek=Mt,hs.weekdays=It,hs.weekdaysMin=Rt,hs.weekdaysShort=Nt,hs.weekdaysParse=zt,hs.weekdaysRegex=jt,hs.weekdaysShortRegex=Ht,hs.weekdaysMinRegex=Wt,hs.isPM=Xt,hs.meridiem=Zt,Qt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===_(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),e.lang=k("moment.lang is deprecated. Use moment.locale instead.",Qt),e.langData=k("moment.langData is deprecated. Use moment.localeData instead.",ie);var ds=Math.abs,ls=mo("ms"),us=mo("s"),cs=mo("m"),ps=mo("h"),fs=mo("d"),ms=mo("w"),vs=mo("M"),gs=mo("y"),ys=yo("milliseconds"),bs=yo("seconds"),_s=yo("minutes"),ws=yo("hours"),xs=yo("days"),ks=yo("months"),Ss=yo("years"),Ds=Math.round,Ms={ss:44,s:45,m:45,h:22,d:26,M:11},Cs=Math.abs,Os=Ie.prototype;return Os.isValid=Te,Os.abs=no,Os.add=ro,Os.subtract=ao,Os.as=po,Os.asMilliseconds=ls,Os.asSeconds=us,Os.asMinutes=cs,Os.asHours=ps,Os.asDays=fs,Os.asWeeks=ms,Os.asMonths=vs,Os.asYears=gs,Os.valueOf=fo,Os._bubble=lo,Os.clone=vo,Os.get=go,Os.milliseconds=ys,Os.seconds=bs,Os.minutes=_s,Os.hours=ws,Os.days=xs,Os.weeks=bo,Os.months=ks,Os.years=Ss,Os.humanize=So,Os.toISOString=Mo,Os.toString=Mo,Os.toJSON=Mo,Os.locale=wi,Os.localeData=xi,Os.toIsoString=k("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Mo),Os.lang=es,H("X",0,0,"unix"),H("x",0,0,"valueOf"),U("x",en),U("X",sn),K("X",function(t,e,i){i._d=new Date(1e3*parseFloat(t,10))}),K("x",function(t,e,i){i._d=new Date(_(t))}),e.version="2.19.1",function(t){Co=t}(De),e.fn=as,e.min=Ce,e.max=Oe,e.now=Xn,e.utc=u,e.unix=qi,e.months=Qi,e.isDate=a,e.locale=Qt,e.invalid=m,e.duration=Ke,e.isMoment=y,e.weekdays=eo,e.parseZone=Xi,e.localeData=ie,e.isDuration=Ne,e.monthsShort=to,e.weekdaysMin=oo,e.defineLocale=te,e.updateLocale=ee,e.locales=oe,e.weekdaysShort=io,e.normalizeUnits=z,e.relativeTimeRounding=xo,e.relativeTimeThreshold=ko,e.calendarFormat=ii,e.prototype=as,e})}).call(e,i(155)(t))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){function i(t){throw new Error("Cannot find module '"+t+"'.")}i.keys=function(){return[]},i.resolve=i,t.exports=i,i.id=156},function(t,e,i){(function(e){function i(t,e,i){var o=e&&i||0,n=0;for(e=e||[],t.toLowerCase().replace(/[0-9a-f]{2}/g,function(t){n<16&&(e[o+n++]=u[t])});n<16;)e[o+n++]=0;return e}function o(t,e){var i=e||0,o=l;return o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]}function n(t,e,i){var n=e&&i||0,s=e||[];t=t||{};var r=void 0!==t.clockseq?t.clockseq:m,a=void 0!==t.msecs?t.msecs:(new Date).getTime(),h=void 0!==t.nsecs?t.nsecs:g+1,d=a-v+(h-g)/1e4;if(d<0&&void 0===t.clockseq&&(r=r+1&16383),(d<0||a>v)&&void 0===t.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");v=a,g=h,m=r,a+=122192928e5;var l=(1e4*(268435455&a)+h)%4294967296;s[n++]=l>>>24&255,s[n++]=l>>>16&255,s[n++]=l>>>8&255,s[n++]=255&l;var u=a/4294967296*1e4&268435455;s[n++]=u>>>8&255,s[n++]=255&u,s[n++]=u>>>24&15|16,s[n++]=u>>>16&255,s[n++]=r>>>8|128,s[n++]=255&r;for(var c=t.node||f,p=0;p<6;p++)s[n+p]=c[p];return e||o(s)}function s(t,e,i){var n=e&&i||0;"string"==typeof t&&(e="binary"==t?new Array(16):null,t=null),t=t||{};var s=t.random||(t.rng||r)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,e)for(var a=0;a<16;a++)e[n+a]=s[a];return e||o(s)}var r,a="undefined"!=typeof window?window:void 0!==e?e:null;if(a&&a.crypto&&crypto.getRandomValues){var h=new Uint8Array(16);r=function(){return crypto.getRandomValues(h),h}}if(!r){var d=new Array(16);r=function(){for(var t,e=0;e<16;e++)0==(3&e)&&(t=4294967296*Math.random()),d[e]=t>>>((3&e)<<3)&255;return d}}for(var l=[],u={},c=0;c<256;c++)l[c]=(c+256).toString(16).substr(1),u[l[c]]=c;var p=r(),f=[1|p[0],p[1],p[2],p[3],p[4],p[5]],m=16383&(p[6]<<8|p[7]),v=0,g=0,y=s;y.v1=n,y.v4=s,y.parse=i,y.unparse=o,t.exports=y}).call(e,i(158))},function(t,e){var i;i=function(){return this}();try{i=i||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(i=window)}t.exports=i},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Graph3d=i(161),e.graph3d={Camera:i(95),Filter:i(96),Point2d:i(91),Point3d:i(34),Slider:i(92),StepNumber:i(93)},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){var o=i(7),n=o.JSON||(o.JSON={stringify:JSON.stringify});t.exports=function(t){return n.stringify.apply(n,arguments)}},function(t,e,i){function o(t,e,i){if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.dataGroup=new _,this.dataPoints=null,this.create(),f.setDefaults(o.DEFAULTS,this),this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.setOptions(i),this.setData(e)}function n(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0}function s(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0}var r=i(90),a=function(t){return t&&t.__esModule?t:{default:t}}(r),h=i(44),d=i(2),l=i(34),u=i(91),c=i(92),p=i(93),f=i(94),m=i(15).default,v=i(15),g=v.printStyle,y=i(172),b=y.allOptions,_=i(173);o.STYLE=f.STYLE;o.DEFAULTS={width:"400px",height:"400px",filterLabel:"time",legendLabel:"value",xLabel:"x",yLabel:"y",zLabel:"z",xValueLabel:function(t){return t},yValueLabel:function(t){return t},zValueLabel:function(t){return t},showXAxis:!0,showYAxis:!0,showZAxis:!0,showGrid:!0,showPerspective:!0,showShadow:!1,keepAspectRatio:!0,verticalRatio:.5,dotSizeRatio:.02,dotSizeMinFraction:.5,dotSizeMaxFraction:2.5,showAnimationControls:void 0,animationInterval:1e3,animationPreload:!1,animationAutoStart:void 0,axisColor:"#4D4D4D",gridColor:"#D3D3D3",xCenter:"55%",yCenter:"50%",style:o.STYLE.DOT,tooltip:!1,tooltipStyle:{content:{padding:"10px",border:"1px solid #4d4d4d",color:"#1a1a1a",background:"rgba(255,255,255,0.7)",borderRadius:"2px",boxShadow:"5px 5px 10px rgba(128,128,128,0.5)"},line:{height:"40px",width:"0",borderLeft:"1px solid #4d4d4d"},dot:{height:"0",width:"0",border:"5px solid #4d4d4d",borderRadius:"5px"}},dataColor:{fill:"#7DC1FF",stroke:"#3267D2",strokeWidth:1},cameraPosition:{horizontal:1,vertical:.5,distance:1.7},showLegend:void 0,backgroundColor:void 0,xBarWidth:void 0,yBarWidth:void 0,valueMin:void 0,valueMax:void 0,xMin:void 0,xMax:void 0,xStep:void 0,yMin:void 0,yMax:void 0,yStep:void 0,zMin:void 0,zMax:void 0,zStep:void 0},h(o.prototype),o.prototype._setScale=function(){this.scale=new l(1/this.xRange.range(),1/this.yRange.range(),1/this.zRange.range()),this.keepAspectRatio&&(this.scale.x0&&(r[n-1].pointNext=r[n]);return r},o.prototype.create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);this.frame=document.createElement("div"),this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas);var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t),this.frame.filter=document.createElement("div"),this.frame.filter.style.position="absolute",this.frame.filter.style.bottom="0px",this.frame.filter.style.left="0px",this.frame.filter.style.width="100%",this.frame.appendChild(this.frame.filter);var e=this,i=function(t){e._onMouseDown(t)},o=function(t){e._onTouchStart(t)},n=function(t){e._onWheel(t)},s=function(t){e._onTooltip(t)},r=function(t){e._onClick(t)};d.addEventListener(this.frame.canvas,"mousedown",i),d.addEventListener(this.frame.canvas,"touchstart",o),d.addEventListener(this.frame.canvas,"mousewheel",n),d.addEventListener(this.frame.canvas,"mousemove",s),d.addEventListener(this.frame.canvas,"click",r),this.containerElement.appendChild(this.frame)},o.prototype._setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this._resizeCanvas()},o.prototype._resizeCanvas=function(){this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,this.frame.filter.style.width=this.frame.canvas.clientWidth-20+"px"},o.prototype.animationStart=function(){if(this.animationAutoStart&&this.dataGroup.dataFilter){if(!this.frame.filter||!this.frame.filter.slider)throw new Error("No animation available");this.frame.filter.slider.play()}},o.prototype.animationStop=function(){this.frame.filter&&this.frame.filter.slider&&this.frame.filter.slider.stop()},o.prototype._resizeCenter=function(){"%"===this.xCenter.charAt(this.xCenter.length-1)?this.currentXCenter=parseFloat(this.xCenter)/100*this.frame.canvas.clientWidth:this.currentXCenter=parseFloat(this.xCenter),"%"===this.yCenter.charAt(this.yCenter.length-1)?this.currentYCenter=parseFloat(this.yCenter)/100*(this.frame.canvas.clientHeight-this.frame.filter.clientHeight):this.currentYCenter=parseFloat(this.yCenter)},o.prototype.getCameraPosition=function(){var t=this.camera.getArmRotation();return t.distance=this.camera.getArmLength(),t},o.prototype._readData=function(t){this.dataPoints=this.dataGroup.initializeData(this,t,this.style),this._initializeRanges(),this._redrawFilter()},o.prototype.setData=function(t){void 0!==t&&null!==t&&(this._readData(t),this.redraw(),this.animationStart())},o.prototype.setOptions=function(t){if(void 0!==t){!0===m.validate(t,b)&&console.log("%cErrors have been found in the supplied options object.",g),this.animationStop(),f.setOptions(t,this),this.setPointDrawingMethod(),this._setSize(this.width,this.height),this.setData(this.dataGroup.getDataTable()),this.animationStart()}},o.prototype.setPointDrawingMethod=function(){var t=void 0;switch(this.style){case o.STYLE.BAR:t=o.prototype._redrawBarGraphPoint;break;case o.STYLE.BARCOLOR:t=o.prototype._redrawBarColorGraphPoint;break;case o.STYLE.BARSIZE:t=o.prototype._redrawBarSizeGraphPoint;break;case o.STYLE.DOT:t=o.prototype._redrawDotGraphPoint;break;case o.STYLE.DOTLINE:t=o.prototype._redrawDotLineGraphPoint;break;case o.STYLE.DOTCOLOR:t=o.prototype._redrawDotColorGraphPoint;break;case o.STYLE.DOTSIZE:t=o.prototype._redrawDotSizeGraphPoint;break;case o.STYLE.SURFACE:t=o.prototype._redrawSurfaceGraphPoint;break;case o.STYLE.GRID:t=o.prototype._redrawGridGraphPoint;break;case o.STYLE.LINE:t=o.prototype._redrawLineGraphPoint;break;default:throw new Error("Can not determine point drawing method for graph style '"+this.style+"'")}this._pointDrawingMethod=t},o.prototype.redraw=function(){if(void 0===this.dataPoints)throw new Error("Graph data not initialized");this._resizeCanvas(),this._resizeCenter(),this._redrawSlider(),this._redrawClear(),this._redrawAxis(),this._redrawDataGraph(),this._redrawInfo(),this._redrawLegend()},o.prototype._getContext=function(){var t=this.frame.canvas,e=t.getContext("2d");return e.lineJoin="round",e.lineCap="round",e},o.prototype._redrawClear=function(){var t=this.frame.canvas;t.getContext("2d").clearRect(0,0,t.width,t.height)},o.prototype._dotSize=function(){return this.frame.clientWidth*this.dotSizeRatio},o.prototype._getLegendWidth=function(){var t;if(this.style===o.STYLE.DOTSIZE){t=this._dotSize()*this.dotSizeMaxFraction}else t=this.style===o.STYLE.BARSIZE?this.xBarWidth:20;return t},o.prototype._redrawLegend=function(){if(!0===this.showLegend&&this.style!==o.STYLE.LINE&&this.style!==o.STYLE.BARSIZE){var t=this.style===o.STYLE.BARSIZE||this.style===o.STYLE.DOTSIZE,e=this.style===o.STYLE.DOTSIZE||this.style===o.STYLE.DOTCOLOR||this.style===o.STYLE.BARCOLOR,i=Math.max(.25*this.frame.clientHeight,100),n=this.margin,s=this._getLegendWidth(),r=this.frame.clientWidth-this.margin,a=r-s,h=n+i,d=this._getContext();if(d.lineWidth=1,d.font="14px arial",!1===t){var l,c=i;for(l=0;l0?(t.textAlign="center",t.textBaseline="top",s.y+=n):Math.sin(2*o)<0?(t.textAlign="right",t.textBaseline="middle"):(t.textAlign="left",t.textBaseline="middle"),t.fillStyle=this.axisColor,t.fillText(i,s.x,s.y)},o.prototype.drawAxisLabelY=function(t,e,i,o,n){void 0===n&&(n=0);var s=this._convert3Dto2D(e);Math.cos(2*o)<0?(t.textAlign="center",t.textBaseline="top",s.y+=n):Math.sin(2*o)>0?(t.textAlign="right",t.textBaseline="middle"):(t.textAlign="left",t.textBaseline="middle"),t.fillStyle=this.axisColor,t.fillText(i,s.x,s.y)},o.prototype.drawAxisLabelZ=function(t,e,i,o){void 0===o&&(o=0);var n=this._convert3Dto2D(e);t.textAlign="right",t.textBaseline="middle",t.fillStyle=this.axisColor,t.fillText(i,n.x-o,n.y)},o.prototype._line3d=function(t,e,i,o){var n=this._convert3Dto2D(e),s=this._convert3Dto2D(i);this._line(t,n,s,o)},o.prototype._redrawAxis=function(){var t,e,i,o,n,s,r,a,h,d,c,f=this._getContext();f.font=24/this.camera.getArmLength()+"px arial";var m,v=.025/this.scale.x,g=.025/this.scale.y,y=5/this.camera.getArmLength(),b=this.camera.getArmRotation().horizontal,_=new u(Math.cos(b),Math.sin(b)),w=this.xRange,x=this.yRange,k=this.zRange;for(f.lineWidth=1,o=void 0===this.defaultXStep,i=new p(w.min,w.max,this.xStep,o),i.start(!0);!i.end();){var S=i.getCurrent();if(this.showGrid?(t=new l(S,x.min,k.min),e=new l(S,x.max,k.min),this._line3d(f,t,e,this.gridColor)):this.showXAxis&&(t=new l(S,x.min,k.min),e=new l(S,x.min+v,k.min),this._line3d(f,t,e,this.axisColor),t=new l(S,x.max,k.min),e=new l(S,x.max-v,k.min),this._line3d(f,t,e,this.axisColor)),this.showXAxis){r=_.x>0?x.min:x.max,m=new l(S,r,k.min);var D=" "+this.xValueLabel(S)+" ";this.drawAxisLabelX(f,m,D,b,y)}i.next()}for(f.lineWidth=1,o=void 0===this.defaultYStep,i=new p(x.min,x.max,this.yStep,o),i.start(!0);!i.end();){var M=i.getCurrent();if(this.showGrid?(t=new l(w.min,M,k.min),e=new l(w.max,M,k.min),this._line3d(f,t,e,this.gridColor)):this.showYAxis&&(t=new l(w.min,M,k.min),e=new l(w.min+g,M,k.min),this._line3d(f,t,e,this.axisColor),t=new l(w.max,M,k.min),e=new l(w.max-g,M,k.min),this._line3d(f,t,e,this.axisColor)),this.showYAxis){s=_.y>0?w.min:w.max,m=new l(s,M,k.min);var C=" "+this.yValueLabel(M)+" ";this.drawAxisLabelY(f,m,C,b,y)}i.next()}if(this.showZAxis){for(f.lineWidth=1,o=void 0===this.defaultZStep,i=new p(k.min,k.max,this.zStep,o),i.start(!0),s=_.x>0?w.min:w.max,r=_.y<0?x.min:x.max;!i.end();){var O=i.getCurrent(),E=new l(s,r,O),T=this._convert3Dto2D(E);e=new u(T.x-y,T.y),this._line(f,T,e,this.axisColor);var P=this.zValueLabel(O)+" ";this.drawAxisLabelZ(f,E,P,5),i.next()}f.lineWidth=1,t=new l(s,r,k.min),e=new l(s,r,k.max),this._line3d(f,t,e,this.axisColor)}if(this.showXAxis){var I,N;f.lineWidth=1,I=new l(w.min,x.min,k.min),N=new l(w.max,x.min,k.min),this._line3d(f,I,N,this.axisColor),I=new l(w.min,x.max,k.min),N=new l(w.max,x.max,k.min),this._line3d(f,I,N,this.axisColor)}this.showYAxis&&(f.lineWidth=1,t=new l(w.min,x.min,k.min),e=new l(w.min,x.max,k.min),this._line3d(f,t,e,this.axisColor),t=new l(w.max,x.min,k.min),e=new l(w.max,x.max,k.min),this._line3d(f,t,e,this.axisColor));var R=this.xLabel;R.length>0&&this.showXAxis&&(c=.1/this.scale.y,s=(w.max+3*w.min)/4,r=_.x>0?x.min-c:x.max+c,n=new l(s,r,k.min),this.drawAxisLabelX(f,n,R,b));var A=this.yLabel;A.length>0&&this.showYAxis&&(d=.1/this.scale.x,s=_.y>0?w.min-d:w.max+d,r=(x.max+3*x.min)/4,n=new l(s,r,k.min),this.drawAxisLabelY(f,n,A,b));var z=this.zLabel;z.length>0&&this.showZAxis&&(h=30,s=_.x>0?w.min:w.max,r=_.y<0?x.min:x.max,a=(k.max+3*k.min)/4,n=new l(s,r,a),this.drawAxisLabelZ(f,n,z,h))},o.prototype._hsv2rgb=function(t,e,i){var o,n,s,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:o=r,n=h,s=0;break;case 1:o=h,n=r,s=0;break;case 2:o=0,n=r,s=h;break;case 3:o=0,n=h,s=r;break;case 4:o=h,n=0,s=r;break;case 5:o=r,n=0,s=h;break;default:o=0,n=0,s=0}return"RGB("+parseInt(255*o)+","+parseInt(255*n)+","+parseInt(255*s)+")"},o.prototype._getStrokeWidth=function(t){return void 0!==t?this.showPerspective?1/-t.trans.z*this.dataColor.strokeWidth:-this.eye.z/this.camera.getArmLength()*this.dataColor.strokeWidth:this.dataColor.strokeWidth},o.prototype._redrawBar=function(t,e,i,o,n,s){var r,a=this,h=e.point,d=this.zRange.min,u=[{point:new l(h.x-i,h.y-o,h.z)},{point:new l(h.x+i,h.y-o,h.z)},{point:new l(h.x+i,h.y+o,h.z)},{point:new l(h.x-i,h.y+o,h.z)}],c=[{point:new l(h.x-i,h.y-o,d)},{point:new l(h.x+i,h.y-o,d)},{point:new l(h.x+i,h.y+o,d)},{point:new l(h.x-i,h.y+o,d)}];u.forEach(function(t){t.screen=a._convert3Dto2D(t.point)}),c.forEach(function(t){t.screen=a._convert3Dto2D(t.point)});var p=[{corners:u,center:l.avg(c[0].point,c[2].point)},{corners:[u[0],u[1],c[1],c[0]],center:l.avg(c[1].point,c[0].point)},{corners:[u[1],u[2],c[2],c[1]],center:l.avg(c[2].point,c[1].point)},{corners:[u[2],u[3],c[3],c[2]],center:l.avg(c[3].point,c[2].point)},{corners:[u[3],u[0],c[0],c[3]],center:l.avg(c[0].point,c[3].point)}];e.surfaces=p;for(var f=0;f0}if(a){var p,f=(e.point.z+i.point.z+o.point.z+n.point.z)/4,m=240*(1-(f-this.zRange.min)*this.scale.z/this.verticalRatio);this.showShadow?(p=Math.min(1+u.x/c/2,1),s=this._hsv2rgb(m,1,p),r=s):(p=1,s=this._hsv2rgb(m,1,p),r=this.axisColor)}else s="gray",r=this.axisColor;t.lineWidth=this._getStrokeWidth(e);var v=[e,i,n,o];this._polygon(t,v,s,r)}},o.prototype._drawGridLine=function(t,e,i){if(void 0!==e&&void 0!==i){var o=(e.point.z+i.point.z)/2,n=240*(1-(o-this.zRange.min)*this.scale.z/this.verticalRatio);t.lineWidth=2*this._getStrokeWidth(e),t.strokeStyle=this._hsv2rgb(n,1,1),this._line(t,e.screen,i.screen)}},o.prototype._redrawGridGraphPoint=function(t,e){this._drawGridLine(t,e,e.pointRight),this._drawGridLine(t,e,e.pointTop)},o.prototype._redrawLineGraphPoint=function(t,e){void 0!==e.pointNext&&(t.lineWidth=this._getStrokeWidth(e),t.strokeStyle=this.dataColor.stroke,this._line(t,e.screen,e.pointNext.screen))},o.prototype._redrawDataGraph=function(){var t,e=this._getContext();if(!(void 0===this.dataPoints||this.dataPoints.length<=0))for(this._calcTranslations(this.dataPoints),t=0;t0?1:t<0?-1:0}var o=e[0],n=e[1],s=e[2],r=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),a=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x)),h=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},o.prototype._dataPointFromXY=function(t,e){var i,n=null,s=null,r=null,a=new u(t,e);if(this.style===o.STYLE.BAR||this.style===o.STYLE.BARCOLOR||this.style===o.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var h=n.surfaces;if(h)for(var d=h.length-1;d>=0;d--){var l=h[d],c=l.corners,p=[c[0].screen,c[1].screen,c[2].screen],f=[c[2].screen,c[3].screen,c[0].screen];if(this._insideTriangle(a,p)||this._insideTriangle(a,f))return n}}else for(i=0;i"+this.xLabel+":"+t.point.x+""+this.yLabel+":"+t.point.y+""+this.zLabel+":"+t.point.z+"",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(o);var n=e.offsetWidth,s=e.offsetHeight,r=i.offsetHeight,h=o.offsetWidth,d=o.offsetHeight,l=t.screen.x-n/2;l=Math.min(Math.max(l,10),this.frame.clientWidth-10-n),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=l+"px",e.style.top=t.screen.y-r-s+"px",o.style.left=t.screen.x-h/2+"px",o.style.top=t.screen.y-d/2+"px"},o.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},o.prototype.setCameraPosition=function(t){f.setCameraPosition(t,this),this.redraw()},o.prototype.setSize=function(t,e){this._setSize(t,e),this.redraw()},t.exports=o},function(t,e,i){i(163),t.exports=i(7).Object.assign},function(t,e,i){var o=i(17);o(o.S+o.F,"Object",{assign:i(164)})},function(t,e,i){var o=i(33),n=i(63),s=i(42),r=i(41),a=i(78),h=Object.assign;t.exports=!h||i(28)(function(){var t={},e={},i=Symbol(),o="abcdefghijklmnopqrst";return t[i]=7,o.split("").forEach(function(t){e[t]=t}),7!=h({},t)[i]||Object.keys(h({},e)).join("")!=o})?function(t,e){for(var i=r(t),h=arguments.length,d=1,l=n.f,u=s.f;h>d;)for(var c,p=a(arguments[d++]),f=l?o(p).concat(l(p)):o(p),m=f.length,v=0;m>v;)u.call(p,c=f[v++])&&(i[c]=p[c]);return i}:h},function(t,e,i){t.exports={default:i(166),__esModule:!0}},function(t,e,i){i(167),t.exports=i(7).Math.sign},function(t,e,i){var o=i(17);o(o.S,"Math",{sign:i(168)})},function(t,e){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,e,i){t.exports={default:i(170),__esModule:!0}},function(t,e,i){i(171);var o=i(7).Object;t.exports=function(t,e,i){return o.defineProperty(t,e,i)}},function(t,e,i){var o=i(17);o(o.S+o.F*!i(21),"Object",{defineProperty:i(20).f})},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var o="string",n="boolean",s="number",r={fill:{string:o},stroke:{string:o},strokeWidth:{number:s},__type__:{string:o,object:"object",undefined:"undefined"}},a={animationAutoStart:{boolean:n,undefined:"undefined"},animationInterval:{number:s},animationPreload:{boolean:n},axisColor:{string:o},backgroundColor:r,xBarWidth:{number:s,undefined:"undefined"},yBarWidth:{number:s,undefined:"undefined"},cameraPosition:{distance:{number:s},horizontal:{number:s},vertical:{number:s},__type__:{object:"object"}},xCenter:{string:o},yCenter:{string:o},dataColor:r,dotSizeMinFraction:{number:s},dotSizeMaxFraction:{number:s},dotSizeRatio:{number:s},filterLabel:{string:o},gridColor:{string:o},onclick:{function:"function"},keepAspectRatio:{boolean:n},xLabel:{string:o},yLabel:{string:o},zLabel:{string:o},legendLabel:{string:o},xMin:{number:s,undefined:"undefined"},yMin:{number:s,undefined:"undefined"},zMin:{number:s,undefined:"undefined"},xMax:{number:s,undefined:"undefined"},yMax:{number:s,undefined:"undefined"},zMax:{number:s,undefined:"undefined"},showAnimationControls:{boolean:n,undefined:"undefined"},showGrid:{boolean:n},showLegend:{boolean:n,undefined:"undefined"},showPerspective:{boolean:n},showShadow:{boolean:n},showXAxis:{boolean:n},showYAxis:{boolean:n},showZAxis:{boolean:n},xStep:{number:s,undefined:"undefined"},yStep:{number:s,undefined:"undefined"},zStep:{number:s,undefined:"undefined"},style:{number:s,string:["bar","bar-color","bar-size","dot","dot-line","dot-color","dot-size","line","grid","surface"]},tooltip:{boolean:n,function:"function"},tooltipStyle:{content:{color:{string:o},background:{string:o},border:{string:o},borderRadius:{string:o},boxShadow:{string:o},padding:{string:o},__type__:{object:"object"}},line:{borderLeft:{string:o},height:{string:o},width:{string:o},__type__:{object:"object"}},dot:{border:{string:o},borderRadius:{string:o},height:{string:o},width:{string:o},__type__:{object:"object"}},__type__:{object:"object"}},xValueLabel:{function:"function"},yValueLabel:{function:"function"},zValueLabel:{function:"function"},valueMax:{number:s,undefined:"undefined"},valueMin:{number:s,undefined:"undefined"},verticalRatio:{number:s},height:{string:o},width:{string:o},__type__:{object:"object"}};e.allOptions=a},function(t,e,i){function o(){this.dataTable=null}var n=i(11),s=i(12),r=i(174),a=i(96),h=i(94),d=i(34);o.prototype.initializeData=function(t,e,i){if(void 0!==e){Array.isArray(e)&&(e=new n(e));var o;if(!(e instanceof n||e instanceof s))throw new Error("Array, DataSet, or DataView expected");if(o=e.get(),0!=o.length){this.style=i,this.dataSet&&this.dataSet.off("*",this._onChange),this.dataSet=e,this.dataTable=o;var r=this;this._onChange=function(){t.setData(r.dataSet)},this.dataSet.on("*",this._onChange),this.colX="x",this.colY="y",this.colZ="z";var h=t.hasBars(i);if(h&&(void 0!==t.defaultXBarWidth?this.xBarWidth=t.defaultXBarWidth:this.xBarWidth=this.getSmallestDifference(o,this.colX)||1,void 0!==t.defaultYBarWidth?this.yBarWidth=t.defaultYBarWidth:this.yBarWidth=this.getSmallestDifference(o,this.colY)||1),this._initializeRange(o,this.colX,t,h),this._initializeRange(o,this.colY,t,h),this._initializeRange(o,this.colZ,t,!1),o[0].hasOwnProperty("style")){this.colValue="style";var d=this.getColumnRange(o,this.colValue);this._setRangeDefaults(d,t.defaultValueMin,t.defaultValueMax),this.valueRange=d}this.getDataTable()[0].hasOwnProperty("filter")&&void 0===this.dataFilter&&(this.dataFilter=new a(this,"filter",t),this.dataFilter.setOnLoadCallback(function(){t.redraw()}));return this.dataFilter?this.dataFilter._getDataPoints():this._getDataPoints(this.getDataTable())}}},o.prototype._collectRangeSettings=function(t,e){if(-1==["x","y","z"].indexOf(t))throw new Error("Column '"+t+"' invalid");var i=t.toUpperCase();return{barWidth:this[t+"BarWidth"],min:e["default"+i+"Min"],max:e["default"+i+"Max"],step:e["default"+i+"Step"],range_label:t+"Range",step_label:t+"Step"}},o.prototype._initializeRange=function(t,e,i,o){var n=this._collectRangeSettings(e,i),s=this.getColumnRange(t,e);o&&"z"!=e&&s.expand(n.barWidth/2),this._setRangeDefaults(s,n.min,n.max),this[n.range_label]=s,this[n.step_label]=void 0!==n.step?n.step:s.range()/5},o.prototype.getDistinctValues=function(t,e){void 0===e&&(e=this.dataTable);for(var i=[],o=0;os)&&(o=s)}return o},o.prototype.getColumnRange=function(t,e){for(var i=new r,o=0;o0&&(e[i-1].pointNext=e[i]);return e},o.prototype._checkValueField=function(t){if(this.style===h.STYLE.BARCOLOR||this.style===h.STYLE.BARSIZE||this.style===h.STYLE.DOTCOLOR||this.style===h.STYLE.DOTSIZE){if(void 0===this.colValue)throw new Error("Expected data to have field 'style' for graph style '"+this.style+"'");if(void 0===t[0][this.colValue])throw new Error("Expected data to have field '"+this.colValue+"' for graph style '"+this.style+"'")}},t.exports=o},function(t,e,i){function o(){this.min=void 0,this.max=void 0}o.prototype.adjust=function(t){void 0!==t&&((void 0===this.min||this.min>t)&&(this.min=t),(void 0===this.max||this.maxi)throw new Error("Passed expansion value makes range invalid");this.min=e,this.max=i}},o.prototype.range=function(){return this.max-this.min},o.prototype.center=function(){return(this.min+this.max)/2},t.exports=o},function(t,e,i){var o,n,s;!function(i){n=[],o=i,void 0!==(s="function"==typeof o?o.apply(e,n):o)&&(t.exports=s)}(function(){var t=null;return function e(i,o){function n(t){return t.match(/[^ ]+/g)}function s(e){if("hammer.input"!==e.type){if(e.srcEvent._handled||(e.srcEvent._handled={}),e.srcEvent._handled[e.type])return;e.srcEvent._handled[e.type]=!0}var i=!1;e.stopPropagation=function(){i=!0};var o=e.srcEvent.stopPropagation.bind(e.srcEvent);"function"==typeof o&&(e.srcEvent.stopPropagation=function(){o(),e.stopPropagation()}),e.firstTarget=t;for(var n=t;n&&!i;){var s=n.hammer;if(s)for(var r,a=0;a0?d._handlers[t]=o:(i.off(t,s),delete d._handlers[t]))}),d},d.emit=function(e,o){t=o.target,i.emit(e,o)},d.destroy=function(){var t=i.element.hammer,e=t.indexOf(d);-1!==e&&t.splice(e,1),t.length||delete i.element.hammer,d._handlers={},i.destroy()},d}})},function(t,e,i){var o;!function(n,s,r,a){function h(t,e,i){return setTimeout(p(t,i),e)}function d(t,e,i){return!!Array.isArray(t)&&(l(t,i[e],i),!0)}function l(t,e,i){var o;if(t)if(t.forEach)t.forEach(e,i);else if(t.length!==a)for(o=0;o\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",s=n.console&&(n.console.warn||n.console.log);return s&&s.call(n.console,o,i),t.apply(this,arguments)}}function c(t,e,i){var o,n=e.prototype;o=t.prototype=Object.create(n),o.constructor=t,o._super=n,i&&ft(o,i)}function p(t,e){return function(){return t.apply(e,arguments)}}function f(t,e){return typeof t==gt?t.apply(e?e[0]||a:a,e):t}function m(t,e){return t===a?e:t}function v(t,e,i){l(_(e),function(e){t.addEventListener(e,i,!1)})}function g(t,e,i){l(_(e),function(e){t.removeEventListener(e,i,!1)})}function y(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function b(t,e){return t.indexOf(e)>-1}function _(t){return t.trim().split(/\s+/g)}function w(t,e,i){if(t.indexOf&&!i)return t.indexOf(e);for(var o=0;oi[e]}):o.sort()),o}function S(t,e){for(var i,o,n=e[0].toUpperCase()+e.slice(1),s=0;s1&&!i.firstMultiple?i.firstMultiple=N(e):1===n&&(i.firstMultiple=!1);var s=i.firstInput,r=i.firstMultiple,a=r?r.center:s.center,h=e.center=R(o);e.timeStamp=_t(),e.deltaTime=e.timeStamp-s.timeStamp,e.angle=F(a,h),e.distance=L(a,h),P(i,e),e.offsetDirection=z(e.deltaX,e.deltaY);var d=A(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=d.x,e.overallVelocityY=d.y,e.overallVelocity=bt(d.x)>bt(d.y)?d.x:d.y,e.scale=r?j(r.pointers,o):1,e.rotation=r?B(r.pointers,o):0,e.maxPointers=i.prevInput?e.pointers.length>i.prevInput.maxPointers?e.pointers.length:i.prevInput.maxPointers:e.pointers.length,I(i,e);var l=t.element;y(e.srcEvent.target,l)&&(l=e.srcEvent.target),e.target=l}function P(t,e){var i=e.center,o=t.offsetDelta||{},n=t.prevDelta||{},s=t.prevInput||{};e.eventType!==Et&&s.eventType!==Pt||(n=t.prevDelta={x:s.deltaX||0,y:s.deltaY||0},o=t.offsetDelta={x:i.x,y:i.y}),e.deltaX=n.x+(i.x-o.x),e.deltaY=n.y+(i.y-o.y)}function I(t,e){var i,o,n,s,r=t.lastInterval||e,h=e.timeStamp-r.timeStamp;if(e.eventType!=It&&(h>Ot||r.velocity===a)){var d=e.deltaX-r.deltaX,l=e.deltaY-r.deltaY,u=A(h,d,l);o=u.x,n=u.y,i=bt(u.x)>bt(u.y)?u.x:u.y,s=z(d,l),t.lastInterval=e}else i=r.velocity,o=r.velocityX,n=r.velocityY,s=r.direction;e.velocity=i,e.velocityX=o,e.velocityY=n,e.direction=s}function N(t){for(var e=[],i=0;i=bt(e)?t<0?Rt:At:e<0?zt:Lt}function L(t,e,i){i||(i=Ht);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return Math.sqrt(o*o+n*n)}function F(t,e,i){i||(i=Ht);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return 180*Math.atan2(n,o)/Math.PI}function B(t,e){return F(e[1],e[0],Wt)+F(t[1],t[0],Wt)}function j(t,e){return L(e[0],e[1],Wt)/L(t[0],t[1],Wt)}function H(){this.evEl=Gt,this.evWin=Vt,this.pressed=!1,C.apply(this,arguments)}function W(){this.evEl=Xt,this.evWin=Zt,C.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function Y(){this.evTarget=Jt,this.evWin=$t,this.started=!1,C.apply(this,arguments)}function G(t,e){var i=x(t.touches),o=x(t.changedTouches);return e&(Pt|It)&&(i=k(i.concat(o),"identifier",!0)),[i,o]}function V(){this.evTarget=te,this.targetIds={},C.apply(this,arguments)}function U(t,e){var i=x(t.touches),o=this.targetIds;if(e&(Et|Tt)&&1===i.length)return o[i[0].identifier]=!0,[i,i];var n,s,r=x(t.changedTouches),a=[],h=this.target;if(s=i.filter(function(t){return y(t.target,h)}),e===Et)for(n=0;n-1&&o.splice(t,1)};setTimeout(n,ee)}}function K(t){for(var e=t.srcEvent.clientX,i=t.srcEvent.clientY,o=0;o-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function e(e){i.manager.emit(e,t)}var i=this,o=this.state;o=fe&&e(i.options.event+tt(o))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&n&e.direction},attrTest:function(t){return ot.prototype.attrTest.call(this,t)&&(this.state&ce||!(this.state&ce)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=et(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),c(st,ot,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&ce)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),c(rt,Q,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[se]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distancee.time;if(this._input=t,!o||!i||t.eventType&(Pt|It)&&!n)this.reset();else if(t.eventType&Et)this.reset(),this._timer=h(function(){this.state=me,this.tryEmit()},e.time,this);else if(t.eventType&Pt)return me;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===me&&(t&&t.eventType&Pt?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=_t(),this.manager.emit(this.options.event,this._input)))}}),c(at,ot,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&ce)}}),c(ht,ot,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Ft|Bt,pointers:1},getTouchAction:function(){return nt.prototype.getTouchAction.call(this)},attrTest:function(t){var e,i=this.options.direction;return i&(Ft|Bt)?e=t.overallVelocity:i&Ft?e=t.overallVelocityX:i&Bt&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&i&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&bt(e)>this.options.velocity&&t.eventType&Pt},emit:function(t){var e=et(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),c(dt,Q,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[re]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distanced+i?s+=h()+u-i+t.itemSet.options.margin.item.vertical:r=!1,s=Math.min(s,o-i),{shouldScroll:r,scrollOffset:s,itemTop:l}}var a=i(9),h=i(2),d=i(11),l=i(12),u=i(64),c=i(65),p=i(45),f=i(67),m=i(46),v=i(99),g=i(15).printStyle,y=i(105).allOptions,b=i(105).configureOptions,_=i(71).default,w=i(15).default;o.prototype=new c,o.prototype._createConfigurator=function(){return new _(this,this.dom.container,b)},o.prototype.redraw=function(){this.itemSet&&this.itemSet.markDirty({refreshItems:!0}),this._redraw()},o.prototype.setOptions=function(t){if(!0===w.validate(t,y)&&console.log("%cErrors have been found in the supplied options object.",g),c.prototype.setOptions.call(this,t),"type"in t&&t.type!==this.options.type){this.options.type=t.type;var e=this.itemsData;if(e){var i=this.getSelection();this.setItems(null),this.setItems(e),this.setSelection(i)}}},o.prototype.setItems=function(t){var e;e=t?t instanceof d||t instanceof l?t:new d(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e)},o.prototype.setGroups=function(t){var e;if(t){var i=function(t){return!1!==t.visible};e=t instanceof d||t instanceof l?new l(t,{filter:i}):new d(t.filter(i))}else e=null;this.groupsData=e,this.itemSet.setGroups(e)},o.prototype.setData=function(t){t&&t.groups&&this.setGroups(t.groups),t&&t.items&&this.setItems(t.items)},o.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t,e)},o.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},o.prototype.focus=function(t,e){if(this.itemsData&&void 0!=t){var i=Array.isArray(t)?t:[t],o=this.itemsData.getDataSet().get(i,{type:{start:"Date",end:"Date"}}),n=null,s=null;if(o.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===n||es)&&(s=i)}),null!==n&&null!==s){var a=this,h=this.itemSet.items[i[0]],d=-1*this._getScrollTop(),l=null,u=function(t,e,i){var o=r(a,h);if(l||(l=o),l.itemTop!=o.itemTop||l.shouldScroll){l.itemTop!=o.itemTop&&o.shouldScroll&&(l=o,d=-1*a._getScrollTop());var n=d,s=l.scrollOffset,u=i?s:n+(s-n)*t;a._setScrollTop(-u),e||a._redraw()}},c=function(){var t=r(a,h);t.shouldScroll&&t.itemTop!=l.itemTop&&(a._setScrollTop(-t.scrollOffset),a._redraw())},p=function(){c(),setTimeout(c,100)},f=(n+s)/2,m=Math.max(this.range.end-this.range.start,1.1*(s-n)),v=!e||void 0===e.animation||e.animation;v||(l={shouldScroll:!1,scrollOffset:-1,itemTop:-1}),this.range.setRange(f-m/2,f+m/2,{animation:v},p,u)}}},o.prototype.fit=function(t,e){var i,o=!t||void 0===t.animation||t.animation,n=this.itemsData&&this.itemsData.getDataSet();1===n.length&&void 0===n.get()[0].end?(i=this.getDataRange(),this.moveTo(i.min.valueOf(),{animation:o},e)):(i=this.getItemRange(),this.range.setRange(i.min,i.max,{animation:o},e))},o.prototype.getItemRange=function(){var t=this.getDataRange(),e=null!==t.min?t.min.valueOf():null,i=null!==t.max?t.max.valueOf():null,o=null,r=null;if(null!=e&&null!=i){var a=i-e;a<=0&&(a=10);var d=a/this.props.center.width,l={},u=0;h.forEach(this.itemSet.items,function(t,e){if(t.groupShowing){l[e]=t.redraw(!0),u=l[e].length}});if(u>0)for(var c=0;ci&&(i=h,r=t)}.bind(this)),o&&r){var p=o.getWidthLeft()+10,f=r.getWidthRight()+10,m=this.props.center.width-p-f;m>0&&(this.options.rtl?(e=n(o)-f*a/m,i=s(r)+p*a/m):(e=n(o)-p*a/m,i=s(r)+f*a/m))}}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},o.prototype.getDataRange=function(){var t=null,e=null,i=this.itemsData&&this.itemsData.getDataSet();return i&&i.forEach(function(i){var o=h.convert(i.start,"Date").valueOf(),n=h.convert(void 0!=i.end?i.end:i.start,"Date").valueOf();(null===t||oe)&&(e=n)}),{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e,i=t.center?t.center.x:t.clientX,o=t.center?t.center.y:t.clientY;e=this.options.rtl?h.getAbsoluteRight(this.dom.centerContainer)-i:i-h.getAbsoluteLeft(this.dom.centerContainer);var n=o-h.getAbsoluteTop(this.dom.centerContainer),s=this.itemSet.itemFromTarget(t),r=this.itemSet.groupFromTarget(t),a=m.customTimeFromTarget(t),d=this.itemSet.options.snap||null,l=this.body.util.getScale(),u=this.body.util.getStep(),c=this._toTime(e),p=d?d(c,l,u):c,f=h.getTarget(t),v=null;return null!=s?v="item":null!=a?v="custom-time":h.hasParent(f,this.timeAxis.dom.foreground)?v="axis":this.timeAxis2&&h.hasParent(f,this.timeAxis2.dom.foreground)?v="axis":h.hasParent(f,this.itemSet.dom.labelSet)?v="group-label":h.hasParent(f,this.currentTime.bar)?v="current-time":h.hasParent(f,this.dom.center)&&(v="background"),{event:t,item:s?s.id:null,group:r?r.groupId:null,what:v,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:e,y:n,time:c,snappedTime:p}},o.prototype.toggleRollingMode=function(){this.range.rolling?this.range.stopRolling():(void 0==this.options.rollingMode&&this.setOptions(this.options),this.range.startRolling())},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(10),u=i(37),c=i(2),p=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;(0,a.default)(this,t),this.pixelRatio=e,this.generated=!1,this.centerCoordinates={x:144.5,y:144.5},this.r=289*.49,this.color={r:255,g:255,b:255,a:1},this.hueCircle=void 0,this.initialColor={r:255,g:255,b:255,a:1},this.previousColor=void 0,this.applied=!1,this.updateCallback=function(){},this.closeCallback=function(){},this._create()}return(0,d.default)(t,[{key:"insertTo",value:function(t){void 0!==this.hammer&&(this.hammer.destroy(),this.hammer=void 0),this.container=t,this.container.appendChild(this.frame),this._bindHammer(),this._setSize()}},{key:"setUpdateCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker update callback is not a function.");this.updateCallback=t}},{key:"setCloseCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker closing callback is not a function.");this.closeCallback=t}},{key:"_isColorString",value:function(t){var e={black:"#000000",navy:"#000080",darkblue:"#00008B",mediumblue:"#0000CD",blue:"#0000FF",darkgreen:"#006400",green:"#008000",teal:"#008080",darkcyan:"#008B8B",deepskyblue:"#00BFFF",darkturquoise:"#00CED1",mediumspringgreen:"#00FA9A",lime:"#00FF00",springgreen:"#00FF7F",aqua:"#00FFFF",cyan:"#00FFFF",midnightblue:"#191970",dodgerblue:"#1E90FF",lightseagreen:"#20B2AA",forestgreen:"#228B22",seagreen:"#2E8B57",darkslategray:"#2F4F4F",limegreen:"#32CD32",mediumseagreen:"#3CB371",turquoise:"#40E0D0",royalblue:"#4169E1",steelblue:"#4682B4",darkslateblue:"#483D8B",mediumturquoise:"#48D1CC",indigo:"#4B0082",darkolivegreen:"#556B2F",cadetblue:"#5F9EA0",cornflowerblue:"#6495ED",mediumaquamarine:"#66CDAA",dimgray:"#696969",slateblue:"#6A5ACD",olivedrab:"#6B8E23",slategray:"#708090",lightslategray:"#778899",mediumslateblue:"#7B68EE",lawngreen:"#7CFC00",chartreuse:"#7FFF00",aquamarine:"#7FFFD4",maroon:"#800000",purple:"#800080",olive:"#808000",gray:"#808080",skyblue:"#87CEEB",lightskyblue:"#87CEFA",blueviolet:"#8A2BE2",darkred:"#8B0000",darkmagenta:"#8B008B",saddlebrown:"#8B4513",darkseagreen:"#8FBC8F",lightgreen:"#90EE90",mediumpurple:"#9370D8",darkviolet:"#9400D3",palegreen:"#98FB98",darkorchid:"#9932CC",yellowgreen:"#9ACD32",sienna:"#A0522D",brown:"#A52A2A",darkgray:"#A9A9A9",lightblue:"#ADD8E6",greenyellow:"#ADFF2F",paleturquoise:"#AFEEEE",lightsteelblue:"#B0C4DE",powderblue:"#B0E0E6",firebrick:"#B22222",darkgoldenrod:"#B8860B",mediumorchid:"#BA55D3",rosybrown:"#BC8F8F",darkkhaki:"#BDB76B",silver:"#C0C0C0",mediumvioletred:"#C71585",indianred:"#CD5C5C",peru:"#CD853F",chocolate:"#D2691E",tan:"#D2B48C",lightgrey:"#D3D3D3",palevioletred:"#D87093",thistle:"#D8BFD8",orchid:"#DA70D6",goldenrod:"#DAA520",crimson:"#DC143C",gainsboro:"#DCDCDC",plum:"#DDA0DD",burlywood:"#DEB887",lightcyan:"#E0FFFF",lavender:"#E6E6FA",darksalmon:"#E9967A",violet:"#EE82EE",palegoldenrod:"#EEE8AA",lightcoral:"#F08080",khaki:"#F0E68C",aliceblue:"#F0F8FF",honeydew:"#F0FFF0",azure:"#F0FFFF",sandybrown:"#F4A460",wheat:"#F5DEB3",beige:"#F5F5DC",whitesmoke:"#F5F5F5",mintcream:"#F5FFFA",ghostwhite:"#F8F8FF",salmon:"#FA8072",antiquewhite:"#FAEBD7",linen:"#FAF0E6",lightgoldenrodyellow:"#FAFAD2",oldlace:"#FDF5E6",red:"#FF0000",fuchsia:"#FF00FF",magenta:"#FF00FF",deeppink:"#FF1493",orangered:"#FF4500",tomato:"#FF6347",hotpink:"#FF69B4",coral:"#FF7F50",darkorange:"#FF8C00",lightsalmon:"#FFA07A",orange:"#FFA500",lightpink:"#FFB6C1",pink:"#FFC0CB",gold:"#FFD700",peachpuff:"#FFDAB9",navajowhite:"#FFDEAD",moccasin:"#FFE4B5",bisque:"#FFE4C4",mistyrose:"#FFE4E1",blanchedalmond:"#FFEBCD",papayawhip:"#FFEFD5",lavenderblush:"#FFF0F5",seashell:"#FFF5EE",cornsilk:"#FFF8DC",lemonchiffon:"#FFFACD",floralwhite:"#FFFAF0",snow:"#FFFAFA",yellow:"#FFFF00",lightyellow:"#FFFFE0",ivory:"#FFFFF0",white:"#FFFFFF"};if("string"==typeof t)return e[t]}},{key:"setColor",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if("none"!==t){var i=void 0,o=this._isColorString(t);if(void 0!==o&&(t=o),!0===c.isString(t)){if(!0===c.isValidRGB(t)){var n=t.substr(4).substr(0,t.length-5).split(",");i={r:n[0],g:n[1],b:n[2],a:1}}else if(!0===c.isValidRGBA(t)){var r=t.substr(5).substr(0,t.length-6).split(",");i={r:r[0],g:r[1],b:r[2],a:r[3]}}else if(!0===c.isValidHex(t)){var a=c.hexToRGB(t);i={r:a.r,g:a.g,b:a.b,a:1}}}else if(t instanceof Object&&void 0!==t.r&&void 0!==t.g&&void 0!==t.b){var h=void 0!==t.a?t.a:"1.0";i={r:t.r,g:t.g,b:t.b,a:h}}if(void 0===i)throw new Error("Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: "+(0,s.default)(t));this._setColor(i,e)}}},{key:"show",value:function(){void 0!==this.closeCallback&&(this.closeCallback(),this.closeCallback=void 0),this.applied=!1,this.frame.style.display="block",this._generateHueCircle()}},{key:"_hide",value:function(){var t=this;!0===(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&(this.previousColor=c.extend({},this.color)),!0===this.applied&&this.updateCallback(this.initialColor),this.frame.style.display="none",setTimeout(function(){void 0!==t.closeCallback&&(t.closeCallback(),t.closeCallback=void 0)},0)}},{key:"_save",value:function(){this.updateCallback(this.color),this.applied=!1,this._hide()}},{key:"_apply",value:function(){this.applied=!0,this.updateCallback(this.color),this._updatePicker(this.color)}},{key:"_loadLast",value:function(){void 0!==this.previousColor?this.setColor(this.previousColor,!1):alert("There is no last color to load...")}},{key:"_setColor",value:function(t){!0===(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])&&(this.initialColor=c.extend({},t)),this.color=t;var e=c.RGBToHSV(t.r,t.g,t.b),i=2*Math.PI,o=this.r*e.s,n=this.centerCoordinates.x+o*Math.sin(i*e.h),s=this.centerCoordinates.y+o*Math.cos(i*e.h);this.colorPickerSelector.style.left=n-.5*this.colorPickerSelector.clientWidth+"px",this.colorPickerSelector.style.top=s-.5*this.colorPickerSelector.clientHeight+"px",this._updatePicker(t)}},{key:"_setOpacity",value:function(t){this.color.a=t/100,this._updatePicker(this.color)}},{key:"_setBrightness",value:function(t){var e=c.RGBToHSV(this.color.r,this.color.g,this.color.b);e.v=t/100;var i=c.HSVToRGB(e.h,e.s,e.v);i.a=this.color.a,this.color=i,this._updatePicker()}},{key:"_updatePicker",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.color,e=c.RGBToHSV(t.r,t.g,t.b),i=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1)),i.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var o=this.colorPickerCanvas.clientWidth,n=this.colorPickerCanvas.clientHeight;i.clearRect(0,0,o,n),i.putImageData(this.hueCircle,0,0),i.fillStyle="rgba(0,0,0,"+(1-e.v)+")",i.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r),i.fill(),this.brightnessRange.value=100*e.v,this.opacityRange.value=100*t.a,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}},{key:"_setSize",value:function(){this.colorPickerCanvas.style.width="100%",this.colorPickerCanvas.style.height="100%",this.colorPickerCanvas.width=289*this.pixelRatio,this.colorPickerCanvas.height=289*this.pixelRatio}},{key:"_create",value:function(){if(this.frame=document.createElement("div"),this.frame.className="vis-color-picker",this.colorPickerDiv=document.createElement("div"),this.colorPickerSelector=document.createElement("div"),this.colorPickerSelector.className="vis-selector",this.colorPickerDiv.appendChild(this.colorPickerSelector),this.colorPickerCanvas=document.createElement("canvas"),this.colorPickerDiv.appendChild(this.colorPickerCanvas),this.colorPickerCanvas.getContext){var t=this.colorPickerCanvas.getContext("2d") +function tt(t){return t&ve?"cancel":t&fe?"end":t&pe?"move":t&ce?"start":""}function et(t){return t==Lt?"down":t==zt?"up":t==Rt?"left":t==At?"right":""}function it(t,e){var i=e.manager;return i?i.get(t):t}function ot(){Q.apply(this,arguments)}function nt(){ot.apply(this,arguments),this.pX=null,this.pY=null}function st(){ot.apply(this,arguments)}function rt(){Q.apply(this,arguments),this._timer=null,this._input=null}function at(){ot.apply(this,arguments)}function ht(){ot.apply(this,arguments)}function dt(){Q.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function lt(t,e){return e=e||{},e.recognizers=m(e.recognizers,lt.defaults.preset),new ut(t,e)}function ut(t,e){this.options=ft({},lt.defaults,e||{}),this.options.inputTarget=this.options.inputTarget||t,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=t,this.input=O(this),this.touchAction=new J(this,this.options.touchAction),ct(this,!0),l(this.options.recognizers,function(t){var e=this.add(new t[0](t[1]));t[2]&&e.recognizeWith(t[2]),t[3]&&e.requireFailure(t[3])},this)}function ct(t,e){var i=t.element;if(i.style){var o;l(t.options.cssProps,function(n,s){o=S(i.style,s),e?(t.oldCssProps[o]=i.style[o],i.style[o]=n):i.style[o]=t.oldCssProps[o]||""}),e||(t.oldCssProps={})}}function pt(t,e){var i=s.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e,e.target.dispatchEvent(i)}var ft,mt=["","webkit","Moz","MS","ms","o"],vt=s.createElement("div"),gt="function",yt=Math.round,bt=Math.abs,_t=Date.now;ft="function"!=typeof Object.assign?function(t){if(t===a||null===t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),i=1;i-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function e(e){i.manager.emit(e,t)}var i=this,o=this.state;o=fe&&e(io.cucumber.core.event+tt(o))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0; te.threshold&&n&e.direction},attrTest:function(t){return ot.prototype.attrTest.call(this,t)&&(this.state&ce||!(this.state&ce)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=et(t.direction);e&&(t.additionalEvent=io.cucumber.core.event+e),this._super.emit.call(this,t)}}),c(st,ot,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&ce)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=io.cucumber.core.event+e}this._super.emit.call(this,t)}}),c(rt,Q,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[se]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distancee.time;if(this._input=t,!o||!i||t.eventType&(Pt|It)&&!n)this.reset();else if(t.eventType&Et)this.reset(),this._timer=h(function(){this.state=me,this.tryEmit()},e.time,this);else if(t.eventType&Pt)return me;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===me&&(t&&t.eventType&Pt?this.manager.emit(io.cucumber.core.event+"up",t):(this._input.timeStamp=_t(),this.manager.emit(io.cucumber.core.event,this._input)))}}),c(at,ot,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&ce)}}),c(ht,ot,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Ft|Bt,pointers:1},getTouchAction:function(){return nt.prototype.getTouchAction.call(this)},attrTest:function(t){var e,i=this.options.direction;return i&(Ft|Bt)?e=t.overallVelocity:i&Ft?e=t.overallVelocityX:i&Bt&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&i&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&bt(e)>this.options.velocity&&t.eventType&Pt},emit:function(t){var e=et(t.offsetDirection);e&&this.manager.emit(io.cucumber.core.event+e,t),this.manager.emit(io.cucumber.core.event,t)}}),c(dt,Q,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[re]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distanced+i?s+=h()+u-i+t.itemSet.options.margin.item.vertical:r=!1,s=Math.min(s,o-i),{shouldScroll:r,scrollOffset:s,itemTop:l}}var a=i(9),h=i(2),d=i(11),l=i(12),u=i(64),c=i(65),p=i(45),f=i(67),m=i(46),v=i(99),g=i(15).printStyle,y=i(105).allOptions,b=i(105).configureOptions,_=i(71).default,w=i(15).default;o.prototype=new c,o.prototype._createConfigurator=function(){return new _(this,this.dom.container,b)},o.prototype.redraw=function(){this.itemSet&&this.itemSet.markDirty({refreshItems:!0}),this._redraw()},o.prototype.setOptions=function(t){if(!0===w.validate(t,y)&&console.log("%cErrors have been found in the supplied options object.",g),c.prototype.setOptions.call(this,t),"type"in t&&t.type!==this.options.type){this.options.type=t.type;var e=this.itemsData;if(e){var i=this.getSelection();this.setItems(null),this.setItems(e),this.setSelection(i)}}},o.prototype.setItems=function(t){var e;e=t?t instanceof d||t instanceof l?t:new d(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e)},o.prototype.setGroups=function(t){var e;if(t){var i=function(t){return!1!==t.visible};e=t instanceof d||t instanceof l?new l(t,{filter:i}):new d(t.filter(i))}else e=null;this.groupsData=e,this.itemSet.setGroups(e)},o.prototype.setData=function(t){t&&t.groups&&this.setGroups(t.groups),t&&t.items&&this.setItems(t.items)},o.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t,e)},o.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},o.prototype.focus=function(t,e){if(this.itemsData&&void 0!=t){var i=Array.isArray(t)?t:[t],o=this.itemsData.getDataSet().get(i,{type:{start:"Date",end:"Date"}}),n=null,s=null;if(o.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===n||es)&&(s=i)}),null!==n&&null!==s){var a=this,h=this.itemSet.items[i[0]],d=-1*this._getScrollTop(),l=null,u=function(t,e,i){var o=r(a,h);if(l||(l=o),l.itemTop!=o.itemTop||l.shouldScroll){l.itemTop!=o.itemTop&&o.shouldScroll&&(l=o,d=-1*a._getScrollTop());var n=d,s=l.scrollOffset,u=i?s:n+(s-n)*t;a._setScrollTop(-u),e||a._redraw()}},c=function(){var t=r(a,h);t.shouldScroll&&t.itemTop!=l.itemTop&&(a._setScrollTop(-t.scrollOffset),a._redraw())},p=function(){c(),setTimeout(c,100)},f=(n+s)/2,m=Math.max(this.range.end-this.range.start,1.1*(s-n)),v=!e||void 0===e.animation||e.animation;v||(l={shouldScroll:!1,scrollOffset:-1,itemTop:-1}),this.range.setRange(f-m/2,f+m/2,{animation:v},p,u)}}},o.prototype.fit=function(t,e){var i,o=!t||void 0===t.animation||t.animation,n=this.itemsData&&this.itemsData.getDataSet();1===n.length&&void 0===n.get()[0].end?(i=this.getDataRange(),this.moveTo(i.min.valueOf(),{animation:o},e)):(i=this.getItemRange(),this.range.setRange(i.min,i.max,{animation:o},e))},o.prototype.getItemRange=function(){var t=this.getDataRange(),e=null!==t.min?t.min.valueOf():null,i=null!==t.max?t.max.valueOf():null,o=null,r=null;if(null!=e&&null!=i){var a=i-e;a<=0&&(a=10);var d=a/this.props.center.width,l={},u=0;h.forEach(this.itemSet.items,function(t,e){if(t.groupShowing){l[e]=t.redraw(!0),u=l[e].length}});if(u>0)for(var c=0;ci&&(i=h,r=t)}.bind(this)),o&&r){var p=o.getWidthLeft()+10,f=r.getWidthRight()+10,m=this.props.center.width-p-f;m>0&&(this.options.rtl?(e=n(o)-f*a/m,i=s(r)+p*a/m):(e=n(o)-p*a/m,i=s(r)+f*a/m))}}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},o.prototype.getDataRange=function(){var t=null,e=null,i=this.itemsData&&this.itemsData.getDataSet();return i&&i.forEach(function(i){var o=h.convert(i.start,"Date").valueOf(),n=h.convert(void 0!=i.end?i.end:i.start,"Date").valueOf();(null===t||oe)&&(e=n)}),{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e,i=t.center?t.center.x:t.clientX,o=t.center?t.center.y:t.clientY;e=this.options.rtl?h.getAbsoluteRight(this.dom.centerContainer)-i:i-h.getAbsoluteLeft(this.dom.centerContainer);var n=o-h.getAbsoluteTop(this.dom.centerContainer),s=this.itemSet.itemFromTarget(t),r=this.itemSet.groupFromTarget(t),a=m.customTimeFromTarget(t),d=this.itemSet.options.snap||null,l=this.body.util.getScale(),u=this.body.util.getStep(),c=this._toTime(e),p=d?d(c,l,u):c,f=h.getTarget(t),v=null;return null!=s?v="item":null!=a?v="custom-time":h.hasParent(f,this.timeAxis.dom.foreground)?v="axis":this.timeAxis2&&h.hasParent(f,this.timeAxis2.dom.foreground)?v="axis":h.hasParent(f,this.itemSet.dom.labelSet)?v="group-label":h.hasParent(f,this.currentTime.bar)?v="current-time":h.hasParent(f,this.dom.center)&&(v="background"),{event:t,item:s?s.id:null,group:r?r.groupId:null,what:v,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:e,y:n,time:c,snappedTime:p}},o.prototype.toggleRollingMode=function(){this.range.rolling?this.range.stopRolling():(void 0==this.options.rollingMode&&this.setOptions(this.options),this.range.startRolling())},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(10),u=i(37),c=i(2),p=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;(0,a.default)(this,t),this.pixelRatio=e,this.generated=!1,this.centerCoordinates={x:144.5,y:144.5},this.r=289*.49,this.color={r:255,g:255,b:255,a:1},this.hueCircle=void 0,this.initialColor={r:255,g:255,b:255,a:1},this.previousColor=void 0,this.applied=!1,this.updateCallback=function(){},this.closeCallback=function(){},this._create()}return(0,d.default)(t,[{key:"insertTo",value:function(t){void 0!==this.hammer&&(this.hammer.destroy(),this.hammer=void 0),this.container=t,this.container.appendChild(this.frame),this._bindHammer(),this._setSize()}},{key:"setUpdateCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker update callback is not a function.");this.updateCallback=t}},{key:"setCloseCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker closing callback is not a function.");this.closeCallback=t}},{key:"_isColorString",value:function(t){var e={black:"#000000",navy:"#000080",darkblue:"#00008B",mediumblue:"#0000CD",blue:"#0000FF",darkgreen:"#006400",green:"#008000",teal:"#008080",darkcyan:"#008B8B",deepskyblue:"#00BFFF",darkturquoise:"#00CED1",mediumspringgreen:"#00FA9A",lime:"#00FF00",springgreen:"#00FF7F",aqua:"#00FFFF",cyan:"#00FFFF",midnightblue:"#191970",dodgerblue:"#1E90FF",lightseagreen:"#20B2AA",forestgreen:"#228B22",seagreen:"#2E8B57",darkslategray:"#2F4F4F",limegreen:"#32CD32",mediumseagreen:"#3CB371",turquoise:"#40E0D0",royalblue:"#4169E1",steelblue:"#4682B4",darkslateblue:"#483D8B",mediumturquoise:"#48D1CC",indigo:"#4B0082",darkolivegreen:"#556B2F",cadetblue:"#5F9EA0",cornflowerblue:"#6495ED",mediumaquamarine:"#66CDAA",dimgray:"#696969",slateblue:"#6A5ACD",olivedrab:"#6B8E23",slategray:"#708090",lightslategray:"#778899",mediumslateblue:"#7B68EE",lawngreen:"#7CFC00",chartreuse:"#7FFF00",aquamarine:"#7FFFD4",maroon:"#800000",purple:"#800080",olive:"#808000",gray:"#808080",skyblue:"#87CEEB",lightskyblue:"#87CEFA",blueviolet:"#8A2BE2",darkred:"#8B0000",darkmagenta:"#8B008B",saddlebrown:"#8B4513",darkseagreen:"#8FBC8F",lightgreen:"#90EE90",mediumpurple:"#9370D8",darkviolet:"#9400D3",palegreen:"#98FB98",darkorchid:"#9932CC",yellowgreen:"#9ACD32",sienna:"#A0522D",brown:"#A52A2A",darkgray:"#A9A9A9",lightblue:"#ADD8E6",greenyellow:"#ADFF2F",paleturquoise:"#AFEEEE",lightsteelblue:"#B0C4DE",powderblue:"#B0E0E6",firebrick:"#B22222",darkgoldenrod:"#B8860B",mediumorchid:"#BA55D3",rosybrown:"#BC8F8F",darkkhaki:"#BDB76B",silver:"#C0C0C0",mediumvioletred:"#C71585",indianred:"#CD5C5C",peru:"#CD853F",chocolate:"#D2691E",tan:"#D2B48C",lightgrey:"#D3D3D3",palevioletred:"#D87093",thistle:"#D8BFD8",orchid:"#DA70D6",goldenrod:"#DAA520",crimson:"#DC143C",gainsboro:"#DCDCDC",plum:"#DDA0DD",burlywood:"#DEB887",lightcyan:"#E0FFFF",lavender:"#E6E6FA",darksalmon:"#E9967A",violet:"#EE82EE",palegoldenrod:"#EEE8AA",lightcoral:"#F08080",khaki:"#F0E68C",aliceblue:"#F0F8FF",honeydew:"#F0FFF0",azure:"#F0FFFF",sandybrown:"#F4A460",wheat:"#F5DEB3",beige:"#F5F5DC",whitesmoke:"#F5F5F5",mintcream:"#F5FFFA",ghostwhite:"#F8F8FF",salmon:"#FA8072",antiquewhite:"#FAEBD7",linen:"#FAF0E6",lightgoldenrodyellow:"#FAFAD2",oldlace:"#FDF5E6",red:"#FF0000",fuchsia:"#FF00FF",magenta:"#FF00FF",deeppink:"#FF1493",orangered:"#FF4500",tomato:"#FF6347",hotpink:"#FF69B4",coral:"#FF7F50",darkorange:"#FF8C00",lightsalmon:"#FFA07A",orange:"#FFA500",lightpink:"#FFB6C1",pink:"#FFC0CB",gold:"#FFD700",peachpuff:"#FFDAB9",navajowhite:"#FFDEAD",moccasin:"#FFE4B5",bisque:"#FFE4C4",mistyrose:"#FFE4E1",blanchedalmond:"#FFEBCD",papayawhip:"#FFEFD5",lavenderblush:"#FFF0F5",seashell:"#FFF5EE",cornsilk:"#FFF8DC",lemonchiffon:"#FFFACD",floralwhite:"#FFFAF0",snow:"#FFFAFA",yellow:"#FFFF00",lightyellow:"#FFFFE0",ivory:"#FFFFF0",white:"#FFFFFF"};if("string"==typeof t)return e[t]}},{key:"setColor",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if("none"!==t){var i=void 0,o=this._isColorString(t);if(void 0!==o&&(t=o),!0===c.isString(t)){if(!0===c.isValidRGB(t)){var n=t.substr(4).substr(0,t.length-5).split(",");i={r:n[0],g:n[1],b:n[2],a:1}}else if(!0===c.isValidRGBA(t)){var r=t.substr(5).substr(0,t.length-6).split(",");i={r:r[0],g:r[1],b:r[2],a:r[3]}}else if(!0===c.isValidHex(t)){var a=c.hexToRGB(t);i={r:a.r,g:a.g,b:a.b,a:1}}}else if(t instanceof Object&&void 0!==t.r&&void 0!==t.g&&void 0!==t.b){var h=void 0!==t.a?t.a:"1.0";i={r:t.r,g:t.g,b:t.b,a:h}}if(void 0===i)throw new Error("Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: "+(0,s.default)(t));this._setColor(i,e)}}},{key:"show",value:function(){void 0!==this.closeCallback&&(this.closeCallback(),this.closeCallback=void 0),this.applied=!1,this.frame.style.display="block",this._generateHueCircle()}},{key:"_hide",value:function(){var t=this;!0===(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&(this.previousColor=c.extend({},this.color)),!0===this.applied&&this.updateCallback(this.initialColor),this.frame.style.display="none",setTimeout(function(){void 0!==t.closeCallback&&(t.closeCallback(),t.closeCallback=void 0)},0)}},{key:"_save",value:function(){this.updateCallback(this.color),this.applied=!1,this._hide()}},{key:"_apply",value:function(){this.applied=!0,this.updateCallback(this.color),this._updatePicker(this.color)}},{key:"_loadLast",value:function(){void 0!==this.previousColor?this.setColor(this.previousColor,!1):alert("There is no last color to load...")}},{key:"_setColor",value:function(t){!0===(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])&&(this.initialColor=c.extend({},t)),this.color=t;var e=c.RGBToHSV(t.r,t.g,t.b),i=2*Math.PI,o=this.r*e.s,n=this.centerCoordinates.x+o*Math.sin(i*e.h),s=this.centerCoordinates.y+o*Math.cos(i*e.h);this.colorPickerSelector.style.left=n-.5*this.colorPickerSelector.clientWidth+"px",this.colorPickerSelector.style.top=s-.5*this.colorPickerSelector.clientHeight+"px",this._updatePicker(t)}},{key:"_setOpacity",value:function(t){this.color.a=t/100,this._updatePicker(this.color)}},{key:"_setBrightness",value:function(t){var e=c.RGBToHSV(this.color.r,this.color.g,this.color.b);e.v=t/100;var i=c.HSVToRGB(e.h,e.s,e.v);i.a=this.color.a,this.color=i,this._updatePicker()}},{key:"_updatePicker",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.color,e=c.RGBToHSV(t.r,t.g,t.b),i=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1)),i.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var o=this.colorPickerCanvas.clientWidth,n=this.colorPickerCanvas.clientHeight;i.clearRect(0,0,o,n),i.putImageData(this.hueCircle,0,0),i.fillStyle="rgba(0,0,0,"+(1-e.v)+")",i.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r),i.fill(),this.brightnessRange.value=100*e.v,this.opacityRange.value=100*t.a,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}},{key:"_setSize",value:function(){this.colorPickerCanvas.style.width="100%",this.colorPickerCanvas.style.height="100%",this.colorPickerCanvas.width=289*this.pixelRatio,this.colorPickerCanvas.height=289*this.pixelRatio}},{key:"_create",value:function(){if(this.frame=document.createElement("div"),this.frame.className="vis-color-picker",this.colorPickerDiv=document.createElement("div"),this.colorPickerSelector=document.createElement("div"),this.colorPickerSelector.className="vis-selector",this.colorPickerDiv.appendChild(this.colorPickerSelector),this.colorPickerCanvas=document.createElement("canvas"),this.colorPickerDiv.appendChild(this.colorPickerCanvas),this.colorPickerCanvas.getContext){var t=this.colorPickerCanvas.getContext("2d") ;this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1),this.colorPickerCanvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{var e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerHTML="Error: your browser does not support HTML canvas",this.colorPickerCanvas.appendChild(e)}this.colorPickerDiv.className="vis-color",this.opacityDiv=document.createElement("div"),this.opacityDiv.className="vis-opacity",this.brightnessDiv=document.createElement("div"),this.brightnessDiv.className="vis-brightness",this.arrowDiv=document.createElement("div"),this.arrowDiv.className="vis-arrow",this.opacityRange=document.createElement("input");try{this.opacityRange.type="range",this.opacityRange.min="0",this.opacityRange.max="100"}catch(t){}this.opacityRange.value="100",this.opacityRange.className="vis-range",this.brightnessRange=document.createElement("input");try{this.brightnessRange.type="range",this.brightnessRange.min="0",this.brightnessRange.max="100"}catch(t){}this.brightnessRange.value="100",this.brightnessRange.className="vis-range",this.opacityDiv.appendChild(this.opacityRange),this.brightnessDiv.appendChild(this.brightnessRange);var i=this;this.opacityRange.onchange=function(){i._setOpacity(this.value)},this.opacityRange.oninput=function(){i._setOpacity(this.value)},this.brightnessRange.onchange=function(){i._setBrightness(this.value)},this.brightnessRange.oninput=function(){i._setBrightness(this.value)},this.brightnessLabel=document.createElement("div"),this.brightnessLabel.className="vis-label vis-brightness",this.brightnessLabel.innerHTML="brightness:",this.opacityLabel=document.createElement("div"),this.opacityLabel.className="vis-label vis-opacity",this.opacityLabel.innerHTML="opacity:",this.newColorDiv=document.createElement("div"),this.newColorDiv.className="vis-new-color",this.newColorDiv.innerHTML="new",this.initialColorDiv=document.createElement("div"),this.initialColorDiv.className="vis-initial-color",this.initialColorDiv.innerHTML="initial",this.cancelButton=document.createElement("div"),this.cancelButton.className="vis-button vis-cancel",this.cancelButton.innerHTML="cancel",this.cancelButton.onclick=this._hide.bind(this,!1),this.applyButton=document.createElement("div"),this.applyButton.className="vis-button vis-apply",this.applyButton.innerHTML="apply",this.applyButton.onclick=this._apply.bind(this),this.saveButton=document.createElement("div"),this.saveButton.className="vis-button vis-save",this.saveButton.innerHTML="save",this.saveButton.onclick=this._save.bind(this),this.loadButton=document.createElement("div"),this.loadButton.className="vis-button vis-load",this.loadButton.innerHTML="load last",this.loadButton.onclick=this._loadLast.bind(this),this.frame.appendChild(this.colorPickerDiv),this.frame.appendChild(this.arrowDiv),this.frame.appendChild(this.brightnessLabel),this.frame.appendChild(this.brightnessDiv),this.frame.appendChild(this.opacityLabel),this.frame.appendChild(this.opacityDiv),this.frame.appendChild(this.newColorDiv),this.frame.appendChild(this.initialColorDiv),this.frame.appendChild(this.cancelButton),this.frame.appendChild(this.applyButton),this.frame.appendChild(this.saveButton),this.frame.appendChild(this.loadButton)}},{key:"_bindHammer",value:function(){var t=this;this.drag={},this.pinch={},this.hammer=new l(this.colorPickerCanvas),this.hammer.get("pinch").set({enable:!0}),u.onTouch(this.hammer,function(e){t._moveSelector(e)}),this.hammer.on("tap",function(e){t._moveSelector(e)}),this.hammer.on("panstart",function(e){t._moveSelector(e)}),this.hammer.on("panmove",function(e){t._moveSelector(e)}),this.hammer.on("panend",function(e){t._moveSelector(e)})}},{key:"_generateHueCircle",value:function(){if(!1===this.generated){var t=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)),t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var e=this.colorPickerCanvas.clientWidth,i=this.colorPickerCanvas.clientHeight;t.clearRect(0,0,e,i);var o=void 0,n=void 0,s=void 0,r=void 0;this.centerCoordinates={x:.5*e,y:.5*i},this.r=.49*e;var a=2*Math.PI/360,h=1/this.r,d=void 0;for(s=0;s<360;s++)for(r=0;rr?r:t,e=null==e?r:e0&&l.push(u.screenToValue(n)),!p.hidden&&this.itemsData.length>0&&l.push(p.screenToValue(n)),{event:t,what:d,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:o,y:n,time:r,value:l}},o.prototype._createConfigurator=function(){return new g(this,this.dom.container,v)},t.exports=o},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Network=i(182),e.network={Images:i(116),dotparser:i(114),gephiParser:i(115),allOptions:i(122)},e.network.convertDot=function(t){return e.network.dotparser.DOTToGraph(t)},e.network.convertGephi=function(t,i){return e.network.gephiParser.parseGephi(t,i)},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){function o(t,e,i){var n=this;if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.options={},this.defaultOptions={locale:"en",locales:d,clickToUse:!1},s.extend(this.options,this.defaultOptions),this.body={container:t,nodes:{},nodeIndices:[],edges:{},edgeIndices:[],emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this),once:this.once.bind(this)},eventListeners:{onTap:function(){},onTouch:function(){},onDoubleTap:function(){},onHold:function(){},onDragStart:function(){},onDrag:function(){},onDragEnd:function(){},onMouseWheel:function(){},onPinch:function(){},onMouseMove:function(){},onRelease:function(){},onContext:function(){}},data:{nodes:null,edges:null},functions:{createNode:function(){},createEdge:function(){},getPointer:function(){}},modules:{},view:{scale:1,translation:{x:0,y:0}}},this.bindEventListeners(),this.images=new l(function(){return n.body.emitter.emit("_requestRedraw")}),this.groups=new u,this.canvas=new g(this.body),this.selectionHandler=new _(this.body,this.canvas),this.interactionHandler=new b(this.body,this.canvas,this.selectionHandler),this.view=new y(this.body,this.canvas),this.renderer=new v(this.body,this.canvas),this.physics=new f(this.body),this.layoutEngine=new w(this.body),this.clustering=new m(this.body),this.manipulation=new x(this.body,this.canvas,this.selectionHandler),this.nodesHandler=new c(this.body,this.images,this.groups,this.layoutEngine),this.edgesHandler=new p(this.body,this.images,this.groups),this.body.modules.kamadaKawai=new T(this.body,150,.05),this.body.modules.clustering=this.clustering,this.canvas._create(),this.setOptions(i),this.setData(e)}i(183);var n=i(44),s=i(2),r=i(114),a=i(115),h=i(97),d=i(184),l=i(116).default,u=i(186).default,c=i(187).default,p=i(214).default,f=i(220).default,m=i(227).default,v=i(229).default,g=i(230).default,y=i(231).default,b=i(232).default,_=i(234).default,w=i(235).default,x=i(237).default,k=i(71).default,S=i(15).default,D=i(15),M=D.printStyle,C=i(122),O=C.allOptions,E=C.configureOptions,T=i(238).default;n(o.prototype),o.prototype.setOptions=function(t){var e=this;if(void 0!==t){!0===S.validate(t,O)&&console.log("%cErrors have been found in the supplied options object.",M);var i=["locale","locales","clickToUse"];if(s.selectiveDeepExtend(i,this.options,t),t=this.layoutEngine.setOptions(t.layout,t),this.canvas.setOptions(t),this.groups.setOptions(t.groups),this.nodesHandler.setOptions(t.nodes),this.edgesHandler.setOptions(t.edges),this.physics.setOptions(t.physics),this.manipulation.setOptions(t.manipulation,t,this.options),this.interactionHandler.setOptions(t.interaction),this.renderer.setOptions(t.interaction),this.selectionHandler.setOptions(t.interaction),void 0!==t.groups&&this.body.emitter.emit("refreshNodes"),"configure"in t&&(this.configurator||(this.configurator=new k(this,this.body.container,E,this.canvas.pixelRatio)),this.configurator.setOptions(t.configure)),this.configurator&&!0===this.configurator.options.enabled){var o={nodes:{},edges:{},layout:{},interaction:{},manipulation:{},physics:{},global:{}};s.deepExtend(o.nodes,this.nodesHandler.options),s.deepExtend(o.edges,this.edgesHandler.options),s.deepExtend(o.layout,this.layoutEngine.options),s.deepExtend(o.interaction,this.selectionHandler.options),s.deepExtend(o.interaction,this.renderer.options),s.deepExtend(o.interaction,this.interactionHandler.options),s.deepExtend(o.manipulation,this.manipulation.options),s.deepExtend(o.physics,this.physics.options),s.deepExtend(o.global,this.canvas.options),s.deepExtend(o.global,this.options),this.configurator.setModuleOptions(o)}void 0!==t.clickToUse?!0===t.clickToUse?void 0===this.activator&&(this.activator=new h(this.canvas.frame),this.activator.on("change",function(){e.body.emitter.emit("activate")})):(void 0!==this.activator&&(this.activator.destroy(),delete this.activator),this.body.emitter.emit("activate")):this.body.emitter.emit("activate"),this.canvas.setSize(),this.body.emitter.emit("startSimulation")}},o.prototype._updateVisibleIndices=function(){var t=this.body.nodes,e=this.body.edges;this.body.nodeIndices=[],this.body.edgeIndices=[];for(var i in t)t.hasOwnProperty(i)&&(this.clustering._isClusteredNode(i)||!1!==t[i].options.hidden||this.body.nodeIndices.push(t[i].id));for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],s=t[n.fromId],r=t[n.toId],a=void 0!==s&&void 0!==r,h=!this.clustering._isClusteredEdge(o)&&!1===n.options.hidden&&a&&!1===s.options.hidden&&!1===r.options.hidden;h&&this.body.edgeIndices.push(n.id)}},o.prototype.bindEventListeners=function(){var t=this;this.body.emitter.on("_dataChanged",function(){t.edgesHandler._updateState(),t.body.emitter.emit("_dataUpdated")}),this.body.emitter.on("_dataUpdated",function(){t.clustering._updateState(),t._updateVisibleIndices(),t._updateValueRange(t.body.nodes),t._updateValueRange(t.body.edges),t.body.emitter.emit("startSimulation"),t.body.emitter.emit("_requestRedraw")})},o.prototype.setData=function(t){if(this.body.emitter.emit("resetPhysics"),this.body.emitter.emit("_resetData"),this.selectionHandler.unselectAll(),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){console.log("The dot property has been deprecated. Please use the static convertDot method to convert DOT into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertDot(dotString);");var e=r.DOTToGraph(t.dot);return void this.setData(e)}if(t&&t.gephi){console.log("The gephi property has been deprecated. Please use the static convertGephi method to convert gephi into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertGephi(gephiJson);");var i=a.parseGephi(t.gephi);return void this.setData(i)}this.nodesHandler.setData(t&&t.nodes,!0),this.edgesHandler.setData(t&&t.edges,!0),this.body.emitter.emit("_dataChanged"),this.body.emitter.emit("_dataLoaded"),this.body.emitter.emit("initPhysics")},o.prototype.destroy=function(){this.body.emitter.emit("destroy"),this.body.emitter.off(),this.off(),delete this.groups,delete this.canvas,delete this.selectionHandler,delete this.interactionHandler,delete this.view,delete this.renderer,delete this.physics,delete this.layoutEngine,delete this.clustering,delete this.manipulation,delete this.nodesHandler,delete this.edgesHandler,delete this.configurator,delete this.images;for(var t in this.body.nodes)this.body.nodes.hasOwnProperty(t)&&delete this.body.nodes[t];for(var e in this.body.edges)this.body.edges.hasOwnProperty(e)&&delete this.body.edges[e];s.recursiveDOMDelete(this.body.container)},o.prototype._updateValueRange=function(t){var e,i=void 0,o=void 0,n=0;for(e in t)if(t.hasOwnProperty(e)){var s=t[e].getValue();void 0!==s&&(i=void 0===i?s:Math.min(s,i),o=void 0===o?s:Math.max(s,o),n+=s)}if(void 0!==i&&void 0!==o)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,o,n)},o.prototype.isActive=function(){return!this.activator||this.activator.active},o.prototype.setSize=function(){return this.canvas.setSize.apply(this.canvas,arguments)},o.prototype.canvasToDOM=function(){return this.canvas.canvasToDOM.apply(this.canvas,arguments)},o.prototype.DOMtoCanvas=function(){return this.canvas.DOMtoCanvas.apply(this.canvas,arguments)},o.prototype.findNode=function(){return this.clustering.findNode.apply(this.clustering,arguments)},o.prototype.isCluster=function(){return this.clustering.isCluster.apply(this.clustering,arguments)},o.prototype.openCluster=function(){return this.clustering.openCluster.apply(this.clustering,arguments)},o.prototype.cluster=function(){return this.clustering.cluster.apply(this.clustering,arguments)},o.prototype.getNodesInCluster=function(){return this.clustering.getNodesInCluster.apply(this.clustering,arguments)},o.prototype.clusterByConnection=function(){return this.clustering.clusterByConnection.apply(this.clustering,arguments)},o.prototype.clusterByHubsize=function(){return this.clustering.clusterByHubsize.apply(this.clustering,arguments)},o.prototype.clusterOutliers=function(){return this.clustering.clusterOutliers.apply(this.clustering,arguments)},o.prototype.getSeed=function(){return this.layoutEngine.getSeed.apply(this.layoutEngine,arguments)},o.prototype.enableEditMode=function(){return this.manipulation.enableEditMode.apply(this.manipulation,arguments)},o.prototype.disableEditMode=function(){return this.manipulation.disableEditMode.apply(this.manipulation,arguments)},o.prototype.addNodeMode=function(){return this.manipulation.addNodeMode.apply(this.manipulation,arguments)},o.prototype.editNode=function(){return this.manipulation.editNode.apply(this.manipulation,arguments)},o.prototype.editNodeMode=function(){return console.log("Deprecated: Please use editNode instead of editNodeMode."),this.manipulation.editNode.apply(this.manipulation,arguments)},o.prototype.addEdgeMode=function(){return this.manipulation.addEdgeMode.apply(this.manipulation,arguments)},o.prototype.editEdgeMode=function(){return this.manipulation.editEdgeMode.apply(this.manipulation,arguments)},o.prototype.deleteSelected=function(){return this.manipulation.deleteSelected.apply(this.manipulation,arguments)},o.prototype.getPositions=function(){return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments)},o.prototype.storePositions=function(){return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments)},o.prototype.moveNode=function(){return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments)},o.prototype.getBoundingBox=function(){return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments)},o.prototype.getConnectedNodes=function(t){return void 0!==this.body.nodes[t]?this.nodesHandler.getConnectedNodes.apply(this.nodesHandler,arguments):this.edgesHandler.getConnectedNodes.apply(this.edgesHandler,arguments)},o.prototype.getConnectedEdges=function(){return this.nodesHandler.getConnectedEdges.apply(this.nodesHandler,arguments)},o.prototype.startSimulation=function(){return this.physics.startSimulation.apply(this.physics,arguments)},o.prototype.stopSimulation=function(){return this.physics.stopSimulation.apply(this.physics,arguments)},o.prototype.stabilize=function(){return this.physics.stabilize.apply(this.physics,arguments)},o.prototype.getSelection=function(){return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments)},o.prototype.setSelection=function(){return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments)},o.prototype.getSelectedNodes=function(){return this.selectionHandler.getSelectedNodes.apply(this.selectionHandler,arguments)},o.prototype.getSelectedEdges=function(){return this.selectionHandler.getSelectedEdges.apply(this.selectionHandler,arguments)},o.prototype.getNodeAt=function(){var t=this.selectionHandler.getNodeAt.apply(this.selectionHandler,arguments);return void 0!==t&&void 0!==t.id?t.id:t},o.prototype.getEdgeAt=function(){var t=this.selectionHandler.getEdgeAt.apply(this.selectionHandler,arguments);return void 0!==t&&void 0!==t.id?t.id:t},o.prototype.selectNodes=function(){return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments)},o.prototype.selectEdges=function(){return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments)},o.prototype.unselectAll=function(){this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments),this.redraw()},o.prototype.redraw=function(){return this.renderer.redraw.apply(this.renderer,arguments)},o.prototype.getScale=function(){return this.view.getScale.apply(this.view,arguments)},o.prototype.getViewPosition=function(){return this.view.getViewPosition.apply(this.view,arguments)},o.prototype.fit=function(){return this.view.fit.apply(this.view,arguments)},o.prototype.moveTo=function(){return this.view.moveTo.apply(this.view,arguments)},o.prototype.focus=function(){return this.view.focus.apply(this.view,arguments)},o.prototype.releaseNode=function(){return this.view.releaseNode.apply(this.view,arguments)},o.prototype.getOptionsFromConfigurator=function(){var t={};return this.configurator&&(t=this.configurator.getOptions.apply(this.configurator)),t},t.exports=o},function(t,e,i){"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1),this.closePath()},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i),this.closePath()},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath(),i*=1.15,e+=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e-(r-s)),this.lineTo(t+n,e+s),this.lineTo(t-n,e+s),this.lineTo(t,e-(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath(),i*=1.15,e-=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e+(r-s)),this.lineTo(t+n,e-s),this.lineTo(t-n,e-s),this.lineTo(t,e+(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath(),i*=.82,e+=.1*i;for(var o=0;o<10;o++){var n=o%2==0?1.3*i:.5*i;this.lineTo(t+n*Math.sin(2*o*Math.PI/10),e-n*Math.cos(2*o*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.diamond=function(t,e,i){this.beginPath(),this.lineTo(t,e+i),this.lineTo(t+i,e),this.lineTo(t,e-i),this.lineTo(t-i,e),this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,o,n){var s=Math.PI/180;i-2*n<0&&(n=i/2),o-2*n<0&&(n=o/2),this.beginPath(),this.moveTo(t+n,e),this.lineTo(t+i-n,e),this.arc(t+i-n,e+n,n,270*s,360*s,!1),this.lineTo(t+i,e+o-n),this.arc(t+i-n,e+o-n,n,0,90*s,!1),this.lineTo(t+n,e+o),this.arc(t+n,e+o-n,n,90*s,180*s,!1),this.lineTo(t,e+n),this.arc(t+n,e+n,n,180*s,270*s,!1),this.closePath()},CanvasRenderingContext2D.prototype.ellipse_vis=function(t,e,i,o){var n=i/2*.5522848,s=o/2*.5522848,r=t+i,a=e+o,h=t+i/2,d=e+o/2;this.beginPath(),this.moveTo(t,d),this.bezierCurveTo(t,d-s,h-n,e,h,e),this.bezierCurveTo(h+n,e,r,d-s,r,d),this.bezierCurveTo(r,d+s,h+n,a,h,a),this.bezierCurveTo(h-n,a,t,d+s,t,d),this.closePath()},CanvasRenderingContext2D.prototype.database=function(t,e,i,o){var n=i,s=o*(1/3),r=n/2*.5522848,a=s/2*.5522848,h=t+n,d=e+s,l=t+n/2,u=e+s/2,c=e+(o-s/2),p=e+o;this.beginPath(),this.moveTo(h,u),this.bezierCurveTo(h,u+a,l+r,d,l,d),this.bezierCurveTo(l-r,d,t,u+a,t,u),this.bezierCurveTo(t,u-a,l-r,e,l,e),this.bezierCurveTo(l+r,e,h,u-a,h,u),this.lineTo(h,c),this.bezierCurveTo(h,c+a,l+r,p,l,p),this.bezierCurveTo(l-r,p,t,c+a,t,c),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,o,n){this.beginPath(),this.moveTo(t,e);for(var s=n.length,r=i-t,a=o-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,u=!0,c=0,p=n[0];d>=.1;)p=n[l++%s],p>d&&(p=d),c=Math.sqrt(p*p/(1+h*h)),c=r<0?-c:c,t+=c,e+=h*c,!0===u?this.lineTo(t,e):this.moveTo(t,e),d-=p,u=!u},CanvasRenderingContext2D.prototype.hexagon=function(t,e,i){this.beginPath();var o=2*Math.PI/6;this.moveTo(t+i,e);for(var n=1;n<6;n++)this.lineTo(t+i*Math.cos(o*n),e+i*Math.sin(o*n));this.closePath()})},function(t,e,i){e.en={edit:"Edit",del:"Delete selected",back:"Back",addNode:"Add Node",addEdge:"Add Edge",editNode:"Edit Node",editEdge:"Edit Edge",addDescription:"Click in an empty space to place a new node.",edgeDescription:"Click on a node and drag the edge to another node to connect them.",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",createEdgeError:"Cannot link edges to a cluster.",deleteClusterError:"Clusters cannot be deleted.",editClusterError:"Clusters cannot be edited."},e.en_EN=e.en,e.en_US=e.en,e.de={edit:"Editieren",del:"Lösche Auswahl",back:"Zurück",addNode:"Knoten hinzufügen",addEdge:"Kante hinzufügen",editNode:"Knoten editieren",editEdge:"Kante editieren",addDescription:"Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.",edgeDescription:"Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.",editEdgeDescription:"Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.",createEdgeError:"Es ist nicht möglich, Kanten mit Clustern zu verbinden.",deleteClusterError:"Cluster können nicht gelöscht werden.",editClusterError:"Cluster können nicht editiert werden."},e.de_DE=e.de,e.es={edit:"Editar",del:"Eliminar selección",back:"Ãtras",addNode:"Añadir nodo",addEdge:"Añadir arista",editNode:"Editar nodo",editEdge:"Editar arista",addDescription:"Haga clic en un lugar vacío para colocar un nuevo nodo.",edgeDescription:"Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.",editEdgeDescription:"Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.",createEdgeError:"No se puede conectar una arista a un grupo.",deleteClusterError:"No es posible eliminar grupos.",editClusterError:"No es posible editar grupos."},e.es_ES=e.es,e.it={edit:"Modifica",del:"Cancella la selezione",back:"Indietro",addNode:"Aggiungi un nodo",addEdge:"Aggiungi un vertice",editNode:"Modifica il nodo",editEdge:"Modifica il vertice",addDescription:"Clicca per aggiungere un nuovo nodo",edgeDescription:"Clicca su un nodo e trascinalo ad un altro nodo per connetterli.",editEdgeDescription:"Clicca sui Punti di controllo e trascinali ad un nodo per connetterli.",createEdgeError:"Non si possono collegare vertici ad un cluster",deleteClusterError:"I cluster non possono essere cancellati",editClusterError:"I clusters non possono essere modificati."},e.it_IT=e.it,e.nl={edit:"Wijzigen",del:"Selectie verwijderen",back:"Terug",addNode:"Node toevoegen",addEdge:"Link toevoegen",editNode:"Node wijzigen",editEdge:"Link wijzigen",addDescription:"Klik op een leeg gebied om een nieuwe node te maken.",edgeDescription:"Klik op een node en sleep de link naar een andere node om ze te verbinden.",editEdgeDescription:"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.",createEdgeError:"Kan geen link maken naar een cluster.",deleteClusterError:"Clusters kunnen niet worden verwijderd.",editClusterError:"Clusters kunnen niet worden aangepast."},e.nl_NL=e.nl,e.nl_BE=e.nl,e["pt-br"]={edit:"Editar",del:"Remover selecionado",back:"Voltar",addNode:"Adicionar nó",addEdge:"Adicionar aresta",editNode:"Editar nó",editEdge:"Editar aresta",addDescription:"Clique em um espaço em branco para adicionar um novo nó",edgeDescription:"Clique em um nó e arraste a aresta até outro nó para conectá-los",editEdgeDescription:"Clique nos pontos de controle e os arraste para um nó para conectá-los",createEdgeError:"Não foi possível linkar arestas a um cluster.",deleteClusterError:"Clusters não puderam ser removidos.",editClusterError:"Clusters não puderam ser editados."},e["pt-BR"]=e["pt-br"],e.pt_BR=e["pt-br"],e.pt_br=e["pt-br"],e.ru={edit:"Редактировать",del:"Удалить выбранное",back:"Ðазад",addNode:"Добавить узел",addEdge:"Добавить ребро",editNode:"Редактировать узел",editEdge:"Редактировать ребро",addDescription:"Кликните в Ñвободное меÑто, чтобы добавить новый узел.",edgeDescription:"Кликните на узел и протÑните ребро к другому узлу, чтобы Ñоединить их.",editEdgeDescription:"Кликните на контрольные точки и перетащите их в узел, чтобы подключитьÑÑ Ðº нему.",createEdgeError:"Ðевозможно Ñоединить ребра в клаÑтер.",deleteClusterError:"КлаÑтеры не могут быть удалены",editClusterError:"КлаÑтеры недоÑтупны Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ."},e.ru_RU=e.ru,e.cn={edit:"编辑",del:"删除选定",back:"返回",addNode:"添加节点",addEdge:"添加连接线",editNode:"编辑节点",editEdge:"编辑连接线",addDescription:"å•击空白处放置新节点。",edgeDescription:"å•击æŸä¸ªèŠ‚ç‚¹å¹¶å°†è¯¥è¿žæŽ¥çº¿æ‹–åŠ¨åˆ°å¦ä¸€ä¸ªèŠ‚ç‚¹ä»¥è¿žæŽ¥å®ƒä»¬ã€‚",editEdgeDescription:"å•击控制节点并将它们拖到节点上连接。",createEdgeError:"无法将连接线连接到群集。",deleteClusterError:"无法删除群集。",editClusterError:"无法编辑群集。"},e.zh_CN=e.cn},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(){(0,s.default)(this,t),this.NUM_ITERATIONS=4,this.image=new Image,this.canvas=document.createElement("canvas")}return(0,a.default)(t,[{key:"init",value:function(){if(!this.initialized()){this.src=this.image.src;var t=this.image.width,e=this.image.height;this.width=t,this.height=e;var i=Math.floor(e/2),o=Math.floor(e/4),n=Math.floor(e/8),s=Math.floor(e/16),r=Math.floor(t/2),a=Math.floor(t/4),h=Math.floor(t/8),d=Math.floor(t/16);this.canvas.width=3*a,this.canvas.height=i,this.coordinates=[[0,0,r,i],[r,0,a,o],[r,o,h,n],[5*h,o,d,s]],this._fillMipMap()}}},{key:"initialized",value:function(){return void 0!==this.coordinates}},{key:"_fillMipMap",value:function(){var t=this.canvas.getContext("2d"),e=this.coordinates[0];t.drawImage(this.image,e[0],e[1],e[2],e[3]);for(var i=1;i2){e*=.5;for(var r=0;e>2&&r=this.NUM_ITERATIONS&&(r=this.NUM_ITERATIONS-1);var a=this.coordinates[r];t.drawImage(this.canvas,a[0],a[1],a[2],a[3],i,o,n,s)}else t.drawImage(this.image,i,o,n,s)}}]),t}();e.default=h},function(t,e,i){ function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=function(){function t(){(0,s.default)(this,t),this.clear(),this.defaultIndex=0,this.groupsArray=[],this.groupIndex=0,this.defaultGroups=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}},{border:"#990000",background:"#EE0000",highlight:{border:"#BB0000",background:"#FF3333"},hover:{border:"#BB0000",background:"#FF3333"}},{border:"#FF6000",background:"#FF6000",highlight:{border:"#FF6000",background:"#FF6000"},hover:{border:"#FF6000",background:"#FF6000"}},{border:"#97C2FC",background:"#2B7CE9",highlight:{border:"#D2E5FF",background:"#2B7CE9"},hover:{border:"#D2E5FF",background:"#2B7CE9"}},{border:"#399605",background:"#255C03",highlight:{border:"#399605",background:"#255C03"},hover:{border:"#399605",background:"#255C03"}},{border:"#B70054",background:"#FF007E",highlight:{border:"#B70054",background:"#FF007E"},hover:{border:"#B70054",background:"#FF007E"}},{border:"#AD85E4",background:"#7C29F0",highlight:{border:"#D3BDF0",background:"#7C29F0"},hover:{border:"#D3BDF0",background:"#7C29F0"}},{border:"#4557FA",background:"#000EA1",highlight:{border:"#6E6EFD",background:"#000EA1"},hover:{border:"#6E6EFD",background:"#000EA1"}},{border:"#FFC0CB",background:"#FD5A77",highlight:{border:"#FFD1D9",background:"#FD5A77"},hover:{border:"#FFD1D9",background:"#FD5A77"}},{border:"#C2FABC",background:"#74D66A",highlight:{border:"#E6FFE3",background:"#74D66A"},hover:{border:"#E6FFE3",background:"#74D66A"}},{border:"#EE0000",background:"#990000",highlight:{border:"#FF3333",background:"#BB0000"},hover:{border:"#FF3333",background:"#BB0000"}}],this.options={},this.defaultOptions={useDefaultGroups:!0},h.extend(this.options,this.defaultOptions)}return(0,a.default)(t,[{key:"setOptions",value:function(t){var e=["useDefaultGroups"];if(void 0!==t)for(var i in t)if(t.hasOwnProperty(i)&&-1===e.indexOf(i)){var o=t[i];this.add(i,o)}}},{key:"clear",value:function(){this.groups={},this.groupsArray=[]}},{key:"get",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this.groups[t];if(void 0===i&&e)if(!1===this.options.useDefaultGroups&&this.groupsArray.length>0){var o=this.groupIndex%this.groupsArray.length;this.groupIndex++,i={},i.color=this.groups[this.groupsArray[o]],this.groups[t]=i}else{var n=this.defaultIndex%this.defaultGroups.length;this.defaultIndex++,i={},i.color=this.defaultGroups[n],this.groups[t]=i}return i}},{key:"add",value:function(t,e){return this.groups[t]=e,this.groupsArray.push(t),e}}]),t}();e.default=d},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(11),l=i(12),u=i(47).default,c=function(){function t(e,i,o,n){var r=this;if((0,s.default)(this,t),this.body=e,this.images=i,this.groups=o,this.layoutEngine=n,this.body.functions.createNode=this.create.bind(this),this.nodesListeners={add:function(t,e){r.add(e.items)},update:function(t,e){r.update(e.items,e.data,e.oldData)},remove:function(t,e){r.remove(e.items)}},this.defaultOptions={borderWidth:1,borderWidthSelected:2,brokenImage:void 0,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},fixed:{x:!1,y:!1},font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:0,strokeColor:"#ffffff",align:"center",vadjust:0,multi:!1,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"monospace",vadjust:2}},group:void 0,hidden:!1,icon:{face:"FontAwesome",code:void 0,size:50,color:"#2B7CE9"},image:void 0,label:void 0,labelHighlightBold:!0,level:void 0,margin:{top:5,right:5,bottom:5,left:5},mass:1,physics:!0,scaling:{min:10,max:30,label:{enabled:!1,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(t,e,i,o){if(e===t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},shape:"ellipse",shapeProperties:{borderDashes:!1,borderRadius:6,interpolation:!0,useImageSize:!1,useBorderWithImage:!1},size:25,title:void 0,value:void 0,x:void 0,y:void 0},this.defaultOptions.mass<=0)throw"Internal error: mass in defaultOptions of NodesHandler may not be zero or negative";this.options=h.bridgeObject(this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("refreshNodes",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",function(){h.forEach(t.nodesListeners,function(e,i){t.body.data.nodes&&t.body.data.nodes.off(i,e)}),delete t.body.functions.createNode,delete t.nodesListeners.add,delete t.nodesListeners.update,delete t.nodesListeners.remove,delete t.nodesListeners})}},{key:"setOptions",value:function(t){if(void 0!==t){if(u.parseOptions(this.options,t),void 0!==t.shape)for(var e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&this.body.nodes[e].updateShape();if(void 0!==t.font)for(var i in this.body.nodes)this.body.nodes.hasOwnProperty(i)&&(this.body.nodes[i].updateLabelModule(),this.body.nodes[i].needsRefresh());if(void 0!==t.size)for(var o in this.body.nodes)this.body.nodes.hasOwnProperty(o)&&this.body.nodes[o].needsRefresh();void 0===t.hidden&&void 0===t.physics||this.body.emitter.emit("_dataChanged")}}},{key:"setData",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.data.nodes;if(t instanceof d||t instanceof l)this.body.data.nodes=t;else if(Array.isArray(t))this.body.data.nodes=new d,this.body.data.nodes.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.body.data.nodes=new d}if(i&&h.forEach(this.nodesListeners,function(t,e){i.off(e,t)}),this.body.nodes={},this.body.data.nodes){var o=this;h.forEach(this.nodesListeners,function(t,e){o.body.data.nodes.on(e,t)});var n=this.body.data.nodes.getIds();this.add(n,!0)}!1===e&&this.body.emitter.emit("_dataChanged")}},{key:"add",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=void 0,o=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:u)(t,this.body,this.images,this.groups,this.options,this.defaultOptions)}},{key:"refresh",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];h.forEach(this.body.nodes,function(i,o){var n=t.body.data.nodes.get(o);void 0!==n&&(!0===e&&i.setOptions({x:null,y:null}),i.setOptions({fixed:!1}),i.setOptions(n))})}},{key:"getPositions",value:function(t){var e={};if(void 0!==t){if(!0===Array.isArray(t)){for(var i=0;i0)for(var r=0;r0)for(var p=0;p0&&void 0!==arguments[0]&&arguments[0];this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(e.push({text:this.buffer,mod:this.modName()}),this.buffer="")},i.add=function(t){" "===t&&(i.spacing=!0),i.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=t&&(this.buffer+=t)};i.position/.test(t.substr(i.position,3))?i.mono||i.ital||!//.test(t.substr(i.position,3))?!i.mono&&//.test(t.substr(i.position,6))?(i.emitBlock(),i.mono=!0,i.modStack.unshift("mono"),i.position+=5):!i.mono&&"bold"===i.mod()&&/<\/b>/.test(t.substr(i.position,4))?(i.emitBlock(),i.bold=!1,i.modStack.shift(),i.position+=3):!i.mono&&"ital"===i.mod()&&/<\/i>/.test(t.substr(i.position,4))?(i.emitBlock(),i.ital=!1,i.modStack.shift(),i.position+=3):"mono"===i.mod()&&/<\/code>/.test(t.substr(i.position,7))?(i.emitBlock(),i.mono=!1,i.modStack.shift(),i.position+=6):i.add(o):(i.emitBlock(),i.ital=!0,i.modStack.unshift("ital"),i.position+=2):(i.emitBlock(),i.bold=!0,i.modStack.unshift("bold"),i.position+=2):/&/.test(o)?/</.test(t.substr(i.position,4))?(i.add("<"),i.position+=3):/&/.test(t.substr(i.position,5))?(i.add("&"),i.position+=4):i.add("&"):i.add(o),i.position++}return i.emitBlock(),e}},{key:"splitMarkdownBlocks",value:function(t){var e=[],i={bold:!1,ital:!1,mono:!1,beginable:!0,spacing:!1,position:0,buffer:"",modStack:[]};for(i.mod=function(){return 0===this.modStack.length?"normal":this.modStack[0]},i.modName=function(){return 0===this.modStack.length?"normal":"mono"===this.modStack[0]?"mono":i.bold&&i.ital?"boldital":i.bold?"bold":i.ital?"ital":void 0},i.emitBlock=function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(e.push({text:this.buffer,mod:this.modName()}),this.buffer="")},i.add=function(t){" "===t&&(i.spacing=!0),i.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=t&&(this.buffer+=t)};i.positionthis.parent.fontOptions.maxWdt}},{key:"getLongestFit",value:function(t){for(var e="",i=0;i1&&void 0!==arguments[1]?arguments[1]:"normal",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];t=t.replace(/^( +)/g,"$1\r"),t=t.replace(/([^\r][^ ]*)( +)/g,"$1\r$2\r");for(var o=t.split("\r");o.length>0;){var n=this.getLongestFit(o);if(0===n){var s=o[0],r=this.getLongestFitWord(s);this.lines.newLine(s.slice(0,r),e),o[0]=s.slice(r)}else{var a=n;" "===o[n-1]?n--:" "===o[a]&&a++;var h=o.slice(0,n).join("");n==o.length&&i?this.lines.append(h,e):this.lines.newLine(h,e),o=o.slice(a)}}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(90),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=function(){function t(e){(0,a.default)(this,t),this.measureText=e,this.current=0,this.width=0,this.height=0,this.lines=[]}return(0,d.default)(t,[{key:"_add",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"normal";void 0===this.lines[t]&&(this.lines[t]={width:0,height:0,blocks:[]});var o=e;void 0!==e&&""!==e||(o=" ");var n=this.measureText(o,i),r=(0,s.default)({},n.values);r.text=e,r.width=n.width,r.mod=i,void 0!==e&&""!==e||(r.width=0),this.lines[t].blocks.push(r),this.lines[t].width+=r.width}},{key:"curWidth",value:function(){var t=this.lines[this.current];return void 0===t?0:t.width}},{key:"append",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,t,e)}},{key:"newLine",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,t,e),this.current++}},{key:"determineLineHeights",value:function(){for(var t=0;tt&&(t=o.width),e+=o.height}this.width=t,this.height=e}},{key:"removeEmptyBlocks",value:function(){for(var t=[],e=0;e1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i);this.width=o.width+this.margin.right+this.margin.left,this.height=o.height+this.margin.top+this.margin.bottom,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.initContextForDraw(t,s),t.roundRect(this.left,this.top,this.width,this.height,s.borderRadius),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n)}},{key:"updateBoundingBox",value:function(t,e,i,o,n){this._updateBoundingBox(t,e,i,o,n);var s=this.options.shapeProperties.borderRadius;this._addBoundingBoxMargin(s)}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=this.options.borderWidth;return Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i}}]),e}(m.default);e.default=v},function(t,e,i){i(195),t.exports=i(7).Object.getPrototypeOf},function(t,e,i){var o=i(41),n=i(85);i(87)("getPrototypeOf",function(){return function(t){return n(o(t))}})},function(t,e,i){t.exports={default:i(197),__esModule:!0}},function(t,e,i){i(198),t.exports=i(7).Object.setPrototypeOf},function(t,e,i){var o=i(17);o(o.S,"Object",{setPrototypeOf:i(199).set})},function(t,e,i){var o=i(32),n=i(27),s=function(t,e){if(n(t),!o(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,e,o){try{o=i(80)(Function.call,i(89).f(Object.prototype,"__proto__").set,2),o(t,[]),e=!(t instanceof Array)}catch(t){e=!0}return function(t,i){return s(t,i),e?t.__proto__=i:o(t,i),t}}({},!1):void 0),check:s}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i),n=Math.max(o.width+this.margin.right+this.margin.left,o.height+this.margin.top+this.margin.bottom);this.options.size=n/2,this.width=n,this.height=n,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this._drawRawCircle(t,e,i,s),this.updateBoundingBox(e,i),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,i,o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),.5*this.width}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o,n,r){(0,a.default)(this,e);var h=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return h.setImages(n,r),h}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){var o=2*this.options.size;return this.width=o,this.height=o,void(this.radius=.5*this.width)}this.needsRefresh(e,i)&&this._resizeImage()}},{key:"draw",value:function(t,e,i,o,n,s){this.switchImages(o),this.resize(),this.left=e-this.width/2,this.top=i-this.height/2,this._drawRawCircle(t,e,i,s),t.save(),t.clip(),this._drawImageAtPosition(t,s),t.restore(),this._drawImageLabel(t,e,i,o,n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset)}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),.5*this.width}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i),n=o.width+this.margin.right+this.margin.left;this.width=n,this.height=n,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.initContextForDraw(t,s),t.database(e-this.width/2,i-this.height/2,this.width,this.height),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"diamond",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"circle",2,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),this.options.size}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i);this.height=2*o.height,this.width=o.width+o.height,this.radius=.5*this.width}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-.5*this.width,this.top=i-.5*this.height,this.initContextForDraw(t,s),t.ellipse_vis(this.left,this.top,this.width,this.height),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,e,i,o,n)}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=.5*this.width,o=.5*this.height,n=Math.sin(e)*i,s=Math.cos(e)*o;return i*o/Math.sqrt(n*n+s*s)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){this.needsRefresh(e,i)&&(this.iconSize={width:Number(this.options.icon.size),height:Number(this.options.icon.size)},this.width=this.iconSize.width+this.margin.right+this.margin.left,this.height=this.iconSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}},{key:"draw",value:function(t,e,i,o,n,s){if(this.resize(t,o,n),this.options.icon.size=this.options.icon.size||50,this.left=e-this.width/2,this.top=i-this.height/2,this._icon(t,e,i,o,n,s),void 0!==this.options.label){this.labelModule.draw(t,this.left+this.iconSize.width/2+this.margin.left,i+this.height/2+5,o)}this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){if(this.boundingBox.top=e-.5*this.options.icon.size,this.boundingBox.left=t-.5*this.options.icon.size,this.boundingBox.right=t+.5*this.options.icon.size,this.boundingBox.bottom=e+.5*this.options.icon.size,void 0!==this.options.label&&this.labelModule.size.width>0){this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+5)}}},{key:"_icon",value:function(t,e,i,o,n,s){var r=Number(this.options.icon.size);void 0!==this.options.icon.code?(t.font=(o?"bold ":"")+r+"px "+this.options.icon.face,t.fillStyle=this.options.icon.color||"black",t.textAlign="center",t.textBaseline="middle",this.enableShadow(t,s),t.fillText(this.options.icon.code,e,i),this.disableShadow(t,s)):console.error("When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.")}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o,n,r){(0,a.default)(this,e);var h=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return h.setImages(n,r),h}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){var o=2*this.options.size;return this.width=o,void(this.height=o)}this.needsRefresh(e,i)&&this._resizeImage()}},{key:"draw",value:function(t,e,i,o,n,s){if(this.switchImages(o),this.resize(),this.left=e-this.width/2,this.top=i-this.height/2,!0===this.options.shapeProperties.useBorderWithImage){var r=this.options.borderWidth,a=this.options.borderWidthSelected||2*this.options.borderWidth,h=(o?a:r)/this.body.view.scale;t.lineWidth=Math.min(this.width,h),t.beginPath(),t.strokeStyle=o?this.options.color.highlight.border:n?this.options.color.hover.border:this.options.color.border,t.fillStyle=o?this.options.color.highlight.background:n?this.options.color.hover.background:this.options.color.background,t.rect(this.left-.5*t.lineWidth,this.top-.5*t.lineWidth,this.width+t.lineWidth,this.height+t.lineWidth),t.fill(),this.performStroke(t,s),t.closePath()}this._drawImageAtPosition(t,s),this._drawImageLabel(t,e,i,o,n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.resize(),this._updateBoundingBox(t,e),void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset))}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)} }]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"square",2,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"hexagon",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"star",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){this.needsRefresh(e,i)&&(this.textSize=this.labelModule.getTextSize(t,e,i),this.width=this.textSize.width+this.margin.right+this.margin.left,this.height=this.textSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.enableShadow(t,s),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n),this.disableShadow(t,s),this.updateBoundingBox(e,i,t,o,n)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"triangle",3,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"triangleDown",3,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(11),l=i(12),u=i(74).default,c=function(){function t(e,i,o){var n=this;(0,s.default)(this,t),this.body=e,this.images=i,this.groups=o,this.body.functions.createEdge=this.create.bind(this),this.edgesListeners={add:function(t,e){n.add(e.items)},update:function(t,e){n.update(e.items)},remove:function(t,e){n.remove(e.items)}},this.options={},this.defaultOptions={arrows:{to:{enabled:!1,scaleFactor:1,type:"arrow"},middle:{enabled:!1,scaleFactor:1,type:"arrow"},from:{enabled:!1,scaleFactor:1,type:"arrow"}},arrowStrikethrough:!0,color:{color:"#848484",highlight:"#848484",hover:"#848484",inherit:"from",opacity:1},dashes:!1,font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:2,strokeColor:"#ffffff",align:"horizontal",multi:!1,vadjust:0,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"courier new",vadjust:2}},hidden:!1,hoverWidth:1.5,label:void 0,labelHighlightBold:!0,length:void 0,physics:!0,scaling:{min:1,max:15,label:{enabled:!0,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(t,e,i,o){if(e===t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)}},selectionWidth:1.5,selfReferenceSize:20,shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},smooth:{enabled:!0,type:"dynamic",forceDirection:"none",roundness:.5},title:void 0,width:1,value:void 0},h.deepExtend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("_forceDisableDynamicCurves",function(e){var i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];"dynamic"===e&&(e="continuous");var o=!1;for(var n in t.body.edges)if(t.body.edges.hasOwnProperty(n)){var s=t.body.edges[n],r=t.body.data.edges._data[n];if(void 0!==r){var a=r.smooth;void 0!==a&&!0===a.enabled&&"dynamic"===a.type&&(void 0===e?s.setOptions({smooth:!1}):s.setOptions({smooth:{type:e}}),o=!0)}}!0===i&&!0===o&&t.body.emitter.emit("_dataChanged")}),this.body.emitter.on("_dataUpdated",function(){t.reconnectEdges()}),this.body.emitter.on("refreshEdges",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",function(){h.forEach(t.edgesListeners,function(e,i){t.body.data.edges&&t.body.data.edges.off(i,e)}),delete t.body.functions.createEdge,delete t.edgesListeners.add,delete t.edgesListeners.update,delete t.edgesListeners.remove,delete t.edgesListeners})}},{key:"setOptions",value:function(t){if(void 0!==t){u.parseOptions(this.options,t,!0,this.defaultOptions,!0);var e=!1;if(void 0!==t.smooth)for(var i in this.body.edges)this.body.edges.hasOwnProperty(i)&&(e=this.body.edges[i].updateEdgeType()||e);if(void 0!==t.font)for(var o in this.body.edges)this.body.edges.hasOwnProperty(o)&&this.body.edges[o].updateLabelModule();void 0===t.hidden&&void 0===t.physics&&!0!==e||this.body.emitter.emit("_dataChanged")}}},{key:"setData",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=this.body.data.edges;if(t instanceof d||t instanceof l)this.body.data.edges=t;else if(Array.isArray(t))this.body.data.edges=new d,this.body.data.edges.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.body.data.edges=new d}if(o&&h.forEach(this.edgesListeners,function(t,e){o.off(e,t)}),this.body.edges={},this.body.data.edges){h.forEach(this.edgesListeners,function(t,i){e.body.data.edges.on(i,t)});var n=this.body.data.edges.getIds();this.add(n,!0)}this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),!1===i&&this.body.emitter.emit("_dataChanged")}},{key:"add",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.edges,o=this.body.data.edges,n=0;n1&&void 0!==arguments[1])||arguments[1];if(0!==t.length){var i=this.body.edges;h.forEach(t,function(t){var e=i[t];void 0!==e&&e.remove()}),e&&this.body.emitter.emit("_dataChanged")}}},{key:"refresh",value:function(){var t=this;h.forEach(this.body.edges,function(e,i){var o=t.body.data.edges._data[i];void 0!==o&&e.setOptions(o)})}},{key:"create",value:function(t){return new u(t,this.body,this.options,this.defaultOptions)}},{key:"reconnectEdges",value:function(){var t,e=this.body.nodes,i=this.body.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var o=i[t];o.from=null,o.to=null,o.connect()}}},{key:"getConnectedNodes",value:function(t){var e=[];if(void 0!==this.body.edges[t]){var i=this.body.edges[t];void 0!==i.fromId&&e.push(i.fromId),void 0!==i.toId&&e.push(i.toId)}return e}},{key:"_updateState",value:function(){this._addMissingEdges(),this._removeInvalidEdges()}},{key:"_removeInvalidEdges",value:function(){var t=this,e=[];h.forEach(this.body.edges,function(i,o){var n=t.body.nodes[i.toId],s=t.body.nodes[i.fromId];void 0!==n&&!0===n.isCluster||void 0!==s&&!0===s.isCluster||void 0!==n&&void 0!==s||e.push(o)}),this.remove(e,!1)}},{key:"_addMissingEdges",value:function(){var t=this.body.edges,e=this.body.data.edges,i=[];e.forEach(function(e,o){void 0===t[o]&&i.push(o)}),this.add(i,!0)}}]),t}();e.default=c},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(3),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(4),p=o(c),f=i(5),m=o(f),v=i(216),g=o(v),y=function(t){function e(t,i,o){return(0,d.default)(this,e),(0,p.default)(this,(e.__proto__||(0,a.default)(e)).call(this,t,i,o))}return(0,m.default)(e,t),(0,u.default)(e,[{key:"_line",value:function(t,e,i){var o=i[0],n=i[1];this._bezierCurve(t,e,o,n)}},{key:"_getViaCoordinates",value:function(){var t=this.from.x-this.to.x,e=this.from.y-this.to.y,i=void 0,o=void 0,n=void 0,s=void 0,r=this.options.smooth.roundness;return(Math.abs(t)>Math.abs(e)||!0===this.options.smooth.forceDirection||"horizontal"===this.options.smooth.forceDirection)&&"vertical"!==this.options.smooth.forceDirection?(o=this.from.y,s=this.to.y,i=this.from.x-r*t,n=this.to.x+r*t):(o=this.from.y-r*e,s=this.to.y+r*e,i=this.from.x,n=this.to.x),[{x:i,y:o},{x:n,y:s}]}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,r){var a=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates(),h=(0,s.default)(a,2),d=h[0],l=h[1];return this._getDistanceToBezierEdge(t,e,i,o,n,r,d,l)}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates(),i=(0,s.default)(e,2),o=i[0],n=i[1],r=t,a=[];return a[0]=Math.pow(1-r,3),a[1]=3*r*Math.pow(1-r,2),a[2]=3*Math.pow(r,2)*(1-r),a[3]=Math.pow(r,3),{x:a[0]*this.fromPoint.x+a[1]*o.x+a[2]*n.x+a[3]*this.toPoint.x,y:a[0]*this.fromPoint.y+a[1]*o.y+a[2]*n.y+a[3]*this.toPoint.y}}}]),e}(g.default);e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(75),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r,a){var h=1e9,d=void 0,l=void 0,u=void 0,c=void 0,p=void 0,f=t,m=e,v=[0,0,0,0];for(l=1;l<10;l++)u=.1*l,v[0]=Math.pow(1-u,3),v[1]=3*u*Math.pow(1-u,2),v[2]=3*Math.pow(u,2)*(1-u),v[3]=Math.pow(u,3),c=v[0]*t+v[1]*r.x+v[2]*a.x+v[3]*i,p=v[0]*e+v[1]*r.y+v[2]*a.y+v[3]*o,l>0&&(d=this._getDistanceToLine(f,m,c,p,n,s),h=d1&&void 0!==arguments[1]?arguments[1]:this.via,i=t,o=void 0,n=void 0;if(this.from===this.to){var r=this._getCircleData(this.from),a=(0,s.default)(r,3),h=a[0],d=a[1],l=a[2],u=2*Math.PI*(1-i);o=h+l*Math.sin(u),n=d+l-l*(1-Math.cos(u))}else o=Math.pow(1-i,2)*this.fromPoint.x+2*i*(1-i)*e.x+Math.pow(i,2)*this.toPoint.x,n=Math.pow(1-i,2)*this.fromPoint.y+2*i*(1-i)*e.y+Math.pow(i,2)*this.toPoint.y;return{x:o,y:n}}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e,this.via)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){return this._getDistanceToBezierEdge(t,e,i,o,n,s,this.via)}}]),e}(g.default);e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(75),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_line",value:function(t,e,i){this._bezierCurve(t,e,i)}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_getViaCoordinates",value:function(){var t=void 0,e=void 0,i=this.options.smooth.roundness,o=this.options.smooth.type,n=Math.abs(this.from.x-this.to.x),s=Math.abs(this.from.y-this.to.y);if("discrete"===o||"diagonalCross"===o){var r=void 0,a=void 0;r=a=n<=s?i*s:i*n,this.from.x>this.to.x&&(r=-r),this.from.y>=this.to.y&&(a=-a),t=this.from.x+r,e=this.from.y+a,"discrete"===o&&(n<=s?t=nthis.to.x&&(_=-_),this.from.y>=this.to.y&&(w=-w),t=this.from.x+_,e=this.from.y+w,n<=s?t=this.from.x<=this.to.x?this.to.xt?this.to.x:t:e=this.from.y>=this.to.y?this.to.y>e?this.to.y:e:this.to.y2&&void 0!==arguments[2]?arguments[2]:{};return this._findBorderPositionBezier(t,e,i.via)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){var r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates();return this._getDistanceToBezierEdge(t,e,i,o,n,s,r)}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates(),i=t;return{x:Math.pow(1-i,2)*this.fromPoint.x+2*i*(1-i)*e.x+Math.pow(i,2)*this.toPoint.x,y:Math.pow(1-i,2)*this.fromPoint.y+2*i*(1-i)*e.y+Math.pow(i,2)*this.toPoint.y}}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(118),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_line",value:function(t,e){t.beginPath(),t.moveTo(this.fromPoint.x,this.fromPoint.y),t.lineTo(this.toPoint.x,this.toPoint.y),this.enableShadow(t,e),t.stroke(),this.disableShadow(t,e)}},{key:"getViaNode",value:function(){}},{key:"getPoint",value:function(t){return{x:(1-t)*this.fromPoint.x+t*this.toPoint.x,y:(1-t)*this.fromPoint.y+t*this.toPoint.y}}},{key:"_findBorderPosition",value:function(t,e){var i=this.to,o=this.from;t.id===this.from.id&&(i=this.from,o=this.to);var n=Math.atan2(i.y-o.y,i.x-o.x),s=i.x-o.x,r=i.y-o.y,a=Math.sqrt(s*s+r*r),h=t.distanceToBorder(e,n),d=(a-h)/a,l={};return l.x=(1-d)*o.x+d*i.x,l.y=(1-d)*o.y+d*i.y,l}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){return this._getDistanceToLine(t,e,i,o,n,s)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(120).default,u=i(221).default,c=i(222).default,p=i(223).default,f=i(224).default,m=i(121).default,v=i(225).default,g=i(226).default,y=i(2),b=i(119).default,_=function(){function t(e){(0,a.default)(this,t),this.body=e,this.physicsBody={physicsNodeIndices:[],physicsEdgeIndices:[],forces:{},velocities:{}},this.physicsEnabled=!0,this.simulationInterval=1e3/60,this.requiresTimeout=!0,this.previousStates={},this.referenceState={},this.freezeCache={},this.renderTimer=void 0,this.adaptiveTimestep=!1,this.adaptiveTimestepEnabled=!1,this.adaptiveCounter=0,this.adaptiveInterval=3,this.stabilized=!1,this.startedStabilization=!1,this.stabilizationIterations=0,this.ready=!1,this.options={},this.defaultOptions={enabled:!0,barnesHut:{theta:.5,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09,avoidOverlap:0},forceAtlas2Based:{theta:.5,gravitationalConstant:-50,centralGravity:.01,springConstant:.08,springLength:100,damping:.4,avoidOverlap:0},repulsion:{centralGravity:.2,springLength:200,springConstant:.05,nodeDistance:100,damping:.09,avoidOverlap:0},hierarchicalRepulsion:{centralGravity:0,springLength:100,springConstant:.01,nodeDistance:120,damping:.09},maxVelocity:50,minVelocity:.75,solver:"barnesHut",stabilization:{enabled:!0,iterations:1e3,updateInterval:50,onlyDynamicEdges:!1,fit:!0},timestep:.5,adaptiveTimestep:!0},y.extend(this.options,this.defaultOptions),this.timestep=.5,this.layoutFailed=!1,this.bindEventListeners()}return(0,d.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("initPhysics",function(){t.initPhysics()}),this.body.emitter.on("_layoutFailed",function(){t.layoutFailed=!0}),this.body.emitter.on("resetPhysics",function(){t.stopSimulation(),t.ready=!1}),this.body.emitter.on("disablePhysics",function(){t.physicsEnabled=!1,t.stopSimulation()}),this.body.emitter.on("restorePhysics",function(){t.setOptions(t.options),!0===t.ready&&t.startSimulation()}),this.body.emitter.on("startSimulation",function(){!0===t.ready&&t.startSimulation()}),this.body.emitter.on("stopSimulation",function(){t.stopSimulation()}),this.body.emitter.on("destroy",function(){t.stopSimulation(!1),t.body.emitter.off()}),this.body.emitter.on("_dataChanged",function(){t.updatePhysicsData()})}},{key:"setOptions",value:function(t){void 0!==t&&(!1===t?(this.options.enabled=!1,this.physicsEnabled=!1,this.stopSimulation()):!0===t?(this.options.enabled=!0,this.physicsEnabled=!0,this.startSimulation()):(this.physicsEnabled=!0,y.selectiveNotDeepExtend(["stabilization"],this.options,t),y.mergeOptions(this.options,t,"stabilization"),void 0===t.enabled&&(this.options.enabled=!0),!1===this.options.enabled&&(this.physicsEnabled=!1,this.stopSimulation()),this.timestep=this.options.timestep)),this.init()}},{key:"init",value:function(){var t;"forceAtlas2Based"===this.options.solver?(t=this.options.forceAtlas2Based,this.nodesSolver=new v(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new g(this.body,this.physicsBody,t)):"repulsion"===this.options.solver?(t=this.options.repulsion,this.nodesSolver=new u(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)):"hierarchicalRepulsion"===this.options.solver?(t=this.options.hierarchicalRepulsion,this.nodesSolver=new c(this.body,this.physicsBody,t),this.edgesSolver=new f(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)):(t=this.options.barnesHut,this.nodesSolver=new l(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)),this.modelOptions=t}},{key:"initPhysics",value:function(){!0===this.physicsEnabled&&!0===this.options.enabled?!0===this.options.stabilization.enabled?this.stabilize():(this.stabilized=!1,this.ready=!0,this.body.emitter.emit("fit",{},this.layoutFailed),this.startSimulation()):(this.ready=!0,this.body.emitter.emit("fit"))}},{key:"startSimulation",value:function(){!0===this.physicsEnabled&&!0===this.options.enabled?(this.stabilized=!1,this.adaptiveTimestep=!1,this.body.emitter.emit("_resizeNodes"),void 0===this.viewFunction&&(this.viewFunction=this.simulationStep.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))):this.body.emitter.emit("_redraw")}},{key:"stopSimulation",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.stabilized=!0,!0===t&&this._emitStabilized(),void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.viewFunction=void 0,!0===t&&this.body.emitter.emit("_stopRendering"))}},{key:"simulationStep",value:function(){var t=Date.now();this.physicsTick(),(Date.now()-t<.4*this.simulationInterval||!0===this.runDoubleSpeed)&&!1===this.stabilized&&(this.physicsTick(),this.runDoubleSpeed=!0),!0===this.stabilized&&this.stopSimulation()}},{key:"_emitStabilized",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.stabilizationIterations;(this.stabilizationIterations>1||!0===this.startedStabilization)&&setTimeout(function(){t.body.emitter.emit("stabilized",{iterations:e}),t.startedStabilization=!1,t.stabilizationIterations=0},0)}},{key:"physicsStep",value:function(){this.gravitySolver.solve(),this.nodesSolver.solve(),this.edgesSolver.solve(),this.moveNodes()}},{key:"adjustTimeStep",value:function(){!0===this._evaluateStepQuality()?this.timestep=1.2*this.timestep:this.timestep/1.2.3))return!1;return!0}},{key:"moveNodes",value:function(){for(var t=this.physicsBody.physicsNodeIndices,e=0,i=0,o=0;oo&&(t=t>0?o:-o),t}},{key:"_performStep",value:function(t){var e=this.body.nodes[t],i=this.physicsBody.forces[t],o=this.physicsBody.velocities[t];return this.previousStates[t]={x:e.x,y:e.y,vx:o.x,vy:o.y},!1===e.options.fixed.x?(o.x=this.calculateComponentVelocity(o.x,i.x,e.options.mass),e.x+=o.x*this.timestep):(i.x=0,o.x=0),!1===e.options.fixed.y?(o.y=this.calculateComponentVelocity(o.y,i.y,e.options.mass),e.y+=o.y*this.timestep):(i.y=0,o.y=0),Math.sqrt(Math.pow(o.x,2)+Math.pow(o.y,2))}},{key:"_freezeNodes",value:function(){var t=this.body.nodes;for(var e in t)if(t.hasOwnProperty(e)&&t[e].x&&t[e].y){var i=t[e].options.fixed;this.freezeCache[e]={x:i.x,y:i.y},i.x=!0,i.y=!0}}},{key:"_restoreFrozenNodes",value:function(){var t=this.body.nodes;for(var e in t)t.hasOwnProperty(e)&&void 0!==this.freezeCache[e]&&(t[e].options.fixed.x=this.freezeCache[e].x,t[e].options.fixed.y=this.freezeCache[e].y);this.freezeCache={}}},{key:"stabilize",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.stabilization.iterations;if("number"!=typeof e&&(e=this.options.stabilization.iterations,console.log("The stabilize method needs a numeric amount of iterations. Switching to default: ",e)),0===this.physicsBody.physicsNodeIndices.length)return void(this.ready=!0);this.adaptiveTimestep=this.options.adaptiveTimestep,this.body.emitter.emit("_resizeNodes"),this.stopSimulation(),this.stabilized=!1,this.body.emitter.emit("_blockRedraw"),this.targetIterations=e,!0===this.options.stabilization.onlyDynamicEdges&&this._freezeNodes(),this.stabilizationIterations=0,setTimeout(function(){return t._stabilizationBatch()},0)}},{key:"_startStabilizing",value:function(){return!0!==this.startedStabilization&&(this.body.emitter.emit("startStabilizing"),this.startedStabilization=!0,!0)}},{key:"_stabilizationBatch",value:function(){var t=this,e=function(){return!1===t.stabilized&&t.stabilizationIterations0){var s=n.edges.length+1,r=this.options.centralGravity*s*n.options.mass;o[n.id].x=e*r,o[n.id].y=i*r}}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(76).default,f=i(228).default,m=i(74).default,v=i(47).default,g=function(){function t(e){var i=this;(0,d.default)(this,t),this.body=e,this.clusteredNodes={},this.clusteredEdges={},this.options={},this.defaultOptions={},c.extend(this.options,this.defaultOptions),this.body.emitter.on("_resetData",function(){i.clusteredNodes={},i.clusteredEdges={}})}return(0,u.default)(t,[{key:"clusterByHubsize",value:function(t,e){void 0===t?t=this._getHubSize():"object"===(void 0===t?"undefined":(0,a.default)(t))&&(e=this._checkOptions(t),t=this._getHubSize());for(var i=[],o=0;o=t&&i.push(n.id)}for(var s=0;s0&&void 0!==arguments[0]?arguments[0]:{},i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(void 0===e.joinCondition)throw new Error("Cannot call clusterByNodeData without a joinCondition function in the options.");e=this._checkOptions(e);var o={},n={};c.forEach(this.body.nodes,function(i,s){var r=p.cloneOptions(i);!0===e.joinCondition(r)&&(o[s]=i,c.forEach(i.edges,function(e){void 0===t.clusteredEdges[e.id]&&(n[e.id]=e)}))}),this._cluster(o,n,e,i)}},{key:"clusterByEdgeCount",value:function(t,e){var i=this,o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];e=this._checkOptions(e);for(var n=[],r={},a=void 0,h=void 0,d=void 0,l=0;l0&&(0,s.default)(m).length>0&&!0===b)if(c=function(){for(var t=0;t1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(1,t,e)}},{key:"clusterBridges",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(2,t,e)}},{key:"clusterByConnection",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===t)throw new Error("No nodeId supplied to clusterByConnection!");if(void 0===this.body.nodes[t])throw new Error("The nodeId given to clusterByConnection does not exist!");var o=this.body.nodes[t];e=this._checkOptions(e,o),void 0===e.clusterNodeProperties.x&&(e.clusterNodeProperties.x=o.x),void 0===e.clusterNodeProperties.y&&(e.clusterNodeProperties.y=o.y),void 0===e.clusterNodeProperties.fixed&&(e.clusterNodeProperties.fixed={},e.clusterNodeProperties.fixed.x=o.options.fixed.x,e.clusterNodeProperties.fixed.y=o.options.fixed.y);var n={},r={},a=o.id,h=p.cloneOptions(o);n[a]=o;for(var d=0;d-1&&(r[g.id]=g)}this._cluster(n,r,e,i)}},{key:"_createClusterEdges",value:function(t,e,i,o){for(var n=void 0,r=void 0,a=void 0,h=void 0,d=void 0,l=void 0,u=(0,s.default)(t),c=[],p=0;p0&&void 0!==arguments[0]?arguments[0]:{};return void 0===t.clusterEdgeProperties&&(t.clusterEdgeProperties={}),void 0===t.clusterNodeProperties&&(t.clusterNodeProperties={}),t}},{key:"_cluster",value:function(t,e,i){var o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],n=[];for(var r in t)t.hasOwnProperty(r)&&void 0!==this.clusteredNodes[r]&&n.push(r);for(var a=0;ao?a.x:o,n=a.yr?a.y:r;return{x:.5*(i+o),y:.5*(n+r)}}},{key:"openCluster",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===t)throw new Error("No clusterNodeId supplied to openCluster.");var o=this.body.nodes[t];if(void 0===o)throw new Error("The clusterNodeId supplied to openCluster does not exist.");if(!0!==o.isCluster||void 0===o.containedNodes||void 0===o.containedEdges)throw new Error("The node:"+t+" is not a valid cluster.");var n=this.findNode(t),s=n.indexOf(t)-1;if(s>=0){var r=n[s];return this.body.nodes[r]._openChildCluster(t),delete this.body.nodes[t],void(!0===i&&this.body.emitter.emit("_dataChanged"))}var a=o.containedNodes,h=o.containedEdges;if(void 0!==e&&void 0!==e.releaseFunction&&"function"==typeof e.releaseFunction){var d={},l={x:o.x,y:o.y};for(var u in a)if(a.hasOwnProperty(u)){var p=this.body.nodes[u];d[u]={x:p.x,y:p.y}}var f=e.releaseFunction(l,d);for(var m in a)if(a.hasOwnProperty(m)){var v=this.body.nodes[m];void 0!==f[m]&&(v.x=void 0===f[m].x?o.x:f[m].x,v.y=void 0===f[m].y?o.y:f[m].y)}}else c.forEach(a,function(t){!1===t.options.fixed.x&&(t.x=o.x),!1===t.options.fixed.y&&(t.y=o.y)});for(var g in a)if(a.hasOwnProperty(g)){var y=this.body.nodes[g];y.vx=o.vx,y.vy=o.vy,y.setOptions({physics:!0}),delete this.clusteredNodes[g]}for(var b=[],_=0;_0&&n<100;){var s=e.pop();if(void 0!==s){var r=this.body.edges[s];if(void 0!==r){n++;var a=r.clusteringEdgeReplacingIds;if(void 0===a)o.push(s);else for(var h=0;ho&&(o=s.edges.length),t+=s.edges.length,e+=Math.pow(s.edges.length,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r),h=Math.floor(t+2*a);return h>o&&(h=o),h}},{key:"_createClusteredEdge",value:function(t,e,i,o,n){var s=p.cloneOptions(i,"edge");c.deepExtend(s,o),s.from=t,s.to=e,s.id="clusterEdge:"+c.randomUUID(),void 0!==n&&c.deepExtend(s,n);var r=this.body.functions.createEdge(s);return r.clusteringEdgeReplacingIds=[i.id],r.connect(),this.body.edges[r.id]=r,r}},{key:"_clusterEdges",value:function(t,e,i,o){if(e instanceof m){var n=e,s={};s[n.id]=n,e=s}if(t instanceof v){var r=t,a={};a[r.id]=r,t=a}if(void 0===i||null===i)throw new Error("_clusterEdges: parameter clusterNode required");void 0===o&&(o=i.clusterEdgeProperties),this._createClusterEdges(t,e,i,o);for(var h in e)if(e.hasOwnProperty(h)&&void 0!==this.body.edges[h]){var d=this.body.edges[h];this._backupEdgeOptions(d),d.setOptions({physics:!1})}for(var l in t)t.hasOwnProperty(l)&&(this.clusteredNodes[l]={clusterId:i.id,node:this.body.nodes[l]},this.body.nodes[l].setOptions({physics:!1}))}},{key:"_getClusterNodeForNode",value:function(t){if(void 0!==t){var e=this.clusteredNodes[t];if(void 0!==e){var i=e.clusterId;if(void 0!==i)return this.body.nodes[i]}}}},{key:"_filter",value:function(t,e){var i=[];return c.forEach(t,function(t){e(t)&&i.push(t)}),i}},{key:"_updateState",value:function(){var t=this,e=void 0,i=[],o=[],n=function(e){c.forEach(t.body.nodes,function(t){!0===t.isCluster&&e(t)})};for(e in this.clusteredNodes)if(this.clusteredNodes.hasOwnProperty(e)){var r=this.body.nodes[e];void 0===r&&i.push(e)}n(function(t){for(var e=0;e0}e.endPointsValid()&&n||o.push(i)}),n(function(e){c.forEach(o,function(i){delete e.containedEdges[i],c.forEach(e.edges,function(n,s){if(n.id===i)return void(e.edges[s]=null);n.clusteringEdgeReplacingIds=t._filter(n.clusteringEdgeReplacingIds,function(t){return-1===o.indexOf(t)})}),e.edges=t._filter(e.edges,function(t){return null!==t})})}),c.forEach(o,function(e){delete t.clusteredEdges[e]}),c.forEach(o,function(e){delete t.body.edges[e]});var h=(0,s.default)(this.body.edges);c.forEach(h,function(e){var i=t.body.edges[e],o=t._isClusteredNode(i.fromId)||t._isClusteredNode(i.toId);if(o!==t._isClusteredEdge(i.id)){if(!o)throw new Error("remove edge from clustering not implemented!");var n=t._getClusterNodeForNode(i.fromId);void 0!==n&&t._clusterEdges(t.body.nodes[i.fromId],i,n);var s=t._getClusterNodeForNode(i.toId);void 0!==s&&t._clusterEdges(t.body.nodes[i.toId],i,s)}});for(var d=!1,l=!0;l;)!function(){var e=[];n(function(t){var i=(0,s.default)(t.containedNodes).length,o=!0===t.options.allowSingleNodeCluster;(o&&i<1||!o&&i<2)&&e.push(t.id)});for(var i=0;i0,d=d||l}();d&&this._updateState()}},{key:"_isClusteredNode",value:function(t){return void 0!==this.clusteredNodes[t]}},{key:"_isClusteredEdge",value:function(t){return void 0!==this.clusteredEdges[t]}}]),t}();e.default=g},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(2),m=i(47).default,v=function(t){function e(t,i,o,n,r,h){(0,a.default)(this,e);var d=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o,n,r,h));return d.isCluster=!0,d.containedNodes={},d.containedEdges={},d}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_openChildCluster",value:function(t){var e=this,i=this.body.nodes[t];if(void 0===this.containedNodes[t])throw new Error("node with id: "+t+" not in current cluster");if(!i.isCluster)throw new Error("node with id: "+t+" is not a cluster");delete this.containedNodes[t],f.forEach(i.edges,function(t){delete e.containedEdges[t.id]}),f.forEach(i.containedNodes,function(t,i){e.containedNodes[i]=t}),i.containedNodes={},f.forEach(i.containedEdges,function(t,i){e.containedEdges[i]=t}),i.containedEdges={},f.forEach(i.edges,function(t){f.forEach(e.edges,function(i){var o=i.clusteringEdgeReplacingIds.indexOf(t.id);-1!==o&&(f.forEach(t.clusteringEdgeReplacingIds,function(t){i.clusteringEdgeReplacingIds.push(t),e.body.edges[t].edgeReplacedById=i.id}),i.clusteringEdgeReplacingIds.splice(o,1))})}),i.edges=[]}}]),e}(m);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(){var t;void 0!==window&&(t=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame),window.requestAnimationFrame=void 0===t?function(t){t()}:t}Object.defineProperty(e,"__esModule",{value:!0});var s=i(0),r=o(s),a=i(1),h=o(a),d=i(2),l=function(){function t(e,i){(0,r.default)(this,t),n(),this.body=e,this.canvas=i,this.redrawRequested=!1,this.renderTimer=void 0,this.requiresTimeout=!0,this.renderingActive=!1,this.renderRequests=0,this.allowRedraw=!0,this.dragging=!1,this.options={},this.defaultOptions={hideEdgesOnDrag:!1,hideNodesOnDrag:!1},d.extend(this.options,this.defaultOptions),this._determineBrowserMethod(),this.bindEventListeners()}return(0,h.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("dragStart",function(){t.dragging=!0}),this.body.emitter.on("dragEnd",function(){t.dragging=!1}),this.body.emitter.on("_resizeNodes",function(){t._resizeNodes()}),this.body.emitter.on("_redraw",function(){!1===t.renderingActive&&t._redraw()}),this.body.emitter.on("_blockRedraw",function(){t.allowRedraw=!1}),this.body.emitter.on("_allowRedraw",function(){t.allowRedraw=!0,t.redrawRequested=!1}),this.body.emitter.on("_requestRedraw",this._requestRedraw.bind(this)),this.body.emitter.on("_startRendering",function(){t.renderRequests+=1,t.renderingActive=!0,t._startRendering()}),this.body.emitter.on("_stopRendering",function(){t.renderRequests-=1,t.renderingActive=t.renderRequests>0,t.renderTimer=void 0}),this.body.emitter.on("destroy",function(){t.renderRequests=0,t.allowRedraw=!1,t.renderingActive=!1,!0===t.requiresTimeout?clearTimeout(t.renderTimer):window.cancelAnimationFrame(t.renderTimer),t.body.emitter.off()})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag"];d.selectiveDeepExtend(e,this.options,t)}}},{key:"_requestNextFrame",value:function(t,e){if("undefined"!=typeof window){var i=void 0,o=window;return!0===this.requiresTimeout?i=o.setTimeout(t,e):o.requestAnimationFrame&&(i=o.requestAnimationFrame(t)),i}}},{key:"_startRendering",value:function(){!0===this.renderingActive&&void 0===this.renderTimer&&(this.renderTimer=this._requestNextFrame(this._renderStep.bind(this),this.simulationInterval))}},{key:"_renderStep",value:function(){!0===this.renderingActive&&(this.renderTimer=void 0,!0===this.requiresTimeout&&this._startRendering(),this._redraw(),!1===this.requiresTimeout&&this._startRendering())}},{key:"redraw",value:function(){this.body.emitter.emit("setSize"),this._redraw()}},{key:"_requestRedraw",value:function(){var t=this;!0!==this.redrawRequested&&!1===this.renderingActive&&!0===this.allowRedraw&&(this.redrawRequested=!0,this._requestNextFrame(function(){t._redraw(!1)},0))}},{key:"_redraw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!0===this.allowRedraw){this.body.emitter.emit("initRedraw"),this.redrawRequested=!1,0!==this.canvas.frame.canvas.width&&0!==this.canvas.frame.canvas.height||this.canvas.setSize(),this.canvas.setTransform();var e=this.canvas.getContext(),i=this.canvas.frame.canvas.clientWidth,o=this.canvas.frame.canvas.clientHeight;if(e.clearRect(0,0,i,o),0===this.canvas.frame.clientWidth)return;e.save(),e.translate(this.body.view.translation.x,this.body.view.translation.y),e.scale(this.body.view.scale,this.body.view.scale),e.beginPath(),this.body.emitter.emit("beforeDrawing",e),e.closePath(),!1===t&&(!1===this.dragging||!0===this.dragging&&!1===this.options.hideEdgesOnDrag)&&this._drawEdges(e),(!1===this.dragging||!0===this.dragging&&!1===this.options.hideNodesOnDrag)&&this._drawNodes(e,t),e.beginPath(),this.body.emitter.emit("afterDrawing",e),e.closePath(),e.restore(),!0===t&&e.clearRect(0,0,i,o)}}},{key:"_resizeNodes",value:function(){this.canvas.setTransform();var t=this.canvas.getContext();t.save(),t.translate(this.body.view.translation.x,this.body.view.translation.y),t.scale(this.body.view.scale,this.body.view.scale);var e=this.body.nodes,i=void 0;for(var o in e)e.hasOwnProperty(o)&&(i=e[o],i.resize(t),i.updateBoundingBox(t,i.selected));t.restore()}},{key:"_drawNodes",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.nodes,o=this.body.nodeIndices,n=void 0,s=[],r=this.canvas.DOMtoCanvas({x:-20,y:-20}),a=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+20,y:this.canvas.frame.canvas.clientHeight+20}),h={top:r.y,left:r.x,bottom:a.y,right:a.x},d=0;d0&&void 0!==arguments[0]?arguments[0]:this.pixelRatio;!0===this.initialized&&(this.cameraState.previousWidth=this.frame.canvas.width/t,this.cameraState.previousHeight=this.frame.canvas.height/t,this.cameraState.scale=this.body.view.scale,this.cameraState.position=this.DOMtoCanvas({x:.5*this.frame.canvas.width/t,y:.5*this.frame.canvas.height/t}))}},{key:"_setCameraState",value:function(){if(void 0!==this.cameraState.scale&&0!==this.frame.canvas.clientWidth&&0!==this.frame.canvas.clientHeight&&0!==this.pixelRatio&&this.cameraState.previousWidth>0){var t=this.frame.canvas.width/this.pixelRatio/this.cameraState.previousWidth,e=this.frame.canvas.height/this.pixelRatio/this.cameraState.previousHeight,i=this.cameraState.scale;1!=t&&1!=e?i=.5*this.cameraState.scale*(t+e):1!=t?i=this.cameraState.scale*t:1!=e&&(i=this.cameraState.scale*e),this.body.view.scale=i;var o=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight}),n={x:o.x-this.cameraState.position.x,y:o.y-this.cameraState.position.y};this.body.view.translation.x+=n.x*this.body.view.scale,this.body.view.translation.y+=n.y*this.body.view.scale}}},{key:"_prepareValue",value:function(t){if("number"==typeof t)return t+"px";if("string"==typeof t){if(-1!==t.indexOf("%")||-1!==t.indexOf("px"))return t;if(-1===t.indexOf("%"))return t+"px"}throw new Error("Could not use the value supplied for width or height:"+t)}},{key:"_create",value:function(){for(;this.body.container.hasChildNodes();)this.body.container.removeChild(this.body.container.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis-network",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.tabIndex=900,this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext)this._setPixelRatio(),this.setTransform();else{var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}this.body.container.appendChild(this.frame),this.body.view.scale=1,this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight},this._bindHammer()}},{key:"_bindHammer",value:function(){var t=this;void 0!==this.hammer&&this.hammer.destroy(),this.drag={},this.pinch={},this.hammer=new h(this.frame.canvas),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:h.DIRECTION_ALL}),d.onTouch(this.hammer,function(e){t.body.eventListeners.onTouch(e)}),this.hammer.on("tap",function(e){t.body.eventListeners.onTap(e)}),this.hammer.on("doubletap",function(e){t.body.eventListeners.onDoubleTap(e)}),this.hammer.on("press",function(e){t.body.eventListeners.onHold(e)}),this.hammer.on("panstart",function(e){t.body.eventListeners.onDragStart(e)}),this.hammer.on("panmove",function(e){t.body.eventListeners.onDrag(e)}),this.hammer.on("panend",function(e){t.body.eventListeners.onDragEnd(e)}),this.hammer.on("pinch",function(e){t.body.eventListeners.onPinch(e)}),this.frame.canvas.addEventListener("mousewheel",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("DOMMouseScroll",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("mousemove",function(e){t.body.eventListeners.onMouseMove(e)}),this.frame.canvas.addEventListener("contextmenu",function(e){t.body.eventListeners.onContext(e)}),this.hammerFrame=new h(this.frame),d.onRelease(this.hammerFrame,function(e){t.body.eventListeners.onRelease(e)})}},{key:"setSize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.width,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.height;t=this._prepareValue(t),e=this._prepareValue(e);var i=!1,o=this.frame.canvas.width,n=this.frame.canvas.height,s=this.pixelRatio;if(this._setPixelRatio(),t!=this.options.width||e!=this.options.height||this.frame.style.width!=t||this.frame.style.height!=e)this._getCameraState(s),this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio),this.options.width=t,this.options.height=e,this.canvasViewCenter={x:.5*this.frame.clientWidth,y:.5*this.frame.clientHeight},i=!0;else{var r=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),a=Math.round(this.frame.canvas.clientHeight*this.pixelRatio) ;this.frame.canvas.width===r&&this.frame.canvas.height===a||this._getCameraState(s),this.frame.canvas.width!==r&&(this.frame.canvas.width=r,i=!0),this.frame.canvas.height!==a&&(this.frame.canvas.height=a,i=!0)}return!0===i&&(this.body.emitter.emit("resize",{width:Math.round(this.frame.canvas.width/this.pixelRatio),height:Math.round(this.frame.canvas.height/this.pixelRatio),oldWidth:Math.round(o/this.pixelRatio),oldHeight:Math.round(n/this.pixelRatio)}),this._setCameraState()),this.initialized=!0,i}},{key:"getContext",value:function(){return this.frame.canvas.getContext("2d")}},{key:"_determinePixelRatio",value:function(){var t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");var e=1;return"undefined"!=typeof window&&(e=window.devicePixelRatio||1),e/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)}},{key:"_setPixelRatio",value:function(){this.pixelRatio=this._determinePixelRatio()}},{key:"setTransform",value:function(){var t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}},{key:"_XconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.x)/this.body.view.scale}},{key:"_XconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.x}},{key:"_YconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.y)/this.body.view.scale}},{key:"_YconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.y}},{key:"canvasToDOM",value:function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}}},{key:"DOMtoCanvas",value:function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(76).default,l=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0,this.touchTime=0,this.viewFunction=void 0,this.body.emitter.on("fit",this.fit.bind(this)),this.body.emitter.on("animationFinished",function(){o.body.emitter.emit("_stopRendering")}),this.body.emitter.on("unlockNode",this.releaseNode.bind(this))}return(0,a.default)(t,[{key:"setOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options=t}},{key:"fit",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{nodes:[]},e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=void 0,o=void 0;if(void 0!==t.nodes&&0!==t.nodes.length||(t.nodes=this.body.nodeIndices),!0===e){var n=0;for(var s in this.body.nodes)if(this.body.nodes.hasOwnProperty(s)){var r=this.body.nodes[s];!0===r.predefinedPosition&&(n+=1)}if(n>.5*this.body.nodeIndices.length)return void this.fit(t,!1);i=d.getRange(this.body.nodes,t.nodes);o=12.662/(this.body.nodeIndices.length+7.4147)+.0964822;o*=Math.min(this.canvas.frame.canvas.clientWidth/600,this.canvas.frame.canvas.clientHeight/600)}else{this.body.emitter.emit("_resizeNodes"),i=d.getRange(this.body.nodes,t.nodes);var a=1.1*Math.abs(i.maxX-i.minX),h=1.1*Math.abs(i.maxY-i.minY),l=this.canvas.frame.canvas.clientWidth/a,u=this.canvas.frame.canvas.clientHeight/h;o=l<=u?l:u}o>1?o=1:0===o&&(o=1);var c=d.findCenter(i),p={position:c,scale:o,animation:t.animation};this.moveTo(p)}},{key:"focus",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(void 0!==this.body.nodes[t]){var i={x:this.body.nodes[t].x,y:this.body.nodes[t].y};e.position=i,e.lockedOnNode=t,this.moveTo(e)}else console.log("Node: "+t+" cannot be found.")}},{key:"moveTo",value:function(t){if(void 0===t)return void(t={});void 0===t.offset&&(t.offset={x:0,y:0}),void 0===t.offset.x&&(t.offset.x=0),void 0===t.offset.y&&(t.offset.y=0),void 0===t.scale&&(t.scale=this.body.view.scale),void 0===t.position&&(t.position=this.getViewPosition()),void 0===t.animation&&(t.animation={duration:0}),!1===t.animation&&(t.animation={duration:0}),!0===t.animation&&(t.animation={}),void 0===t.animation.duration&&(t.animation.duration=1e3),void 0===t.animation.easingFunction&&(t.animation.easingFunction="easeInOutQuad"),this.animateView(t)}},{key:"animateView",value:function(t){if(void 0!==t){this.animationEasingFunction=t.animation.easingFunction,this.releaseNode(),!0===t.locked&&(this.lockedOnNodeId=t.lockedOnNode,this.lockedOnNodeOffset=t.offset),0!=this.easingTime&&this._transitionRedraw(!0),this.sourceScale=this.body.view.scale,this.sourceTranslation=this.body.view.translation,this.targetScale=t.scale,this.body.view.scale=this.targetScale;var e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.position.x,y:e.y-t.position.y};this.targetTranslation={x:this.sourceTranslation.x+i.x*this.targetScale+t.offset.x,y:this.sourceTranslation.y+i.y*this.targetScale+t.offset.y},0===t.animation.duration?void 0!=this.lockedOnNodeId?(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)):(this.body.view.scale=this.targetScale,this.body.view.translation=this.targetTranslation,this.body.emitter.emit("_requestRedraw")):(this.animationSpeed=1/(60*t.animation.duration*.001)||1/60,this.animationEasingFunction=t.animation.easingFunction,this.viewFunction=this._transitionRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))}}},{key:"_lockedRedraw",value:function(){var t={x:this.body.nodes[this.lockedOnNodeId].x,y:this.body.nodes[this.lockedOnNodeId].y},e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.x,y:e.y-t.y},o=this.body.view.translation,n={x:o.x+i.x*this.body.view.scale+this.lockedOnNodeOffset.x,y:o.y+i.y*this.body.view.scale+this.lockedOnNodeOffset.y};this.body.view.translation=n}},{key:"releaseNode",value:function(){void 0!==this.lockedOnNodeId&&void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0)}},{key:"_transitionRedraw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.easingTime+=this.animationSpeed,this.easingTime=!0===t?1:this.easingTime;var e=h.easingFunctions[this.animationEasingFunction](this.easingTime);this.body.view.scale=this.sourceScale+(this.targetScale-this.sourceScale)*e,this.body.view.translation={x:this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*e,y:this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*e},this.easingTime>=1&&(this.body.emitter.off("initRedraw",this.viewFunction),this.easingTime=0,void 0!=this.lockedOnNodeId&&(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)),this.body.emitter.emit("animationFinished"))}},{key:"getScale",value:function(){return this.body.view.scale}},{key:"getViewPosition",value:function(){return this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight})}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(233).default,l=i(104).default,u=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.canvas=i,this.selectionHandler=o,this.navigationHandler=new d(e,i),this.body.eventListeners.onTap=this.onTap.bind(this),this.body.eventListeners.onTouch=this.onTouch.bind(this),this.body.eventListeners.onDoubleTap=this.onDoubleTap.bind(this),this.body.eventListeners.onHold=this.onHold.bind(this),this.body.eventListeners.onDragStart=this.onDragStart.bind(this),this.body.eventListeners.onDrag=this.onDrag.bind(this),this.body.eventListeners.onDragEnd=this.onDragEnd.bind(this),this.body.eventListeners.onMouseWheel=this.onMouseWheel.bind(this),this.body.eventListeners.onPinch=this.onPinch.bind(this),this.body.eventListeners.onMouseMove=this.onMouseMove.bind(this),this.body.eventListeners.onRelease=this.onRelease.bind(this),this.body.eventListeners.onContext=this.onContext.bind(this),this.touchTime=0,this.drag={},this.pinch={},this.popup=void 0,this.popupObj=void 0,this.popupTimer=void 0,this.body.functions.getPointer=this.getPointer.bind(this),this.options={},this.defaultOptions={dragNodes:!0,dragView:!0,hover:!1,keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02},bindToWindow:!0},navigationButtons:!1,tooltipDelay:300,zoomView:!0},h.extend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("destroy",function(){clearTimeout(t.popupTimer),delete t.body.functions.getPointer})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag","keyboard","multiselect","selectable","selectConnectedEdges"];h.selectiveNotDeepExtend(e,this.options,t),h.mergeOptions(this.options,t,"keyboard"),t.tooltip&&(h.extend(this.options.tooltip,t.tooltip),t.tooltip.color&&(this.options.tooltip.color=h.parseColor(t.tooltip.color)))}this.navigationHandler.setOptions(this.options)}},{key:"getPointer",value:function(t){return{x:t.x-h.getAbsoluteLeft(this.canvas.frame.canvas),y:t.y-h.getAbsoluteTop(this.canvas.frame.canvas)}}},{key:"onTouch",value:function(t){(new Date).valueOf()-this.touchTime>50&&(this.drag.pointer=this.getPointer(t.center),this.drag.pinched=!1,this.pinch.scale=this.body.view.scale,this.touchTime=(new Date).valueOf())}},{key:"onTap",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect&&(t.changedPointers[0].ctrlKey||t.changedPointers[0].metaKey);this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e)}},{key:"onDoubleTap",value:function(t){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("doubleClick",t,e)}},{key:"onHold",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect;this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e),this.selectionHandler._generateClickEvent("hold",t,e)}},{key:"onRelease",value:function(t){if((new Date).valueOf()-this.touchTime>10){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("release",t,e),this.touchTime=(new Date).valueOf()}}},{key:"onContext",value:function(t){var e=this.getPointer({x:t.clientX,y:t.clientY});this.selectionHandler._generateClickEvent("oncontext",t,e)}},{key:"checkSelectionChanges",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.selectionHandler.getSelection(),n=!1;n=!0===i?this.selectionHandler.selectAdditionalOnPoint(t):this.selectionHandler.selectOnPoint(t);var s=this.selectionHandler.getSelection(),r=this._determineDifference(o,s),a=this._determineDifference(s,o);r.edges.length>0&&(this.selectionHandler._generateClickEvent("deselectEdge",e,t,o),n=!0),r.nodes.length>0&&(this.selectionHandler._generateClickEvent("deselectNode",e,t,o),n=!0),a.nodes.length>0&&(this.selectionHandler._generateClickEvent("selectNode",e,t),n=!0),a.edges.length>0&&(this.selectionHandler._generateClickEvent("selectEdge",e,t),n=!0),!0===n&&this.selectionHandler._generateClickEvent("select",e,t)}},{key:"_determineDifference",value:function(t,e){var i=function(t,e){for(var i=[],o=0;o10&&(t=10);var o=void 0;void 0!==this.drag&&!0===this.drag.dragging&&(o=this.canvas.DOMtoCanvas(this.drag.pointer));var n=this.body.view.translation,s=t/i,r=(1-s)*e.x+n.x*s,a=(1-s)*e.y+n.y*s;if(this.body.view.scale=t,this.body.view.translation={x:r,y:a},void 0!=o){var h=this.canvas.canvasToDOM(o);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}this.body.emitter.emit("_requestRedraw"),i0&&(this.popupObj=h[u[u.length-1]],s=!0)}if(void 0===this.popupObj&&!1===s){for(var p=this.body.edgeIndices,f=this.body.edges,m=void 0,v=[],g=0;g0&&(this.popupObj=f[v[v.length-1]],r="edge")}void 0!==this.popupObj?this.popupObj.id!==n&&(void 0===this.popup&&(this.popup=new l(this.canvas.frame)),this.popup.popupTargetType=r,this.popup.popupTargetId=this.popupObj.id,this.popup.setPosition(t.x+3,t.y-5),this.popup.setText(this.popupObj.getTitle()),this.popup.show(),this.body.emitter.emit("showPopup",this.popupObj.id)):void 0!==this.popup&&(this.popup.hide(),this.body.emitter.emit("hidePopup"))}},{key:"_checkHidePopup",value:function(t){var e=this.selectionHandler._pointerToPositionObject(t),i=!1;if("node"===this.popup.popupTargetType){if(void 0!==this.body.nodes[this.popup.popupTargetId]&&!0===(i=this.body.nodes[this.popup.popupTargetId].isOverlappingWith(e))){var o=this.selectionHandler.getNodeAt(t);i=void 0!==o&&o.id===this.popup.popupTargetId}}else void 0===this.selectionHandler.getNodeAt(t)&&void 0!==this.body.edges[this.popup.popupTargetId]&&(i=this.body.edges[this.popup.popupTargetId].isOverlappingWith(e));!1===i&&(this.popupObj=void 0,this.popup.hide(),this.body.emitter.emit("hidePopup"))}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(10),d=i(37),l=i(35),u=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.iconsCreated=!1,this.navigationHammers=[],this.boundFunctions={},this.touchTime=0,this.activated=!1,this.body.emitter.on("activate",function(){o.activated=!0,o.configureKeyboardBindings()}),this.body.emitter.on("deactivate",function(){o.activated=!1,o.configureKeyboardBindings()}),this.body.emitter.on("destroy",function(){void 0!==o.keycharm&&o.keycharm.destroy()}),this.options={}}return(0,a.default)(t,[{key:"setOptions",value:function(t){void 0!==t&&(this.options=t,this.create())}},{key:"create",value:function(){!0===this.options.navigationButtons?!1===this.iconsCreated&&this.loadNavigationElements():!0===this.iconsCreated&&this.cleanNavigation(),this.configureKeyboardBindings()}},{key:"cleanNavigation",value:function(){if(0!=this.navigationHammers.length){for(var t=0;t700&&(this.body.emitter.emit("fit",{duration:700}),this.touchTime=(new Date).valueOf())}},{key:"_stopMovement",value:function(){for(var t in this.boundFunctions)this.boundFunctions.hasOwnProperty(t)&&(this.body.emitter.off("initRedraw",this.boundFunctions[t]),this.body.emitter.emit("_stopRendering"));this.boundFunctions={}}},{key:"_moveUp",value:function(){this.body.view.translation.y+=this.options.keyboard.speed.y}},{key:"_moveDown",value:function(){this.body.view.translation.y-=this.options.keyboard.speed.y}},{key:"_moveLeft",value:function(){this.body.view.translation.x+=this.options.keyboard.speed.x}},{key:"_moveRight",value:function(){this.body.view.translation.x-=this.options.keyboard.speed.x}},{key:"_zoomIn",value:function(){var t=this.body.view.scale,e=this.body.view.scale*(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,o=e/t,n=(1-o)*this.canvas.canvasViewCenter.x+i.x*o,s=(1-o)*this.canvas.canvasViewCenter.y+i.y*o;this.body.view.scale=e,this.body.view.translation={x:n,y:s},this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale,pointer:null})}},{key:"_zoomOut",value:function(){var t=this.body.view.scale,e=this.body.view.scale/(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,o=e/t,n=(1-o)*this.canvas.canvasViewCenter.x+i.x*o,s=(1-o)*this.canvas.canvasViewCenter.y+i.y*o;this.body.view.scale=e,this.body.view.translation={x:n,y:s},this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale,pointer:null})}},{key:"configureKeyboardBindings",value:function(){var t=this;void 0!==this.keycharm&&this.keycharm.destroy(),!0===this.options.keyboard.enabled&&(!0===this.options.keyboard.bindToWindow?this.keycharm=l({container:window,preventDefault:!0}):this.keycharm=l({container:this.canvas.frame,preventDefault:!0}),this.keycharm.reset(),!0===this.activated&&(this.keycharm.bind("up",function(){t.bindToRedraw("_moveUp")},"keydown"),this.keycharm.bind("down",function(){t.bindToRedraw("_moveDown")},"keydown"),this.keycharm.bind("left",function(){t.bindToRedraw("_moveLeft")},"keydown"),this.keycharm.bind("right",function(){t.bindToRedraw("_moveRight")},"keydown"),this.keycharm.bind("=",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num+",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("[",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("]",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pageup",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pagedown",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("up",function(){t.unbindFromRedraw("_moveUp")},"keyup"),this.keycharm.bind("down",function(){t.unbindFromRedraw("_moveDown")},"keyup"),this.keycharm.bind("left",function(){t.unbindFromRedraw("_moveLeft")},"keyup"),this.keycharm.bind("right",function(){t.unbindFromRedraw("_moveRight")},"keyup"),this.keycharm.bind("=",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num+",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("[",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("]",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pageup",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pagedown",function(){t.unbindFromRedraw("_zoomOut")},"keyup")))}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(47).default,d=i(74).default,l=i(2),u=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.selectionObj={nodes:[],edges:[]},this.hoverObj={nodes:{},edges:{}},this.options={},this.defaultOptions={multiselect:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0},l.extend(this.options,this.defaultOptions),this.body.emitter.on("_dataChanged",function(){o.updateSelection()})}return(0,a.default)(t,[{key:"setOptions",value:function(t){if(void 0!==t){var e=["multiselect","hoverConnectedEdges","selectable","selectConnectedEdges"];l.selectiveDeepExtend(e,this.options,t)}}},{key:"selectOnPoint",value:function(t){var e=!1;if(!0===this.options.selectable){var i=this.getNodeAt(t)||this.getEdgeAt(t);this.unselectAll(),void 0!==i&&(e=this.selectObject(i)),this.body.emitter.emit("_requestRedraw")}return e}},{key:"selectAdditionalOnPoint",value:function(t){var e=!1;if(!0===this.options.selectable){var i=this.getNodeAt(t)||this.getEdgeAt(t);void 0!==i&&(e=!0,!0===i.isSelected()?this.deselectObject(i):this.selectObject(i),this.body.emitter.emit("_requestRedraw"))}return e}},{key:"_initBaseEvent",value:function(t,e){var i={};return i.pointer={DOM:{x:e.x,y:e.y},canvas:this.canvas.DOMtoCanvas(e)},i.event=t,i}},{key:"_generateClickEvent",value:function(t,e,i,o){var n=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=this._initBaseEvent(e,i);if(!0===n)s.nodes=[],s.edges=[];else{var r=this.getSelection();s.nodes=r.nodes,s.edges=r.edges}void 0!==o&&(s.previousSelection=o),"click"==t&&(s.items=this.getClickedItems(i)),this.body.emitter.emit(t,s)}},{key:"selectObject",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.selectConnectedEdges;return void 0!==t&&(t instanceof h&&!0===e&&this._selectConnectedEdges(t),t.select(),this._addToSelection(t),!0)}},{key:"deselectObject",value:function(t){!0===t.isSelected()&&(t.selected=!1,this._removeFromSelection(t))}},{key:"_getAllNodesOverlappingWith",value:function(t){for(var e=[],i=this.body.nodes,o=0;o1&&void 0!==arguments[1])||arguments[1],i=this._pointerToPositionObject(t),o=this._getAllNodesOverlappingWith(i);return o.length>0?!0===e?this.body.nodes[o[o.length-1]]:o[o.length-1]:void 0}},{key:"_getEdgesOverlappingWith",value:function(t,e){for(var i=this.body.edges,o=0;o1&&void 0!==arguments[1])||arguments[1],i=this.canvas.DOMtoCanvas(t),o=10,n=null,s=this.body.edges,r=0;r1)return!0;return!1}},{key:"_selectConnectedEdges",value:function(t){for(var e=0;e1&&void 0!==arguments[1]?arguments[1]:{},i=void 0,o=void 0 ;if(!t||!t.nodes&&!t.edges)throw"Selection must be an object with nodes and/or edges properties";if((e.unselectAll||void 0===e.unselectAll)&&this.unselectAll(),t.nodes)for(i=0;i1&&void 0!==arguments[1])||arguments[1];if(!t||void 0===t.length)throw"Selection must be an array with ids";this.setSelection({nodes:t},{highlightEdges:e})}},{key:"selectEdges",value:function(t){if(!t||void 0===t.length)throw"Selection must be an array with ids";this.setSelection({edges:t})}},{key:"updateSelection",value:function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.body.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.body.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},{key:"getClickedItems",value:function(t){for(var e=this.canvas.DOMtoCanvas(t),i=[],o=this.body.nodeIndices,n=this.body.nodes,s=o.length-1;s>=0;s--){var r=n[o[s]],a=r.getItemsOnPoint(e);i.push.apply(i,a)}for(var h=this.body.edgeIndices,d=this.body.edges,l=h.length-1;l>=0;l--){var u=d[h[l]],c=u.getItemsOnPoint(e);i.push.apply(i,c)}return i}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(6),a=o(r),h=i(8),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(76).default,v=i(236),g=v.HorizontalStrategy,y=v.VerticalStrategy,b=function(){function t(){(0,u.default)(this,t),this.childrenReference={},this.parentReference={},this.trees={},this.distributionOrdering={},this.levels={},this.distributionIndex={},this.isTree=!1,this.treeIndex=-1}return(0,p.default)(t,[{key:"addRelation",value:function(t,e){void 0===this.childrenReference[t]&&(this.childrenReference[t]=[]),this.childrenReference[t].push(e),void 0===this.parentReference[e]&&(this.parentReference[e]=[]),this.parentReference[e].push(t)}},{key:"checkIfTree",value:function(){for(var t in this.parentReference)if(this.parentReference[t].length>1)return void(this.isTree=!1);this.isTree=!0}},{key:"numTrees",value:function(){return this.treeIndex+1}},{key:"setTreeIndex",value:function(t,e){void 0!==e&&void 0===this.trees[t.id]&&(this.trees[t.id]=e,this.treeIndex=Math.max(e,this.treeIndex))}},{key:"ensureLevel",value:function(t){void 0===this.levels[t]&&(this.levels[t]=0)}},{key:"getMaxLevel",value:function(t){var e=this,i={};return function t(o){if(void 0!==i[o])return i[o];var n=e.levels[o];if(e.childrenReference[o]){var s=e.childrenReference[o];if(s.length>0)for(var r=0;r0&&(i.levelSeparation*=-1):i.levelSeparation<0&&(i.levelSeparation*=-1),this.setDirectionStrategy(),this.body.emitter.emit("_resetHierarchicalLayout"),this.adaptAllOptionsForHierarchicalLayout(e);if(!0===o)return this.body.emitter.emit("refresh"),f.deepExtend(e,this.optionsBackup)}return e}},{key:"adaptAllOptionsForHierarchicalLayout",value:function(t){if(!0===this.options.hierarchical.enabled){var e=this.optionsBackup.physics;void 0===t.physics||!0===t.physics?(t.physics={enabled:void 0===e.enabled||e.enabled,solver:"hierarchicalRepulsion"},e.enabled=void 0===e.enabled||e.enabled,e.solver=e.solver||"barnesHut"):"object"===(0,a.default)(t.physics)?(e.enabled=void 0===t.physics.enabled||t.physics.enabled,e.solver=t.physics.solver||"barnesHut",t.physics.solver="hierarchicalRepulsion"):!1!==t.physics&&(e.solver="barnesHut",t.physics={solver:"hierarchicalRepulsion"});var i=this.direction.curveType();if(void 0===t.edges)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges={smooth:!1};else if(void 0===t.edges.smooth)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges.smooth=!1;else if("boolean"==typeof t.edges.smooth)this.optionsBackup.edges={smooth:t.edges.smooth},t.edges.smooth={enabled:t.edges.smooth,type:i};else{var o=t.edges.smooth;void 0!==o.type&&"dynamic"!==o.type&&(i=o.type),this.optionsBackup.edges={smooth:void 0===o.enabled||o.enabled,type:void 0===o.type?"dynamic":o.type,roundness:void 0===o.roundness?.5:o.roundness,forceDirection:void 0!==o.forceDirection&&o.forceDirection},t.edges.smooth={enabled:void 0===o.enabled||o.enabled,type:i,roundness:void 0===o.roundness?.5:o.roundness,forceDirection:void 0!==o.forceDirection&&o.forceDirection}}this.body.emitter.emit("_forceDisableDynamicCurves",i)}return t}},{key:"seededRandom",value:function(){var t=1e4*Math.sin(this.randomSeed++);return t-Math.floor(t)}},{key:"positionInitially",value:function(t){if(!0!==this.options.hierarchical.enabled){this.randomSeed=this.initialRandomSeed;for(var e=t.length+50,i=0;i150){for(var s=t.length;t.length>150&&o<=10;){o+=1;var r=t.length;o%3==0?this.body.modules.clustering.clusterBridges(n):this.body.modules.clustering.clusterOutliers(n);if(r==t.length&&o%3!=0)return this._declusterAll(),this.body.emitter.emit("_layoutFailed"),void console.info("This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance.")}this.body.modules.kamadaKawai.setOptions({springLength:Math.max(150,2*s)})}o>10&&console.info("The clustering didn't succeed within the amount of interations allowed, progressing with partial result."),this.body.modules.kamadaKawai.solve(t,this.body.edgeIndices,!0),this._shiftToCenter();for(var a=0;a0){var t=void 0,e=void 0,i=!1,o=!1;this.lastNodeOnLevel={},this.hierarchical=new b;for(e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&(t=this.body.nodes[e],void 0!==t.options.level?(i=!0,this.hierarchical.levels[e]=t.options.level):o=!0);if(!0===o&&!0===i)throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.");if(!0===o){var n=this.options.hierarchical.sortMethod;"hubsize"===n?this._determineLevelsByHubsize():"directed"===n?this._determineLevelsDirected():"custom"===n&&this._determineLevelsCustomCallback()}for(var s in this.body.nodes)this.body.nodes.hasOwnProperty(s)&&this.hierarchical.ensureLevel(s);var r=this._getDistribution();this._generateMap(),this._placeNodesByHierarchy(r),this._condenseHierarchy(),this._shiftToCenter()}}},{key:"_condenseHierarchy",value:function(){var t=this,e=!1,i={},o=function(e,i){var o=t.hierarchical.trees;for(var n in o)o.hasOwnProperty(n)&&o[n]===e&&t.direction.shift(n,i)},n=function(){for(var e=[],i=0;i0)for(var s=0;s1&&void 0!==arguments[1]?arguments[1]:1e9,o=1e9,n=1e9,r=1e9,a=-1e9;for(var h in e)if(e.hasOwnProperty(h)){var d=t.body.nodes[h],l=t.hierarchical.levels[d.id],u=t.direction.getPosition(d),c=t._getSpaceAroundNode(d,e),p=(0,s.default)(c,2),f=p[0],m=p[1];o=Math.min(f,o),n=Math.min(m,n),l<=i&&(r=Math.min(u,r),a=Math.max(u,a))}return[r,a,o,n]},h=function(e,i){var o=t.hierarchical.getMaxLevel(e.id),n=t.hierarchical.getMaxLevel(i.id);return Math.min(o,n)},d=function(e,i,o){for(var n=t.hierarchical,s=0;s1)for(var h=0;h2&&void 0!==arguments[2]&&arguments[2],s=t.direction.getPosition(i),d=t.direction.getPosition(o),l=Math.abs(d-s),u=t.options.hierarchical.nodeSpacing;if(l>u){var c={},p={};r(i,c),r(o,p);var f=h(i,o),m=a(c,f),v=a(p,f),g=m[1],y=v[0],b=v[2];if(Math.abs(g-y)>u){var _=g-y+u;_<-b+u&&(_=-b+u),_<0&&(t._shiftBlock(o.id,_),e=!0,!0===n&&t._centerParent(o))}}},u=function(o,n){for(var h=n.id,d=n.edges,l=t.hierarchical.levels[n.id],u=t.options.hierarchical.levelSeparation*t.options.hierarchical.levelSeparation,c={},p=[],f=0;f0?p=Math.min(c,u-t.options.hierarchical.nodeSpacing):c<0&&(p=-Math.min(-c,l-t.options.hierarchical.nodeSpacing)),0!=p&&(t._shiftBlock(n.id,p),e=!0)}(_),_=b(o,d),function(i){var o=t.direction.getPosition(n),r=t._getSpaceAroundNode(n),a=(0,s.default)(r,2),h=a[0],d=a[1],l=i-o,u=o;l>0?u=Math.min(o+(d-t.options.hierarchical.nodeSpacing),i):l<0&&(u=Math.max(o-(h-t.options.hierarchical.nodeSpacing),i)),u!==o&&(t.direction.setPosition(n,u),e=!0)}(_)};!0===this.options.hierarchical.blockShifting&&(function(i){var o=t.hierarchical.getLevels();o=o.reverse();for(var n=0;n0&&Math.abs(p)0&&(a=this.direction.getPosition(i[n-1])+r),this.direction.setPosition(s,a,e),this._validatePositionAndContinue(s,e,a),o++}}}}},{key:"_placeBranchNodes",value:function(t,e){var i=this.hierarchical.childrenReference[t];if(void 0!==i){for(var o=[],n=0;ne&&void 0===this.positionedNodes[r.id]))return;var h=this.options.hierarchical.nodeSpacing,d=void 0;d=0===s?this.direction.getPosition(this.body.nodes[t]):this.direction.getPosition(o[s-1])+h,this.direction.setPosition(r,d,a),this._validatePositionAndContinue(r,a,d)}var l=this._getCenterPosition(o);this.direction.setPosition(this.body.nodes[t],l,e)}}},{key:"_validatePositionAndContinue",value:function(t,e,i){if(this.hierarchical.isTree){if(void 0!==this.lastNodeOnLevel[e]){var o=this.direction.getPosition(this.body.nodes[this.lastNodeOnLevel[e]]);if(i-ot.hierarchical.levels[e.id]&&t.hierarchical.addRelation(e.id,i.id)};this._crawlNetwork(e),this.hierarchical.checkIfTree()}},{key:"_crawlNetwork",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){},i=arguments[1],o={},n=function i(n,s){if(void 0===o[n.id]){t.hierarchical.setTreeIndex(n,s),o[n.id]=!0;for(var r=void 0,a=t._getActiveEdges(n),h=0;h2&&void 0!==arguments[2]?arguments[2]:void 0;this.fake_use(t,e,i),this.abstract()}},{key:"getTreeSize",value:function(t){return this.fake_use(t),this.abstract()}},{key:"sort",value:function(t){this.fake_use(t),this.abstract()}},{key:"fix",value:function(t,e){this.fake_use(t,e),this.abstract()}},{key:"shift",value:function(t,e){this.fake_use(t,e),this.abstract()}}]),t}(),m=function(t){function e(t){(0,u.default)(this,e);var i=(0,a.default)(this,(e.__proto__||(0,s.default)(e)).call(this));return i.layout=t,i}return(0,d.default)(e,t),(0,p.default)(e,[{key:"curveType",value:function(){return"horizontal"}},{key:"getPosition",value:function(t){return t.x}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==i&&this.layout.hierarchical.addToOrdering(t,i),t.x=e}},{key:"getTreeSize",value:function(t){var e=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,t);return{min:e.min_x,max:e.max_x}}},{key:"sort",value:function(t){t.sort(function(t,e){return void 0===t.x||void 0===e.x?0:t.x-e.x})}},{key:"fix",value:function(t,e){t.y=this.layout.options.hierarchical.levelSeparation*e,t.options.fixed.y=!0}},{key:"shift",value:function(t,e){this.layout.body.nodes[t].x+=e}}]),e}(f),v=function(t){function e(t){(0,u.default)(this,e);var i=(0,a.default)(this,(e.__proto__||(0,s.default)(e)).call(this));return i.layout=t,i}return(0,d.default)(e,t),(0,p.default)(e,[{key:"curveType",value:function(){return"vertical"}},{key:"getPosition",value:function(t){return t.y}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==i&&this.layout.hierarchical.addToOrdering(t,i),t.y=e}},{key:"getTreeSize",value:function(t){var e=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,t);return{min:e.min_y,max:e.max_y}}},{key:"sort",value:function(t){t.sort(function(t,e){return void 0===t.y||void 0===e.y?0:t.y-e.y})}},{key:"fix",value:function(t,e){t.x=this.layout.options.hierarchical.levelSeparation*e,t.options.fixed.x=!0}},{key:"shift",value:function(t,e){this.layout.body.nodes[t].y+=e}}]),e}(f);e.HorizontalStrategy=v,e.VerticalStrategy=m},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(19),a=o(r),h=i(6),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(10),v=i(37),g=function(){function t(e,i,o){var n=this;(0,u.default)(this,t),this.body=e,this.canvas=i,this.selectionHandler=o,this.editMode=!1,this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0,this.manipulationHammers=[],this.temporaryUIFunctions={},this.temporaryEventFunctions=[],this.touchTime=0,this.temporaryIds={nodes:[],edges:[]},this.guiEnabled=!1,this.inMode=!1,this.selectedControlNode=void 0,this.options={},this.defaultOptions={enabled:!1,initiallyActive:!1,addNode:!0,addEdge:!0,editNode:void 0,editEdge:!0,deleteNode:!0,deleteEdge:!0,controlNodeStyle:{shape:"dot",size:6,color:{background:"#ff0000",border:"#3c3c3c",highlight:{background:"#07f968",border:"#3c3c3c"}},borderWidth:2,borderWidthSelected:2}},f.extend(this.options,this.defaultOptions),this.body.emitter.on("destroy",function(){n._clean()}),this.body.emitter.on("_dataChanged",this._restore.bind(this)),this.body.emitter.on("_resetData",this._restore.bind(this))}return(0,p.default)(t,[{key:"_restore",value:function(){!1!==this.inMode&&(!0===this.options.initiallyActive?this.enableEditMode():this.disableEditMode())}},{key:"setOptions",value:function(t,e,i){void 0!==e&&(void 0!==e.locale?this.options.locale=e.locale:this.options.locale=i.locale,void 0!==e.locales?this.options.locales=e.locales:this.options.locales=i.locales),void 0!==t&&("boolean"==typeof t?this.options.enabled=t:(this.options.enabled=!0,f.deepExtend(this.options,t)),!0===this.options.initiallyActive&&(this.editMode=!0),this._setup())}},{key:"toggleEditMode",value:function(){!0===this.editMode?this.disableEditMode():this.enableEditMode()}},{key:"enableEditMode",value:function(){this.editMode=!0,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="block",this.closeDiv.style.display="block",this.editModeDiv.style.display="none",this.showManipulatorToolbar())}},{key:"disableEditMode",value:function(){this.editMode=!1,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="none",this.closeDiv.style.display="none",this.editModeDiv.style.display="block",this._createEditButton())}},{key:"showManipulatorToolbar",value:function(){if(this._clean(),this.manipulationDOM={},!0===this.guiEnabled){this.editMode=!0,this.manipulationDiv.style.display="block",this.closeDiv.style.display="block";var t=this.selectionHandler._getSelectedNodeCount(),e=this.selectionHandler._getSelectedEdgeCount(),i=t+e,o=this.options.locales[this.options.locale],n=!1;!1!==this.options.addNode&&(this._createAddNodeButton(o),n=!0),!1!==this.options.addEdge&&(!0===n?this._createSeperator(1):n=!0,this._createAddEdgeButton(o)),1===t&&"function"==typeof this.options.editNode?(!0===n?this._createSeperator(2):n=!0,this._createEditNodeButton(o)):1===e&&0===t&&!1!==this.options.editEdge&&(!0===n?this._createSeperator(3):n=!0,this._createEditEdgeButton(o)),0!==i&&(t>0&&!1!==this.options.deleteNode?(!0===n&&this._createSeperator(4),this._createDeleteButton(o)):0===t&&!1!==this.options.deleteEdge&&(!0===n&&this._createSeperator(4),this._createDeleteButton(o))),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this)),this._temporaryBindEvent("select",this.showManipulatorToolbar.bind(this))}this.body.emitter.emit("_redraw")}},{key:"addNodeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addNode",!0===this.guiEnabled){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.addDescription||this.options.locales.en.addDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindEvent("click",this._performAddNode.bind(this))}},{key:"editNode",value:function(){var t=this;!0!==this.editMode&&this.enableEditMode(),this._clean();var e=this.selectionHandler._getSelectedNode();if(void 0!==e){if(this.inMode="editNode","function"!=typeof this.options.editNode)throw new Error("No function has been configured to handle the editing of nodes.");if(!0!==e.isCluster){var i=f.deepExtend({},e.options,!1);if(i.x=e.x,i.y=e.y,2!==this.options.editNode.length)throw new Error("The function for edit does not support two arguments (data, callback)");this.options.editNode(i,function(e){null!==e&&void 0!==e&&"editNode"===t.inMode&&t.body.data.nodes.getDataSet().update(e),t.showManipulatorToolbar()})}else alert(this.options.locales[this.options.locale].editClusterError||this.options.locales.en.editClusterError)}else this.showManipulatorToolbar()}},{key:"addEdgeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addEdge",!0===this.guiEnabled){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.edgeDescription||this.options.locales.en.edgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindUI("onTouch",this._handleConnect.bind(this)),this._temporaryBindUI("onDragEnd",this._finishConnect.bind(this)),this._temporaryBindUI("onDrag",this._dragControlNode.bind(this)),this._temporaryBindUI("onRelease",this._finishConnect.bind(this)),this._temporaryBindUI("onDragStart",this._dragStartEdge.bind(this)),this._temporaryBindUI("onHold",function(){})}},{key:"editEdgeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="editEdge","object"===(0,d.default)(this.options.editEdge)&&"function"==typeof this.options.editEdge.editWithoutDrag&&(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId)){var t=this.body.edges[this.edgeBeingEditedId];return void this._performEditEdge(t.from,t.to)}if(!0===this.guiEnabled){var e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.editEdgeDescription||this.options.locales.en.editEdgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}if(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId){var i=this.body.edges[this.edgeBeingEditedId],o=this._getNewTargetNode(i.from.x,i.from.y),n=this._getNewTargetNode(i.to.x,i.to.y);this.temporaryIds.nodes.push(o.id),this.temporaryIds.nodes.push(n.id),this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id),this.body.nodes[n.id]=n,this.body.nodeIndices.push(n.id),this._temporaryBindUI("onTouch",this._controlNodeTouch.bind(this)),this._temporaryBindUI("onTap",function(){}),this._temporaryBindUI("onHold",function(){}),this._temporaryBindUI("onDragStart",this._controlNodeDragStart.bind(this)),this._temporaryBindUI("onDrag",this._controlNodeDrag.bind(this)),this._temporaryBindUI("onDragEnd",this._controlNodeDragEnd.bind(this)),this._temporaryBindUI("onMouseMove",function(){}),this._temporaryBindEvent("beforeDrawing",function(t){var e=i.edgeType.findBorderPositions(t);!1===o.selected&&(o.x=e.from.x,o.y=e.from.y),!1===n.selected&&(n.x=e.to.x,n.y=e.to.y)}),this.body.emitter.emit("_redraw")}else this.showManipulatorToolbar()}},{key:"deleteSelected",value:function(){var t=this;!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="delete";var e=this.selectionHandler.getSelectedNodes(),i=this.selectionHandler.getSelectedEdges(),o=void 0;if(e.length>0){for(var n=0;n0&&"function"==typeof this.options.deleteEdge&&(o=this.options.deleteEdge);if("function"==typeof o){var s={nodes:e,edges:i};if(2!==o.length)throw new Error("The function for delete does not support two arguments (data, callback)");o(s,function(e){null!==e&&void 0!==e&&"delete"===t.inMode?(t.body.data.edges.getDataSet().remove(e.edges),t.body.data.nodes.getDataSet().remove(e.nodes),t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar()):(t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().remove(i),this.body.data.nodes.getDataSet().remove(e),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()}},{key:"_setup",value:function(){!0===this.options.enabled?(this.guiEnabled=!0,this._createWrappers(),!1===this.editMode?this._createEditButton():this.showManipulatorToolbar()):(this._removeManipulationDOM(),this.guiEnabled=!1)}},{key:"_createWrappers",value:function(){void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="vis-manipulation",!0===this.editMode?this.manipulationDiv.style.display="block":this.manipulationDiv.style.display="none",this.canvas.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="vis-edit-mode",!0===this.editMode?this.editModeDiv.style.display="none":this.editModeDiv.style.display="block",this.canvas.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="vis-close",this.closeDiv.style.display=this.manipulationDiv.style.display,this.canvas.frame.appendChild(this.closeDiv))}},{key:"_getNewTargetNode",value:function(t,e){var i=f.deepExtend({},this.options.controlNodeStyle);i.id="targetNode"+f.randomUUID(),i.hidden=!1,i.physics=!1,i.x=t,i.y=e;var o=this.body.functions.createNode(i);return o.shape.boundingBox={left:t,right:t,top:e,bottom:e},o}},{key:"_createEditButton",value:function(){this._clean(),this.manipulationDOM={},f.recursiveDOMDelete(this.editModeDiv);var t=this.options.locales[this.options.locale],e=this._createButton("editMode","vis-button vis-edit vis-edit-mode",t.edit||this.options.locales.en.edit);this.editModeDiv.appendChild(e),this._bindHammerToDiv(e,this.toggleEditMode.bind(this))}},{key:"_clean",value:function(){this.inMode=!1,!0===this.guiEnabled&&(f.recursiveDOMDelete(this.editModeDiv),f.recursiveDOMDelete(this.manipulationDiv),this._cleanManipulatorHammers()),this._cleanupTemporaryNodesAndEdges(),this._unbindTemporaryUIs(),this._unbindTemporaryEvents(),this.body.emitter.emit("restorePhysics")}},{key:"_cleanManipulatorHammers",value:function(){if(0!=this.manipulationHammers.length){for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:1;this.manipulationDOM["seperatorLineDiv"+t]=document.createElement("div"),this.manipulationDOM["seperatorLineDiv"+t].className="vis-separator-line",this.manipulationDiv.appendChild(this.manipulationDOM["seperatorLineDiv"+t])}},{key:"_createAddNodeButton",value:function(t){var e=this._createButton("addNode","vis-button vis-add",t.addNode||this.options.locales.en.addNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addNodeMode.bind(this))}},{key:"_createAddEdgeButton",value:function(t){var e=this._createButton("addEdge","vis-button vis-connect",t.addEdge||this.options.locales.en.addEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addEdgeMode.bind(this))}},{key:"_createEditNodeButton",value:function(t){var e=this._createButton("editNode","vis-button vis-edit",t.editNode||this.options.locales.en.editNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editNode.bind(this))}},{key:"_createEditEdgeButton",value:function(t){var e=this._createButton("editEdge","vis-button vis-edit",t.editEdge||this.options.locales.en.editEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editEdgeMode.bind(this))}},{key:"_createDeleteButton",value:function(t){var e;e=this.options.rtl?"vis-button vis-delete-rtl":"vis-button vis-delete";var i=this._createButton("delete",e,t.del||this.options.locales.en.del);this.manipulationDiv.appendChild(i),this._bindHammerToDiv(i,this.deleteSelected.bind(this))}},{key:"_createBackButton",value:function(t){var e=this._createButton("back","vis-button vis-back",t.back||this.options.locales.en.back);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.showManipulatorToolbar.bind(this))}},{key:"_createButton",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"vis-label";return this.manipulationDOM[t+"Div"]=document.createElement("div"),this.manipulationDOM[t+"Div"].className=e,this.manipulationDOM[t+"Label"]=document.createElement("div"),this.manipulationDOM[t+"Label"].className=o,this.manipulationDOM[t+"Label"].innerHTML=i,this.manipulationDOM[t+"Div"].appendChild(this.manipulationDOM[t+"Label"]),this.manipulationDOM[t+"Div"]}},{key:"_createDescription",value:function(t){this.manipulationDiv.appendChild(this._createButton("description","vis-button vis-none",t))}},{key:"_temporaryBindEvent",value:function(t,e){this.temporaryEventFunctions.push({event:t,boundFunction:e}),this.body.emitter.on(t,e)}},{key:"_temporaryBindUI",value:function(t,e){if(void 0===this.body.eventListeners[t])throw new Error("This UI function does not exist. Typo? You tried: "+t+" possible are: "+(0,a.default)((0,s.default)(this.body.eventListeners)));this.temporaryUIFunctions[t]=this.body.eventListeners[t],this.body.eventListeners[t]=e}},{key:"_unbindTemporaryUIs",value:function(){for(var t in this.temporaryUIFunctions)this.temporaryUIFunctions.hasOwnProperty(t)&&(this.body.eventListeners[t]=this.temporaryUIFunctions[t],delete this.temporaryUIFunctions[t]);this.temporaryUIFunctions={}}},{key:"_unbindTemporaryEvents",value:function(){for(var t=0;t=0;r--)if(n[r]!==this.selectedControlNode.id){s=this.body.nodes[n[r]];break}if(void 0!==s&&void 0!==this.selectedControlNode)if(!0===s.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var a=this.body.nodes[this.temporaryIds.nodes[0]];this.selectedControlNode.id===a.id?this._performEditEdge(s.id,o.to.id):this._performEditEdge(o.from.id,s.id)}else o.updateEdgeType(),this.body.emitter.emit("restorePhysics");this.body.emitter.emit("_redraw")}}},{key:"_handleConnect",value:function(t){if((new Date).valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(t.center),this.lastTouch.translation=f.extend({},this.body.view.translation);var e=this.lastTouch,i=this.selectionHandler.getNodeAt(e);if(void 0!==i)if(!0===i.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var o=this._getNewTargetNode(i.x,i.y);this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id);var n=this.body.functions.createEdge({id:"connectionEdge"+f.randomUUID(),from:i.id,to:o.id,physics:!1,smooth:{enabled:!0,type:"continuous",roundness:.5}});this.body.edges[n.id]=n,this.body.edgeIndices.push(n.id),this.temporaryIds.nodes.push(o.id),this.temporaryIds.edges.push(n.id)}this.touchTime=(new Date).valueOf()}}},{key:"_dragControlNode",value:function(t){var e=this.body.functions.getPointer(t.center);if(void 0!==this.temporaryIds.nodes[0]){var i=this.body.nodes[this.temporaryIds.nodes[0]];i.x=this.canvas._XconvertDOMtoCanvas(e.x),i.y=this.canvas._YconvertDOMtoCanvas(e.y),this.body.emitter.emit("_redraw")}else{var o=e.x-this.lastTouch.x,n=e.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+o,y:this.lastTouch.translation.y+n}}}},{key:"_finishConnect",value:function(t){var e=this.body.functions.getPointer(t.center),i=this.selectionHandler._pointerToPositionObject(e),o=void 0;void 0!==this.temporaryIds.edges[0]&&(o=this.body.edges[this.temporaryIds.edges[0]].fromId);for(var n=this.selectionHandler._getAllNodesOverlappingWith(i),s=void 0,r=n.length-1;r>=0;r--)if(-1===this.temporaryIds.nodes.indexOf(n[r])){s=this.body.nodes[n[r]];break}this._cleanupTemporaryNodesAndEdges(),void 0!==s&&(!0===s.isCluster?alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError):void 0!==this.body.nodes[o]&&void 0!==this.body.nodes[s.id]&&this._performAddEdge(o,s.id)),this.body.emitter.emit("_redraw")}},{key:"_dragStartEdge",value:function(t){var e=this.lastTouch;this.selectionHandler._generateClickEvent("dragStart",t,e,void 0,!0)}},{key:"_performAddNode",value:function(t){var e=this,i={id:f.randomUUID(),x:t.pointer.canvas.x,y:t.pointer.canvas.y,label:"new"};if("function"==typeof this.options.addNode){if(2!==this.options.addNode.length)throw this.showManipulatorToolbar(),new Error("The function for add does not support two arguments (data,callback)");this.options.addNode(i,function(t){null!==t&&void 0!==t&&"addNode"===e.inMode&&(e.body.data.nodes.getDataSet().add(t),e.showManipulatorToolbar())})}else this.body.data.nodes.getDataSet().add(i),this.showManipulatorToolbar()}},{key:"_performAddEdge",value:function(t,e){var i=this,o={from:t,to:e};if("function"==typeof this.options.addEdge){if(2!==this.options.addEdge.length)throw new Error("The function for connect does not support two arguments (data,callback)");this.options.addEdge(o,function(t){null!==t&&void 0!==t&&"addEdge"===i.inMode&&(i.body.data.edges.getDataSet().add(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().add(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}},{key:"_performEditEdge",value:function(t,e){var i=this,o={id:this.edgeBeingEditedId,from:t,to:e,label:this.body.data.edges._data[this.edgeBeingEditedId].label},n=this.options.editEdge;if("object"===(void 0===n?"undefined":(0,d.default)(n))&&(n=n.editWithoutDrag),"function"==typeof n){if(2!==n.length)throw new Error("The function for edit does not support two arguments (data, callback)");n(o,function(t){null===t||void 0===t||"editEdge"!==i.inMode?(i.body.edges[o.id].updateEdgeType(),i.body.emitter.emit("_redraw"),i.showManipulatorToolbar()):(i.body.data.edges.getDataSet().update(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().update(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}}]),t}();e.default=g},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(239),u=o(l),c=function(){function t(e,i,o){(0,a.default)(this,t),this.body=e,this.springLength=i,this.springConstant=o,this.distanceSolver=new u.default}return(0,d.default)(t,[{key:"setOptions",value:function(t){t&&(t.springLength&&(this.springLength=t.springLength),t.springConstant&&(this.springConstant=t.springConstant))}},{key:"solve",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.distanceSolver.getDistances(this.body,t,e);this._createL_matrix(o),this._createK_matrix(o),this._createE_matrix();for(var n=0,r=Math.max(1e3,Math.min(10*this.body.nodeIndices.length,6e3)),a=1e9,h=0,d=0,l=0,u=0,c=0;a>.01&&n1&&c<5;){c+=1,this._moveNode(h,d,l);var m=this._getEnergy(h),v=(0,s.default)(m,3);u=v[0],d=v[1],l=v[2]}}}},{key:"_getHighestEnergyNode",value:function(t){for(var e=this.body.nodeIndices,i=this.body.nodes,o=0,n=e[0],r=0,a=0,h=0;h0&&"function"==typeof this.options.deleteEdge&&(o=this.options.deleteEdge);if("function"==typeof o){var s={nodes:e,edges:i};if(2!==o.length)throw new Error("The function for delete does not support two arguments (data, callback)");o(s,function(e){null!==e&&void 0!==e&&"delete"===t.inMode?(t.body.data.edges.getDataSet().remove(e.edges),t.body.data.nodes.getDataSet().remove(e.nodes),t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar()):(t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().remove(i),this.body.data.nodes.getDataSet().remove(e),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()}},{key:"_setup",value:function(){!0===this.options.enabled?(this.guiEnabled=!0,this._createWrappers(),!1===this.editMode?this._createEditButton():this.showManipulatorToolbar()):(this._removeManipulationDOM(),this.guiEnabled=!1)}},{key:"_createWrappers",value:function(){void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="vis-manipulation",!0===this.editMode?this.manipulationDiv.style.display="block":this.manipulationDiv.style.display="none",this.canvas.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="vis-edit-mode",!0===this.editMode?this.editModeDiv.style.display="none":this.editModeDiv.style.display="block",this.canvas.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="vis-close",this.closeDiv.style.display=this.manipulationDiv.style.display,this.canvas.frame.appendChild(this.closeDiv))}},{key:"_getNewTargetNode",value:function(t,e){var i=f.deepExtend({},this.options.controlNodeStyle);i.id="targetNode"+f.randomUUID(),i.hidden=!1,i.physics=!1,i.x=t,i.y=e;var o=this.body.functions.createNode(i);return o.shape.boundingBox={left:t,right:t,top:e,bottom:e},o}},{key:"_createEditButton",value:function(){this._clean(),this.manipulationDOM={},f.recursiveDOMDelete(this.editModeDiv);var t=this.options.locales[this.options.locale],e=this._createButton("editMode","vis-button vis-edit vis-edit-mode",t.edit||this.options.locales.en.edit);this.editModeDiv.appendChild(e),this._bindHammerToDiv(e,this.toggleEditMode.bind(this))}},{key:"_clean",value:function(){this.inMode=!1,!0===this.guiEnabled&&(f.recursiveDOMDelete(this.editModeDiv),f.recursiveDOMDelete(this.manipulationDiv),this._cleanManipulatorHammers()),this._cleanupTemporaryNodesAndEdges(),this._unbindTemporaryUIs(),this._unbindTemporaryEvents(),this.body.emitter.emit("restorePhysics")}},{key:"_cleanManipulatorHammers",value:function(){if(0!=this.manipulationHammers.length){for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:1;this.manipulationDOM["seperatorLineDiv"+t]=document.createElement("div"),this.manipulationDOM["seperatorLineDiv"+t].className="vis-separator-line",this.manipulationDiv.appendChild(this.manipulationDOM["seperatorLineDiv"+t])}},{key:"_createAddNodeButton",value:function(t){var e=this._createButton("addNode","vis-button vis-add",t.addNode||this.options.locales.en.addNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addNodeMode.bind(this))}},{key:"_createAddEdgeButton",value:function(t){var e=this._createButton("addEdge","vis-button vis-connect",t.addEdge||this.options.locales.en.addEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addEdgeMode.bind(this))}},{key:"_createEditNodeButton",value:function(t){var e=this._createButton("editNode","vis-button vis-edit",t.editNode||this.options.locales.en.editNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editNode.bind(this))}},{key:"_createEditEdgeButton",value:function(t){var e=this._createButton("editEdge","vis-button vis-edit",t.editEdge||this.options.locales.en.editEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editEdgeMode.bind(this))}},{key:"_createDeleteButton",value:function(t){var e;e=this.options.rtl?"vis-button vis-delete-rtl":"vis-button vis-delete";var i=this._createButton("delete",e,t.del||this.options.locales.en.del);this.manipulationDiv.appendChild(i),this._bindHammerToDiv(i,this.deleteSelected.bind(this))}},{key:"_createBackButton",value:function(t){var e=this._createButton("back","vis-button vis-back",t.back||this.options.locales.en.back);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.showManipulatorToolbar.bind(this))}},{key:"_createButton",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"vis-label";return this.manipulationDOM[t+"Div"]=document.createElement("div"),this.manipulationDOM[t+"Div"].className=e,this.manipulationDOM[t+"Label"]=document.createElement("div"),this.manipulationDOM[t+"Label"].className=o,this.manipulationDOM[t+"Label"].innerHTML=i,this.manipulationDOM[t+"Div"].appendChild(this.manipulationDOM[t+"Label"]),this.manipulationDOM[t+"Div"]}},{key:"_createDescription",value:function(t){this.manipulationDiv.appendChild(this._createButton("description","vis-button vis-none",t))}},{key:"_temporaryBindEvent",value:function(t,e){this.temporaryEventFunctions.push({event:t,boundFunction:e}),this.body.emitter.on(t,e)}},{key:"_temporaryBindUI",value:function(t,e){if(void 0===this.body.eventListeners[t])throw new Error("This UI function does not exist. Typo? You tried: "+t+" possible are: "+(0,a.default)((0,s.default)(this.body.eventListeners)));this.temporaryUIFunctions[t]=this.body.eventListeners[t],this.body.eventListeners[t]=e}},{key:"_unbindTemporaryUIs",value:function(){for(var t in this.temporaryUIFunctions)this.temporaryUIFunctions.hasOwnProperty(t)&&(this.body.eventListeners[t]=this.temporaryUIFunctions[t],delete this.temporaryUIFunctions[t]);this.temporaryUIFunctions={}}},{key:"_unbindTemporaryEvents",value:function(){for(var t=0;t=0;r--)if(n[r]!==this.selectedControlNode.id){s=this.body.nodes[n[r]];break}if(void 0!==s&&void 0!==this.selectedControlNode)if(!0===s.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var a=this.body.nodes[this.temporaryIds.nodes[0]];this.selectedControlNode.id===a.id?this._performEditEdge(s.id,o.to.id):this._performEditEdge(o.from.id,s.id)}else o.updateEdgeType(),this.body.emitter.emit("restorePhysics");this.body.emitter.emit("_redraw")}}},{key:"_handleConnect",value:function(t){if((new Date).valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(t.center),this.lastTouch.translation=f.extend({},this.body.view.translation);var e=this.lastTouch,i=this.selectionHandler.getNodeAt(e);if(void 0!==i)if(!0===i.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var o=this._getNewTargetNode(i.x,i.y);this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id);var n=this.body.functions.createEdge({id:"connectionEdge"+f.randomUUID(),from:i.id,to:o.id,physics:!1,smooth:{enabled:!0,type:"continuous",roundness:.5}});this.body.edges[n.id]=n,this.body.edgeIndices.push(n.id),this.temporaryIds.nodes.push(o.id),this.temporaryIds.edges.push(n.id)}this.touchTime=(new Date).valueOf()}}},{key:"_dragControlNode",value:function(t){var e=this.body.functions.getPointer(t.center);if(void 0!==this.temporaryIds.nodes[0]){var i=this.body.nodes[this.temporaryIds.nodes[0]];i.x=this.canvas._XconvertDOMtoCanvas(e.x),i.y=this.canvas._YconvertDOMtoCanvas(e.y),this.body.emitter.emit("_redraw")}else{var o=e.x-this.lastTouch.x,n=e.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+o,y:this.lastTouch.translation.y+n}}}},{key:"_finishConnect",value:function(t){var e=this.body.functions.getPointer(t.center),i=this.selectionHandler._pointerToPositionObject(e),o=void 0;void 0!==this.temporaryIds.edges[0]&&(o=this.body.edges[this.temporaryIds.edges[0]].fromId);for(var n=this.selectionHandler._getAllNodesOverlappingWith(i),s=void 0,r=n.length-1;r>=0;r--)if(-1===this.temporaryIds.nodes.indexOf(n[r])){s=this.body.nodes[n[r]];break}this._cleanupTemporaryNodesAndEdges(),void 0!==s&&(!0===s.isCluster?alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError):void 0!==this.body.nodes[o]&&void 0!==this.body.nodes[s.id]&&this._performAddEdge(o,s.id)),this.body.emitter.emit("_redraw")}},{key:"_dragStartEdge",value:function(t){var e=this.lastTouch;this.selectionHandler._generateClickEvent("dragStart",t,e,void 0,!0)}},{key:"_performAddNode",value:function(t){var e=this,i={id:f.randomUUID(),x:t.pointer.canvas.x,y:t.pointer.canvas.y,label:"new"};if("function"==typeof this.options.addNode){if(2!==this.options.addNode.length)throw this.showManipulatorToolbar(),new Error("The function for add does not support two arguments (data,callback)");this.options.addNode(i,function(t){null!==t&&void 0!==t&&"addNode"===e.inMode&&(e.body.data.nodes.getDataSet().add(t),e.showManipulatorToolbar())})}else this.body.data.nodes.getDataSet().add(i),this.showManipulatorToolbar()}},{key:"_performAddEdge",value:function(t,e){var i=this,o={from:t,to:e};if("function"==typeof this.options.addEdge){if(2!==this.options.addEdge.length)throw new Error("The function for connect does not support two arguments (data,callback)");this.options.addEdge(o,function(t){null!==t&&void 0!==t&&"addEdge"===i.inMode&&(i.body.data.edges.getDataSet().add(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().add(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}},{key:"_performEditEdge",value:function(t,e){var i=this,o={id:this.edgeBeingEditedId,from:t,to:e,label:this.body.data.edges._data[this.edgeBeingEditedId].label},n=this.options.editEdge;if("object"===(void 0===n?"undefined":(0,d.default)(n))&&(n=n.editWithoutDrag),"function"==typeof n){if(2!==n.length)throw new Error("The function for edit does not support two arguments (data, callback)");n(o,function(t){null===t||void 0===t||"editEdge"!==i.inMode?(i.body.edges[o.id].updateEdgeType(),i.body.emitter.emit("_redraw"),i.showManipulatorToolbar()):(i.body.data.edges.getDataSet().update(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().update(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}}]),t}();e.default=g},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(239),u=o(l),c=function(){function t(e,i,o){(0,a.default)(this,t),this.body=e,this.springLength=i,this.springConstant=o,this.distanceSolver=new u.default}return(0,d.default)(t,[{key:"setOptions",value:function(t){t&&(t.springLength&&(this.springLength=t.springLength),t.springConstant&&(this.springConstant=t.springConstant))}},{key:"solve",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.distanceSolver.getDistances(this.body,t,e);this._createL_matrix(o),this._createK_matrix(o),this._createE_matrix();for(var n=0,r=Math.max(1e3,Math.min(10*this.body.nodeIndices.length,6e3)),a=1e9,h=0,d=0,l=0,u=0,c=0;a>.01&&n1&&c<5;){c+=1,this._moveNode(h,d,l);var m=this._getEnergy(h),v=(0,s.default)(m,3);u=v[0],d=v[1],l=v[2]}}}},{key:"_getHighestEnergyNode",value:function(t){for(var e=this.body.nodeIndices,i=this.body.nodes,o=0,n=e[0],r=0,a=0,h=0;h Date: Fri, 28 Jun 2019 21:07:15 +0200 Subject: [PATCH 104/155] [Core] Implement property source hierarchy explicitly in each runner Refactors the Env property sources to allow different property source hierarchy for each runner. These ordering having been chosen such that sensible default values can read from file or 'hardcoded' configuration can be overridden by environment properties, system properties or CLI arguments. CLI property source order: 1 Command line 2 System properties 3 Environment variables 4 cucumber.properties file JUnit and TestNG property source order: 1 System properties 2 Environment variables 3 ``@CucumberOptions` 4 cucumber.properties file Old situation: JUnit, TestNG, and CLI property source order: 1. System properties 2. Environment variables 3. cucumber.properties file 4. CLI arguments or `@CucumberOptions` Additionally in the old situation the commandline arguments in #1,#2,# 3would replace rather then be merged with each other. The result would be merged with #4. This was somewhat confusing. --- .../main/java/io/cucumber/core/cli/Main.java | 37 +++-- .../core/options/CucumberProperties.java | 122 +++++++++++++++ .../options/CucumberPropertiesParser.java | 34 ++++ .../java/io/cucumber/core/options/Env.java | 73 --------- .../options/EnvironmentOptionsParser.java | 35 ----- .../SingletonObjectFactorySupplier.java | 7 +- .../ThreadLocalObjectFactorySupplier.java | 9 +- ...vTest.java => CucumberPropertiesTest.java} | 24 +-- .../cucumber/core/options/RerunFileTest.java | 17 +- .../core/options/RuntimeOptionsTest.java | 146 +++++++++--------- .../examples/java8/ShoppingStepdefs.java | 1 - .../java/io/cucumber/guice/GuiceFactory.java | 4 +- .../cucumber/guice/InjectorSourceFactory.java | 11 +- .../guice/InjectorSourceFactoryTest.java | 35 +++-- .../main/java/io/cucumber/junit/Cucumber.java | 30 ++-- .../testng/AbstractTestNGCucumberTests.java | 6 +- .../cucumber/testng/TestNGCucumberRunner.java | 29 +++- 17 files changed, 360 insertions(+), 260 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/options/CucumberProperties.java create mode 100644 core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java delete mode 100644 core/src/main/java/io/cucumber/core/options/Env.java delete mode 100644 core/src/main/java/io/cucumber/core/options/EnvironmentOptionsParser.java rename core/src/test/java/io/cucumber/core/options/{EnvTest.java => CucumberPropertiesTest.java} (62%) diff --git a/core/src/main/java/io/cucumber/core/cli/Main.java b/core/src/main/java/io/cucumber/core/cli/Main.java index 25b0b3ef42..fe073449d3 100644 --- a/core/src/main/java/io/cucumber/core/cli/Main.java +++ b/core/src/main/java/io/cucumber/core/cli/Main.java @@ -2,12 +2,20 @@ import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.options.CommandlineOptionsParser; -import io.cucumber.core.options.Env; -import io.cucumber.core.options.EnvironmentOptionsParser; -import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.options.*; import io.cucumber.core.runtime.Runtime; +/** + * Cucumber Main. Runs Cucumber as a CLI. + *

        + * Options can be provided in order of precedence through: + *

          + *
        1. command line arguments
        2. + *
        3. {@code cucumber.options} property in {@link System#getProperties()} ()}
        4. + *
        5. {@code cucumber.options} property in {@link System#getenv()}
        6. + *
        7. {@code cucumber.options} property in {@code cucumber.properties}
        8. + *
        + */ public class Main { public static void main(String[] argv) { @@ -25,15 +33,22 @@ public static void main(String[] argv) { public static byte run(String[] argv, ClassLoader classLoader) { ResourceLoader resourceLoader = new MultiLoader(classLoader); - RuntimeOptions runtimeOptions = new CommandlineOptionsParser(resourceLoader) - .parse(argv) - .addDefaultFormatterIfNotPresent() - .addDefaultSummaryPrinterIfNotPresent() + RuntimeOptions bundleOptions = new CucumberPropertiesParser(resourceLoader) + .parse(CucumberProperties.fromPropertiesFile()) .build(); - new EnvironmentOptionsParser(resourceLoader) - .parse(Env.INSTANCE) - .build(runtimeOptions); + RuntimeOptions environmentOptions = new CucumberPropertiesParser(resourceLoader) + .parse(CucumberProperties.fromEnvironment()) + .build(bundleOptions); + + RuntimeOptions systemOptions = new CucumberPropertiesParser(resourceLoader) + .parse(CucumberProperties.fromSystemProperties()) + .build(environmentOptions); + + RuntimeOptions runtimeOptions = new CommandlineOptionsParser() + .parse(argv) + .build(systemOptions); + final Runtime runtime = Runtime.builder() .withRuntimeOptions(runtimeOptions) diff --git a/core/src/main/java/io/cucumber/core/options/CucumberProperties.java b/core/src/main/java/io/cucumber/core/options/CucumberProperties.java new file mode 100644 index 0000000000..0d502d8ac5 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/options/CucumberProperties.java @@ -0,0 +1,122 @@ +package io.cucumber.core.options; + +import io.cucumber.core.logging.Logger; +import io.cucumber.core.logging.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.*; + +public final class CucumberProperties { + + private static final Logger log = LoggerFactory.getLogger(CucumberProperties.class); + + private CucumberProperties() { + + } + + public static Map create() { + CucumberPropertiesMap fromBundle = new CucumberPropertiesMap(fromPropertiesFile()); + CucumberPropertiesMap fromEnvironmentProperties = new CucumberPropertiesMap(fromBundle, fromEnvironment()); + return new CucumberPropertiesMap(fromEnvironmentProperties, fromSystemProperties()); + } + + public static Map fromPropertiesFile() { + InputStream resourceAsStream = CucumberProperties.class.getResourceAsStream("cucumber.properties"); + if (resourceAsStream == null) { + log.debug("cucumber.properties file did not exist"); + return Collections.emptyMap(); + } + + try { + Properties properties1 = new Properties(); + properties1.load(resourceAsStream); + return CucumberPropertiesMap.create(properties1); + } catch (IOException e) { + log.error("cucumber.properties could not be loaded", e); + throw new RuntimeException(e); + } + } + + public static Map fromSystemProperties() { + Properties p = System.getProperties(); + return CucumberPropertiesMap.create(p); + } + + public static Map fromEnvironment() { + Map p = System.getenv(); + CucumberPropertiesMap properties = new CucumberPropertiesMap(); + properties.putAll(p); + return properties; + } + + static class CucumberPropertiesMap extends HashMap { + + private final CucumberPropertiesMap parent; + + CucumberPropertiesMap() { + this(null); + } + + CucumberPropertiesMap(CucumberPropertiesMap parent) { + this(parent, Collections.emptyMap()); + } + + CucumberPropertiesMap(Map properties) { + this(null, properties); + } + + CucumberPropertiesMap(CucumberPropertiesMap parent, Map properties) { + super(properties); + this.parent = parent; + } + + private static CucumberPropertiesMap create(Properties p) { + CucumberPropertiesMap properties = new CucumberPropertiesMap(); + for (String key : p.stringPropertyNames()) { + properties.put(key, p.getProperty(key)); + } + return properties; + } + + @Override + public String get(Object key) { + String exactMatch = super.get(key); + if (exactMatch != null) { + return exactMatch; + } + + if (!(key instanceof String)) { + return null; + } + + // Support old skool + // Not all environments allow properties to contain dots or dashes. + // So we map the requested property to its underscore case variant. + String keyString = (String) key; + + String uppercase = keyString + .replace(".", "_") + .replace("-", "_") + .toUpperCase(Locale.ENGLISH); + String upperCaseMatch = super.get(uppercase); + if (upperCaseMatch != null) { + return upperCaseMatch; + } + + String lowercase = keyString + .replace(".", "_") + .replace("-", "_") + .toLowerCase(Locale.ENGLISH); + String lowerValue = super.get(lowercase); + if (lowerValue != null) + return lowerValue; + + if (parent == null) { + return null; + } + return parent.get(key); + } + + } +} \ No newline at end of file diff --git a/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java b/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java new file mode 100644 index 0000000000..93a2ae7149 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java @@ -0,0 +1,34 @@ +package io.cucumber.core.options; + +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.feature.RerunLoader; + +import java.util.List; +import java.util.Map; + +public final class CucumberPropertiesParser { + + private final ResourceLoader resourceLoader; + + public CucumberPropertiesParser(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + public CucumberPropertiesParser() { + this(new MultiLoader(CucumberPropertiesParser.class.getClassLoader())); + } + + public RuntimeOptionsBuilder parse(Map properties){ + String cucumberOptions = properties.get("cucumber.options"); + if (cucumberOptions == null) { + return new RuntimeOptionsBuilder(); + } + + RerunLoader rerunLoader = new RerunLoader(resourceLoader); + RuntimeOptionsParser parser = new RuntimeOptionsParser(rerunLoader); + List args = ShellWords.parse(cucumberOptions); + return parser.parse(args); + } + +} diff --git a/core/src/main/java/io/cucumber/core/options/Env.java b/core/src/main/java/io/cucumber/core/options/Env.java deleted file mode 100644 index f599f28a82..0000000000 --- a/core/src/main/java/io/cucumber/core/options/Env.java +++ /dev/null @@ -1,73 +0,0 @@ -package io.cucumber.core.options; - -import java.util.HashMap; -import java.util.Map; -import java.util.MissingResourceException; -import java.util.Properties; -import java.util.ResourceBundle; - -import static java.util.Locale.ROOT; - -/** - * Looks up values in the following order: - *
          - *
        1. Environment variable
        2. - *
        3. System property
        4. - *
        5. Resource bundle
        6. - *
        - */ -public final class Env { - public static final Env INSTANCE = new Env("cucumber"); - private final Map map = new HashMap(); - - public Env() { - this(null, System.getProperties()); - } - - public Env(String bundleName) { - this(bundleName, System.getProperties()); - } - - public Env(Properties properties) { - this(null, properties); - } - - public Env(String bundleName, Properties properties) { - if (bundleName != null) { - try { - ResourceBundle bundle = ResourceBundle.getBundle(bundleName); - for (String key : bundle.keySet()) { - put(key, bundle.getString(key)); - } - } catch (MissingResourceException ignore) { - } - } - - if (properties != null) { - for (String key : properties.stringPropertyNames()) { - put(key, properties.getProperty(key)); - } - } - - Map env = System.getenv(); - for (String key : env.keySet()) { - put(key, env.get(key)); - } - } - - private void put(String key, String string) { - map.put(key, string); - // Support old skool - map.put(key.replace('.', '_').toUpperCase(ROOT), string); - map.put(key.replace('_', '.').toLowerCase(ROOT), string); - } - - public String get(String key) { - return map.get(key); - } - - public String get(String key, String defaultValue) { - String result = get(key); - return result != null ? result : defaultValue; - } -} diff --git a/core/src/main/java/io/cucumber/core/options/EnvironmentOptionsParser.java b/core/src/main/java/io/cucumber/core/options/EnvironmentOptionsParser.java deleted file mode 100644 index 767bb6239e..0000000000 --- a/core/src/main/java/io/cucumber/core/options/EnvironmentOptionsParser.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.cucumber.core.options; - -import io.cucumber.core.io.MultiLoader; -import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.feature.RerunLoader; - -import java.util.Collections; -import java.util.List; - -public class EnvironmentOptionsParser { - - private final ResourceLoader resourceLoader; - - - public EnvironmentOptionsParser(ResourceLoader resourceLoader) { - this.resourceLoader = resourceLoader; - } - - public EnvironmentOptionsParser() { - this(new MultiLoader(EnvironmentOptionsParser.class.getClassLoader())); - } - - public RuntimeOptionsBuilder parse(Env env){ - RerunLoader rerunLoader = new RerunLoader(resourceLoader); - RuntimeOptionsParser parser = new RuntimeOptionsParser(rerunLoader); - - String cucumberOptionsFromEnv = env.get("cucumber.options"); - List shellWords = Collections.emptyList(); - if (cucumberOptionsFromEnv != null) { - shellWords = ShellWords.parse(cucumberOptionsFromEnv); - } - return parser.parse(shellWords); - } - -} diff --git a/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java index c7c14db4eb..745302b0ba 100644 --- a/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java @@ -1,7 +1,9 @@ package io.cucumber.core.runtime; import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.options.Env; +import io.cucumber.core.options.CucumberProperties; + +import java.util.Map; import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; @@ -12,7 +14,8 @@ public class SingletonObjectFactorySupplier implements ObjectFactorySupplier { @Override public ObjectFactory get() { if(objectFactory == null){ - objectFactory = loadObjectFactory(Env.INSTANCE.get(ObjectFactory.class.getName())); + Map properties = CucumberProperties.create(); + objectFactory = loadObjectFactory(properties.get(ObjectFactory.class.getName())); } return objectFactory; } diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java index b11b1619b0..189ca12132 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java @@ -2,14 +2,19 @@ import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.options.Env; +import io.cucumber.core.options.CucumberProperties; + +import java.util.Map; import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; public class ThreadLocalObjectFactorySupplier implements ObjectFactorySupplier { private final ThreadLocal runners = ThreadLocal.withInitial( - () -> loadObjectFactory(Env.INSTANCE.get(ObjectFactory.class.getName())) + () -> { + Map properties = CucumberProperties.create(); + return loadObjectFactory(properties.get(ObjectFactory.class.getName())); + } ); @Override diff --git a/core/src/test/java/io/cucumber/core/options/EnvTest.java b/core/src/test/java/io/cucumber/core/options/CucumberPropertiesTest.java similarity index 62% rename from core/src/test/java/io/cucumber/core/options/EnvTest.java rename to core/src/test/java/io/cucumber/core/options/CucumberPropertiesTest.java index 0831bde6e2..3ee02e7072 100644 --- a/core/src/test/java/io/cucumber/core/options/EnvTest.java +++ b/core/src/test/java/io/cucumber/core/options/CucumberPropertiesTest.java @@ -1,18 +1,29 @@ package io.cucumber.core.options; +import org.junit.Before; import org.junit.Test; +import java.util.Collections; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -public class EnvTest { +public class CucumberPropertiesTest { + + private CucumberProperties.CucumberPropertiesMap env = new CucumberProperties.CucumberPropertiesMap(Collections.emptyMap()); - private Env env = new Env("env-test"); + @Before + public void setup(){ + env.put("ENV_TEST","from-bundle"); + env.put("a.b","a.b"); + env.put("B_C","B_C"); + env.put("c.D","C_D"); + } @Test public void looks_up_value_from_environment() { - assertNotNull(env.get("PATH")); + assertNotNull(CucumberProperties.fromEnvironment().get("PATH")); } @Test @@ -25,11 +36,6 @@ public void looks_up_dotted_value_from_resource_bundle_with_dots() { assertEquals("a.b", env.get("a.b")); } - @Test - public void looks_up_dotted_value_from_resource_bundle_with_underscores() { - assertEquals("a.b", env.get("A_B")); - } - @Test public void looks_up_underscored_value_from_resource_bundle_with_dots() { assertEquals("B_C", env.get("b.c")); @@ -41,7 +47,7 @@ public void looks_up_underscored_value_from_resource_bundle_with_underscores() { } @Test - public void looks_up_value_by_exact_case_keuy() { + public void looks_up_value_by_exact_case_key() { assertEquals("C_D", env.get("c.D")); } } diff --git a/core/src/test/java/io/cucumber/core/options/RerunFileTest.java b/core/src/test/java/io/cucumber/core/options/RerunFileTest.java index 0574ff9e35..879183ba3f 100644 --- a/core/src/test/java/io/cucumber/core/options/RerunFileTest.java +++ b/core/src/test/java/io/cucumber/core/options/RerunFileTest.java @@ -8,13 +8,11 @@ import java.io.IOException; import java.net.URI; import java.util.Collections; -import java.util.Properties; +import java.util.HashMap; +import java.util.Map; import static java.nio.charset.StandardCharsets.UTF_8; -import static java.util.Arrays.asList; -import static java.util.Collections.emptyMap; -import static java.util.Collections.singleton; -import static java.util.Collections.singletonList; +import static java.util.Collections.*; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.collection.IsIterableContainingInOrder.contains; @@ -181,16 +179,15 @@ public void clobbers_tag_and_name_filters_from_cli_if_rerun_file_specified_in_cu "foo.feature:4" ); - Properties properties = new Properties(); - properties.setProperty("cucumber.options", "@file:path/rerun.txt"); - Env env = new Env(properties); + Map properties = new HashMap<>(); + properties.put("cucumber.options", "@file:path/rerun.txt"); RuntimeOptions options = new CommandlineOptionsParser(resourceLoader) .parse("--tags", "@should_be_clobbered", "--name", "should_be_clobbered") .build(); - RuntimeOptions runtimeOptions = new EnvironmentOptionsParser(resourceLoader) - .parse(env) + RuntimeOptions runtimeOptions = new CucumberPropertiesParser(resourceLoader) + .parse(properties) .build(options); assertEquals(Collections.emptyList(), runtimeOptions.getTagExpressions()); diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index be811dc91f..38adecc60d 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -28,11 +28,7 @@ import java.io.IOException; import java.net.URI; import java.time.Clock; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Properties; -import java.util.Set; +import java.util.*; import java.util.regex.Pattern; import static java.nio.charset.StandardCharsets.UTF_8; @@ -53,7 +49,7 @@ public class RuntimeOptionsTest { - private final Properties properties = new Properties(); + private final Map properties = new HashMap<>(); @Rule public ExpectedException expectedException = ExpectedException.none(); @Rule @@ -284,9 +280,9 @@ public void name_with_spaces_is_preserved() { @Test public void ensure_name_with_spaces_works_with_cucumber_options() { - properties.setProperty("cucumber.options", "--name 'some Name'"); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + properties.put("cucumber.options", "--name 'some Name'"); + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(); Pattern actualPattern = options.getNameFilters().iterator().next(); assertThat(actualPattern.pattern(), is("some Name")); @@ -315,25 +311,25 @@ public void assigns_multiple_junit_options() { @Test public void clobbers_junit_options_from_cli_if_junit_options_specified_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "--junit,option_from_property"); + properties.put("cucumber.options", "--junit,option_from_property"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--junit,option_to_be_clobbered") .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getJunitOptions(), contains("option_from_property")); } @Test public void overrides_options_with_system_properties_without_clobbering_non_overridden_ones() { - properties.setProperty("cucumber.options", "--glue lookatme this_clobbers_feature_paths"); + properties.put("cucumber.options", "--glue lookatme this_clobbers_feature_paths"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--strict", "--glue", "somewhere", "somewhere_else") .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getFeaturePaths(), contains(uri("file:this_clobbers_feature_paths"))); assertThat(options.getGlue(), contains(uri("classpath:lookatme"))); @@ -342,50 +338,50 @@ public void overrides_options_with_system_properties_without_clobbering_non_over @Test public void ensure_cli_glue_is_preserved_when_cucumber_options_property_defined() { - properties.setProperty("cucumber.options", "--tags @foo"); + properties.put("cucumber.options", "--tags @foo"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(asList("--glue", "somewhere")) .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getGlue(), contains(uri("classpath:somewhere"))); } @Test public void clobbers_filters_from_cli_if_filters_specified_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "--tags @clobber_with_this"); + properties.put("cucumber.options", "--tags @clobber_with_this"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(asList("--tags", "@should_be_clobbered")) .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getTagExpressions(), contains("@clobber_with_this")); } @Test public void clobbers_tag_and_name_filters_from_cli_if_line_filters_specified_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "path/file.feature:3"); + properties.put("cucumber.options", "path/file.feature:3"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--tags", "@should_be_clobbered", "--name", "should_be_clobbered") .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getTagExpressions(), emptyCollectionOf(String.class)); } @Test public void clobbers_tag_and_name_filters_from_cli_if_rerun_file_specified_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "@src/test/resources/io/cucumber/core/options/runtime-options-rerun.txt"); + properties.put("cucumber.options", "@src/test/resources/io/cucumber/core/options/runtime-options-rerun.txt"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--tags", "@should_be_clobbered", "--name", "should_be_clobbered") .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getTagExpressions(), emptyCollectionOf(String.class)); @@ -394,36 +390,36 @@ public void clobbers_tag_and_name_filters_from_cli_if_rerun_file_specified_in_cu @Test public void preserves_filters_from_cli_if_filters_not_specified_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "--strict"); + properties.put("cucumber.options", "--strict"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(asList("--tags", "@keep_this")) .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getTagExpressions(), contains("@keep_this")); } @Test public void clobbers_features_from_cli_if_features_specified_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "new newer"); + properties.put("cucumber.options", "new newer"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(asList("old", "older")) .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getFeaturePaths(), contains(uri("file:new"), uri("file:newer"))); } @Test public void strips_lines_from_features_from_cli_if_filters_are_specified_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "--tags @Tag"); + properties.put("cucumber.options", "--tags @Tag"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("path/file.feature:3") .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getFeaturePaths(), contains(uri("file:path/file.feature"))); } @@ -431,7 +427,7 @@ public void strips_lines_from_features_from_cli_if_filters_are_specified_in_cucu @Test public void strips_lines_from_rerun_file_from_cli_if_filters_are_specified_in_cucumber_options_property() throws IOException { - properties.setProperty("cucumber.options", "--tags @Tag"); + properties.put("cucumber.options", "--tags @Tag"); String rerunPath = "file:path/rerun.txt"; String rerunFile = "file:path/file.feature:3\n"; mockFileResource(resourceLoader, rerunPath, rerunFile); @@ -443,12 +439,12 @@ public void strips_lines_from_rerun_file_from_cli_if_filters_are_specified_in_cu @Test public void preserves_features_from_cli_if_features_not_specified_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "--plugin pretty"); + properties.put("cucumber.options", "--plugin pretty"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(asList("old", "older")) .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getFeaturePaths(), contains(uri("file:old"), uri("file:older"))); @@ -456,12 +452,12 @@ public void preserves_features_from_cli_if_features_not_specified_in_cucumber_op @Test public void clobbers_line_filters_from_cli_if_features_specified_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "new newer"); + properties.put("cucumber.options", "new newer"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(asList("--tags", "@keep_this", "path/file1.feature:1")) .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getFeaturePaths(), contains(uri("file:new"), uri("file:newer"))); assertThat(options.getTagExpressions(), contains("@keep_this")); @@ -469,14 +465,14 @@ public void clobbers_line_filters_from_cli_if_features_specified_in_cucumber_opt @Test public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "--plugin pretty"); + properties.put("cucumber.options", "--plugin pretty"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--plugin", "html:target/some/dir", "--glue", "somewhere") .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); Plugins plugins = new Plugins(new PluginFactory(), options); plugins.setEventBusOnEventListenerPlugins(new TimeServiceEventBus(Clock.systemUTC())); @@ -488,14 +484,14 @@ public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucum @Test public void adds_to_formatter_plugins_with_add_plugin_option() { - properties.setProperty("cucumber.options", "--add-plugin pretty"); + properties.put("cucumber.options", "--add-plugin pretty"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--plugin", "html:target/some/dir", "--glue", "somewhere") .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); Plugins plugins = new Plugins(new PluginFactory(), options); plugins.setEventBusOnEventListenerPlugins(new TimeServiceEventBus(Clock.systemUTC())); @@ -507,13 +503,13 @@ public void adds_to_formatter_plugins_with_add_plugin_option() { @Test public void clobbers_summary_plugins_from_cli_if_summary_printer_specified_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "--plugin default_summary"); + properties.put("cucumber.options", "--plugin default_summary"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--plugin", "null_summary", "--glue", "somewhere") .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); Plugins plugins = new Plugins(new PluginFactory(), options); plugins.setEventBusOnEventListenerPlugins(new TimeServiceEventBus(Clock.systemUTC())); @@ -524,13 +520,13 @@ public void clobbers_summary_plugins_from_cli_if_summary_printer_specified_in_cu @Test public void adds_to_summary_plugins_with_add_plugin_option() { - properties.setProperty("cucumber.options", "--add-plugin default_summary"); + properties.put("cucumber.options", "--add-plugin default_summary"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--plugin", "null_summary", "--glue", "somewhere") .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); Plugins plugins = new Plugins(new PluginFactory(), options); plugins.setEventBusOnEventListenerPlugins(new TimeServiceEventBus(Clock.systemUTC())); @@ -541,14 +537,14 @@ public void adds_to_summary_plugins_with_add_plugin_option() { @Test public void does_not_clobber_plugins_of_different_type_when_specifying_plugins_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "--plugin default_summary"); + properties.put("cucumber.options", "--plugin default_summary"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--plugin", "pretty", "--glue", "somewhere") .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); Plugins plugins = new Plugins(new PluginFactory(), options); plugins.setEventBusOnEventListenerPlugins(new TimeServiceEventBus(Clock.systemUTC())); @@ -560,12 +556,12 @@ public void does_not_clobber_plugins_of_different_type_when_specifying_plugins_i @Test public void allows_removal_of_strict_in_cucumber_options_property() { - properties.setProperty("cucumber.options", "--no-strict"); + properties.put("cucumber.options", "--no-strict"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--strict") .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.isStrict(), is(false)); } @@ -581,7 +577,7 @@ public void fail_on_unsupported_options() { @Test public void threads_default_1() { RuntimeOptions options = new CommandlineOptionsParser() - .parse(Collections.emptyList()) + .parse(Collections.emptyList()) .build(); assertThat(options.getThreads(), is(1)); } @@ -631,22 +627,22 @@ public void set_strict_on_strict_aware_formatters() { @Test public void ensure_default_snippet_type_is_underscore() { RuntimeOptions runtimeOptions = new CommandlineOptionsParser() - .parse(Collections.emptyList()) + .parse(Collections.emptyList()) .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getSnippetType(), is(SnippetType.UNDERSCORE)); } @Test public void set_snippet_type() { - properties.setProperty("cucumber.options", "--snippets camelcase"); + properties.put("cucumber.options", "--snippets camelcase"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() - .parse(Collections.emptyList()) + .parse(Collections.emptyList()) .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getSnippetType(), is(SnippetType.CAMELCASE)); } @@ -760,8 +756,8 @@ public void clobbers_features_from_rerun_file_specified_in_cli_if_features_speci .parse("@" + rerunPath) .build(); - RuntimeOptions options = new EnvironmentOptionsParser(resourceLoader) - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser(resourceLoader) + .parse(properties) .build(runtimeOptions); assertThat(options.getFeaturePaths(), contains(uri("file:path/foo.feature"))); @@ -783,13 +779,13 @@ public void loads_no_features_when_rerun_file_is_empty() throws Exception { @Test - public void loads_no_features_when_rerun_file_specified_in_cucumber_options_property_is_empty() throws Exception { - properties.setProperty("cucumber.options", "@src/test/resources/io/cucumber/core/options/runtime-options-empty-rerun.txt"); + public void loads_no_features_when_rerun_file_specified_in_cucumber_options_property_is_empty() { + properties.put("cucumber.options", "@src/test/resources/io/cucumber/core/options/runtime-options-empty-rerun.txt"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(singletonList("src/test/resources/cucumber/runtime/formatter")) .build(); - RuntimeOptions options = new EnvironmentOptionsParser() - .parse(new Env(properties)) + RuntimeOptions options = new CucumberPropertiesParser() + .parse(properties) .build(runtimeOptions); assertThat(options.getFeaturePaths(), emptyCollectionOf(URI.class)); } diff --git a/examples/java8-calculator/src/test/java/io/cucumber/examples/java8/ShoppingStepdefs.java b/examples/java8-calculator/src/test/java/io/cucumber/examples/java8/ShoppingStepdefs.java index 1b7257414b..530edee6cf 100644 --- a/examples/java8-calculator/src/test/java/io/cucumber/examples/java8/ShoppingStepdefs.java +++ b/examples/java8-calculator/src/test/java/io/cucumber/examples/java8/ShoppingStepdefs.java @@ -13,7 +13,6 @@ public class ShoppingStepdefs implements En { public ShoppingStepdefs() { - Given("the following groceries:", (DataTable dataTable) -> { List groceries = dataTable.asList(Grocery.class); for (Grocery grocery : groceries) { diff --git a/guice/src/main/java/io/cucumber/guice/GuiceFactory.java b/guice/src/main/java/io/cucumber/guice/GuiceFactory.java index 538af797a3..9317be8279 100644 --- a/guice/src/main/java/io/cucumber/guice/GuiceFactory.java +++ b/guice/src/main/java/io/cucumber/guice/GuiceFactory.java @@ -2,7 +2,7 @@ import com.google.inject.Injector; import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.options.Env; +import io.cucumber.core.options.CucumberProperties; import org.apiguardian.api.API; /** @@ -14,7 +14,7 @@ public final class GuiceFactory implements ObjectFactory { private final Injector injector; public GuiceFactory() { - this(new InjectorSourceFactory(Env.INSTANCE).create().getInjector()); + this(new InjectorSourceFactory(CucumberProperties.create()).create().getInjector()); } /** diff --git a/guice/src/main/java/io/cucumber/guice/InjectorSourceFactory.java b/guice/src/main/java/io/cucumber/guice/InjectorSourceFactory.java index 46c92d9cbf..7dba40f02f 100644 --- a/guice/src/main/java/io/cucumber/guice/InjectorSourceFactory.java +++ b/guice/src/main/java/io/cucumber/guice/InjectorSourceFactory.java @@ -2,21 +2,22 @@ import com.google.inject.Guice; import com.google.inject.Stage; -import io.cucumber.core.options.Env; + +import java.util.Map; import static java.text.MessageFormat.format; final class InjectorSourceFactory { static final String GUICE_INJECTOR_SOURCE_KEY = "guice.injector-source"; - private final Env env; + private final Map properties; - InjectorSourceFactory(Env env) { - this.env = env; + InjectorSourceFactory(Map properties) { + this.properties = properties; } InjectorSource create() { - String injectorSourceClassName = env.get(GUICE_INJECTOR_SOURCE_KEY); + String injectorSourceClassName = properties.get(GUICE_INJECTOR_SOURCE_KEY); if (injectorSourceClassName == null) { return createDefaultScenarioModuleInjectorSource(); } else { diff --git a/guice/src/test/java/io/cucumber/guice/InjectorSourceFactoryTest.java b/guice/src/test/java/io/cucumber/guice/InjectorSourceFactoryTest.java index fefa73dca3..e8a1123554 100644 --- a/guice/src/test/java/io/cucumber/guice/InjectorSourceFactoryTest.java +++ b/guice/src/test/java/io/cucumber/guice/InjectorSourceFactoryTest.java @@ -1,13 +1,14 @@ package io.cucumber.guice; import com.google.inject.Injector; -import io.cucumber.core.options.Env; import org.junit.Test; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; -import java.util.Properties; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; @@ -16,13 +17,13 @@ public class InjectorSourceFactoryTest { - private InjectorSourceFactory createInjectorSourceFactory(Properties properties) { - return new InjectorSourceFactory(new Env(properties)); + private InjectorSourceFactory createInjectorSourceFactory(Map properties) { + return new InjectorSourceFactory(properties); } @Test public void createsDefaultInjectorSourceWhenGuiceModulePropertyIsNotSet() { - InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(new Properties()); + InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(Collections.emptyMap()); assertThat(injectorSourceFactory.create(), is(instanceOf(InjectorSource.class))); } @@ -35,16 +36,16 @@ public Injector getInjector() { @Test public void instantiatesInjectorSourceByFullyQualifiedName() { - Properties properties = new Properties(); - properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, CustomInjectorSource.class.getName()); + Map properties = new HashMap<>(); + properties.put(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, CustomInjectorSource.class.getName()); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); assertThat(injectorSourceFactory.create(), is(instanceOf(CustomInjectorSource.class))); } @Test public void failsToInstantiateNonExistantClass() { - Properties properties = new Properties(); - properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, "some.bogus.Class"); + Map properties = new HashMap<>(); + properties.put(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, "some.bogus.Class"); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); try { injectorSourceFactory.create(); @@ -56,8 +57,8 @@ public void failsToInstantiateNonExistantClass() { @Test public void failsToInstantiateClassNotImplementingInjectorSource() { - Properties properties = new Properties(); - properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, String.class.getName()); + Map properties = new HashMap<>(); + properties.put(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, String.class.getName()); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); try { injectorSourceFactory.create(); @@ -79,8 +80,8 @@ public Injector getInjector() { @Test public void failsToInstantiateClassWithPrivateConstructor() { - Properties properties = new Properties(); - properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, PrivateConstructor.class.getName()); + Map properties = new HashMap<>(); + properties.put(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, PrivateConstructor.class.getName()); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); try { injectorSourceFactory.create(); @@ -102,8 +103,8 @@ public Injector getInjector() { @Test public void failsToInstantiateClassWithNoDefaultConstructor() { - Properties properties = new Properties(); - properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, NoDefaultConstructor.class.getName()); + Map properties = new HashMap<>(); + properties.put(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, NoDefaultConstructor.class.getName()); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); try { injectorSourceFactory.create(); @@ -132,8 +133,8 @@ public void instantiateClassInChildClassLoader() { ClassLoader childClassLoader = new MyChildClassLoader(this.getClass().getClassLoader()); Thread.currentThread().setContextClassLoader(childClassLoader); - Properties properties = new Properties(); - properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, "io.cucumber.guice.impl.LivesInChildClassLoader"); + Map properties = new HashMap<>(); + properties.put(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, "io.cucumber.guice.impl.LivesInChildClassLoader"); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); assertThat(injectorSourceFactory.create(), is(instanceOf(InjectorSource.class))); diff --git a/junit/src/main/java/io/cucumber/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java index 550cc7af8f..a77388f65d 100644 --- a/junit/src/main/java/io/cucumber/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java @@ -3,13 +3,11 @@ import io.cucumber.core.event.TestSourceRead; import io.cucumber.core.event.TestRunFinished; import io.cucumber.core.event.TestRunStarted; +import io.cucumber.core.options.*; import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; import io.cucumber.core.runtime.ObjectFactorySupplier; import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier; import io.cucumber.core.eventbus.EventBus; -import io.cucumber.core.options.CucumberOptionsAnnotationParser; -import io.cucumber.core.options.Env; -import io.cucumber.core.options.EnvironmentOptionsParser; import io.cucumber.core.runtime.BackendServiceLoader; import io.cucumber.core.runtime.BackendSupplier; import io.cucumber.core.runtime.TimeServiceEventBus; @@ -20,7 +18,6 @@ import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.feature.FeatureLoader; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; -import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; @@ -42,8 +39,9 @@ import java.util.List; /** + * Cucumber JUnit Runner. *

        - * Classes annotated with {@code @RunWith(Cucumber.class)} will run a Cucumber Feature. + * A class annotated with {@code @RunWith(Cucumber.class)} will run feature files as junit tests. * In general, the runner class should be empty without any fields or methods. * For example: *

        @@ -57,7 +55,13 @@
          * path as the annotated class. For example, if the annotated class is {@code com.example.RunCucumber} then
          * features and glue are assumed to be located in {@code com.example}.
          * 

        - * Additional hints can be provided to Cucumber by annotating the class with {@link CucumberOptions}. + * Options can be provided in by (order of precedence): + *

          + *
        1. Setting {@code cucumber.options} property in {@link System#getProperties()} ()}
        2. + *
        3. Setting {@code cucumber.options} property in {@link System#getenv()}
        4. + *
        5. Annotating the runner class with {@link CucumberOptions}
        6. + *
        7. {Setting @code cucumber.options} property in {@code cucumber.properties}
        8. + *
        *

        * Cucumber also supports JUnits {@link ClassRule}, {@link BeforeClass} and {@link AfterClass} annotations. * These will be executed before and after all scenarios. Using these is not recommended as it limits the portability @@ -90,15 +94,23 @@ public Cucumber(Class clazz) throws InitializationError { ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); // Parse the options early to provide fast feedback about invalid options + RuntimeOptions bundleOptions = new CucumberPropertiesParser(resourceLoader) + .parse(CucumberProperties.fromPropertiesFile()) + .build(); + RuntimeOptions annotationOptions = new CucumberOptionsAnnotationParser(resourceLoader) .withOptionsProvider(new JUnitCucumberOptionsProvider()) .parse(clazz) - .build(); + .build(bundleOptions); - RuntimeOptions runtimeOptions = new EnvironmentOptionsParser(resourceLoader) - .parse(Env.INSTANCE) + RuntimeOptions environmentOptions = new CucumberPropertiesParser(resourceLoader) + .parse(CucumberProperties.fromEnvironment()) .build(annotationOptions); + RuntimeOptions runtimeOptions = new CucumberPropertiesParser(resourceLoader) + .parse(CucumberProperties.fromSystemProperties()) + .build(environmentOptions); + JUnitOptions junitAnnotationOptions = new JUnitOptionsParser() .parse(clazz) .build(); diff --git a/testng/src/main/java/io/cucumber/testng/AbstractTestNGCucumberTests.java b/testng/src/main/java/io/cucumber/testng/AbstractTestNGCucumberTests.java index 6428ef885e..73853567da 100644 --- a/testng/src/main/java/io/cucumber/testng/AbstractTestNGCucumberTests.java +++ b/testng/src/main/java/io/cucumber/testng/AbstractTestNGCucumberTests.java @@ -7,7 +7,11 @@ import org.testng.annotations.Test; /** - * Runs each cucumber scenario found in the features as separated test + * Abstract TestNG Cucumber Test + *

        + * Runs each cucumber scenario found in the features as separated test. + * + * @see TestNGCucumberRunner */ @API(status = API.Status.STABLE) public abstract class AbstractTestNGCucumberTests { diff --git a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java index 78203fe1fe..33842b8cec 100644 --- a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java @@ -4,6 +4,7 @@ import io.cucumber.core.event.TestRunFinished; import io.cucumber.core.event.TestRunStarted; import io.cucumber.core.event.TestSourceRead; +import io.cucumber.core.options.*; import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; import io.cucumber.core.runtime.ObjectFactorySupplier; import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier; @@ -16,10 +17,6 @@ import io.cucumber.core.io.ResourceLoaderClassFinder; import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.feature.FeatureLoader; -import io.cucumber.core.options.CucumberOptionsAnnotationParser; -import io.cucumber.core.options.Env; -import io.cucumber.core.options.EnvironmentOptionsParser; -import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.plugin.Plugins; import io.cucumber.core.runner.Runner; @@ -36,6 +33,14 @@ /** * Glue code for running Cucumber via TestNG. + *

        + * Options can be provided in order of precedence by: + *

          + *
        1. Setting {@code cucumber.options} property in {@link System#getProperties()} ()}
        2. + *
        3. Setting {@code cucumber.options} property in {@link System#getenv()}
        4. + *
        5. Annotating the runner class with {@link CucumberOptions}
        6. + *
        7. {Setting @code cucumber.options} property in {@code cucumber.properties}
        8. + *
        */ @API(status = API.Status.STABLE) public final class TestNGCucumberRunner { @@ -59,14 +64,23 @@ public TestNGCucumberRunner(Class clazz) { ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); // Parse the options early to provide fast feedback about invalid options + RuntimeOptions bundleOptions = new CucumberPropertiesParser(resourceLoader) + .parse(CucumberProperties.fromPropertiesFile()) + .build(); + RuntimeOptions annotationOptions = new CucumberOptionsAnnotationParser(resourceLoader) .withOptionsProvider(new TestNGCucumberOptionsProvider()) .parse(clazz) - .build(); - runtimeOptions = new EnvironmentOptionsParser(resourceLoader) - .parse(Env.INSTANCE) + .build(bundleOptions); + + RuntimeOptions environmentOptions = new CucumberPropertiesParser(resourceLoader) + .parse(CucumberProperties.fromEnvironment()) .build(annotationOptions); + runtimeOptions = new CucumberPropertiesParser(resourceLoader) + .parse(CucumberProperties.fromSystemProperties()) + .build(environmentOptions); + FeatureLoader featureLoader = new FeatureLoader(resourceLoader); featureSupplier = new FeaturePathFeatureSupplier(featureLoader, runtimeOptions); @@ -77,7 +91,6 @@ public TestNGCucumberRunner(Class clazz) { this.filters = new Filters(runtimeOptions); TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier, typeRegistrySupplier); - } public void runScenario(PickleEvent pickle) throws Throwable { From 09527618150f0118e921e2a518db1c27894cc2ae Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Fri, 28 Jun 2019 21:17:41 +0200 Subject: [PATCH 105/155] [Core] Clean up StepDefinition interface --- .../main/java/io/cucumber/core/backend/StepDefinition.java | 4 ++++ .../src/main/java/io/cucumber/core/event/StepDefinition.java | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java index 32bd2c1afa..3aaac9490e 100644 --- a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java @@ -32,4 +32,8 @@ public interface StepDefinition extends io.cucumber.core.event.StepDefinition { */ boolean isDefinedAt(StackTraceElement stackTraceElement); // TODO: redundant with getLocation? + /** + * @return How many declared parameters this step definition has. Returns null if unknown. + */ + Integer getParameterCount(); } diff --git a/core/src/main/java/io/cucumber/core/event/StepDefinition.java b/core/src/main/java/io/cucumber/core/event/StepDefinition.java index fa41502bfa..1b07fe3ff3 100644 --- a/core/src/main/java/io/cucumber/core/event/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/event/StepDefinition.java @@ -11,11 +11,6 @@ public interface StepDefinition { */ String getLocation(boolean detail); - /** - * @return How many declared parameters this step definition has. Returns null if unknown. - */ - Integer getParameterCount(); - /** * @return the pattern associated with this instance. Used for error reporting only. */ From e5058bf54fe67ec259154157632f967e3936916e Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Fri, 28 Jun 2019 22:55:52 +0200 Subject: [PATCH 106/155] [JUnit] Remove `--junit` CLI options --- .../main/java/io/cucumber/core/cli/Main.java | 4 +- .../CucumberOptionsAnnotationParser.java | 11 +-- .../core/options/RuntimeOptionsBuilder.java | 9 --- .../core/options/RuntimeOptionsParser.java | 4 -- .../io/cucumber/core/options/USAGE.txt | 4 -- .../CucumberOptionsAnnotationParserTest.java | 11 --- .../core/options/RuntimeOptionsTest.java | 28 -------- .../main/java/io/cucumber/junit/Cucumber.java | 19 +++-- .../io/cucumber/junit/CucumberOptions.java | 9 --- .../junit/JUnitCucumberOptionsProvider.java | 5 -- .../io/cucumber/junit/JUnitOptionsParser.java | 59 ++------------- .../resources/io/cucumber/junit/OPTIONS.txt | 16 ----- .../io/cucumber/junit/FeatureRunnerTest.java | 29 ++++---- .../io/cucumber/junit/JUnitReporterTest.java | 22 +++--- ...ickleRunnerWithNoStepDescriptionsTest.java | 46 ++++++------ .../PickleRunnerWithStepDescriptionsTest.java | 71 +++++++++---------- .../RunCucumberTestNoStepNotifications.java | 2 +- .../testng/TestNGCucumberOptionsProvider.java | 5 -- .../cucumber/testng/TestNGCucumberRunner.java | 4 +- 19 files changed, 108 insertions(+), 250 deletions(-) delete mode 100644 junit/src/main/resources/io/cucumber/junit/OPTIONS.txt diff --git a/core/src/main/java/io/cucumber/core/cli/Main.java b/core/src/main/java/io/cucumber/core/cli/Main.java index fe073449d3..b732965748 100644 --- a/core/src/main/java/io/cucumber/core/cli/Main.java +++ b/core/src/main/java/io/cucumber/core/cli/Main.java @@ -33,13 +33,13 @@ public static void main(String[] argv) { public static byte run(String[] argv, ClassLoader classLoader) { ResourceLoader resourceLoader = new MultiLoader(classLoader); - RuntimeOptions bundleOptions = new CucumberPropertiesParser(resourceLoader) + RuntimeOptions propertiesFileOptions = new CucumberPropertiesParser(resourceLoader) .parse(CucumberProperties.fromPropertiesFile()) .build(); RuntimeOptions environmentOptions = new CucumberPropertiesParser(resourceLoader) .parse(CucumberProperties.fromEnvironment()) - .build(bundleOptions); + .build(propertiesFileOptions); RuntimeOptions systemOptions = new CucumberPropertiesParser(resourceLoader) .parse(CucumberProperties.fromSystemProperties()) diff --git a/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java b/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java index 3985912cbf..63c9ea6915 100644 --- a/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java +++ b/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java @@ -50,7 +50,6 @@ public RuntimeOptionsBuilder parse(Class clazz) { addSnippets(options, args); addGlue(options, args); addFeatures(options, args); - addJunitOptions(options, args); } } addDefaultFeaturePathIfNoFeaturePathIsSpecified(args, clazz); @@ -154,12 +153,6 @@ private void addStrict(CucumberOptions options, RuntimeOptionsBuilder args) { } } - private void addJunitOptions(CucumberOptions options, RuntimeOptionsBuilder args) { - for (String junitOption : options.junit()) { - args.addJunitOption(junitOption); - } - } - private static String packagePath(Class clazz) { String packageName = packageName(clazz); @@ -170,7 +163,7 @@ private static String packagePath(Class clazz) { return Classpath.CLASSPATH_SCHEME_PREFIX + packageName.replace('.', '/'); } - static String packageName(Class clazz) { + private static String packageName(Class clazz) { String className = clazz.getName(); return className.substring(0, Math.max(0, className.lastIndexOf('.'))); } @@ -211,7 +204,5 @@ public interface CucumberOptions { String[] name(); SnippetType snippets(); - - String[] junit(); } } diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsBuilder.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsBuilder.java index d5ff0460f8..05b0b7634e 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsBuilder.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsBuilder.java @@ -23,7 +23,6 @@ public final class RuntimeOptionsBuilder { private List parsedFeaturePaths = new ArrayList<>(); private List parsedGlue = new ArrayList<>(); private ParsedPluginData parsedPluginData = new ParsedPluginData(); - private List parsedJunitOptions = new ArrayList<>(); private boolean parsedIsRerun = false; private Integer parsedThreads = null; private Boolean parsedDryRun = null; @@ -45,11 +44,6 @@ public RuntimeOptionsBuilder addGlue(URI glue) { return this; } - public RuntimeOptionsBuilder addJunitOption(String junitOption) { - this.parsedJunitOptions.add(junitOption); - return this; - } - private RuntimeOptionsBuilder addLineFilters(FeatureWithLines featureWithLines) { URI key = featureWithLines.uri(); Set lines = featureWithLines.lines(); @@ -132,9 +126,6 @@ public RuntimeOptions build(RuntimeOptions runtimeOptions) { if (!this.parsedGlue.isEmpty()) { runtimeOptions.setGlue(this.parsedGlue); } - if (!this.parsedJunitOptions.isEmpty()) { - runtimeOptions.setJunitOptions(this.parsedJunitOptions); - } this.parsedPluginData.updateFormatters(runtimeOptions.getFormatters()); this.parsedPluginData.updateSummaryPrinters(runtimeOptions.getSummaryPrinter()); diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java index 5bd1d34e05..bf31cc716b 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java @@ -107,10 +107,6 @@ RuntimeOptionsBuilder parse(List args) { String nextArg = args.remove(0); Pattern pattern = Pattern.compile(nextArg); parsedOptions.addNameFilter(pattern); - } else if (arg.startsWith("--junit,")) { - for (String parsedOption : arg.substring("--junit,".length()).split(",")) { - parsedOptions.addJunitOption(parsedOption); - } } else if (arg.equals("--wip") || arg.equals("-w")) { parsedOptions.setWip(true); } else if (arg.equals("--order")) { diff --git a/core/src/main/resources/io/cucumber/core/options/USAGE.txt b/core/src/main/resources/io/cucumber/core/options/USAGE.txt index b8739c70c7..82c6a3ddbd 100644 --- a/core/src/main/resources/io/cucumber/core/options/USAGE.txt +++ b/core/src/main/resources/io/cucumber/core/options/USAGE.txt @@ -39,10 +39,6 @@ Options: --i18n LANG List keywords for in a particular language Run with "--i18n help" to see all languages - --junit,OPTION[,OPTION]* Pass the OPTION(s) to the JUnit module. - Use --junit,-h or --junit,--help to print the - options of the JUnit module. - -w, --wip Fail if there are any passing scenarios. diff --git a/core/src/test/java/io/cucumber/core/options/CucumberOptionsAnnotationParserTest.java b/core/src/test/java/io/cucumber/core/options/CucumberOptionsAnnotationParserTest.java index 998c7a389e..200059ce6a 100644 --- a/core/src/test/java/io/cucumber/core/options/CucumberOptionsAnnotationParserTest.java +++ b/core/src/test/java/io/cucumber/core/options/CucumberOptionsAnnotationParserTest.java @@ -138,13 +138,6 @@ public void override_monochrome_flag_from_baseclass() { assertTrue(runtimeOptions.isMonochrome()); } - @Test - public void create_with_junit_options() { - RuntimeOptions runtimeOptions = parser().parse(ClassWithJunitOption.class).build(); - - assertEquals(asList("option1", "option2=value"), runtimeOptions.getJunitOptions()); - } - private void assertPluginExists(List plugins, String pluginName) { boolean found = false; for (Plugin plugin : plugins) { @@ -343,10 +336,6 @@ public SnippetType snippets() { return annotation.snippets(); } - @Override - public String[] junit() { - return annotation.junit(); - } } private static class CoreCucumberOptionsProvider implements CucumberOptionsAnnotationParser.OptionsProvider { diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index 38adecc60d..7487e6be74 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -293,34 +293,6 @@ public void ensure_name_with_spaces_works_with_args() { assertThat(ShellWords.parse("--name 'some Name'"), contains("--name", "some Name")); } - @Test - public void assigns_single_junit_option() { - RuntimeOptions options = new CommandlineOptionsParser() - .parse("--junit,option") - .build(); - assertThat(options.getJunitOptions(), contains("option")); - } - - @Test - public void assigns_multiple_junit_options() { - RuntimeOptions options = new CommandlineOptionsParser() - .parse("--junit,option1,option2=value") - .build(); - assertThat(options.getJunitOptions(), contains("option1", "option2=value")); - } - - @Test - public void clobbers_junit_options_from_cli_if_junit_options_specified_in_cucumber_options_property() { - properties.put("cucumber.options", "--junit,option_from_property"); - RuntimeOptions runtimeOptions = new CommandlineOptionsParser() - .parse("--junit,option_to_be_clobbered") - .build(); - RuntimeOptions options = new CucumberPropertiesParser() - .parse(properties) - .build(runtimeOptions); - assertThat(options.getJunitOptions(), contains("option_from_property")); - } - @Test public void overrides_options_with_system_properties_without_clobbering_non_overridden_ones() { properties.put("cucumber.options", "--glue lookatme this_clobbers_feature_paths"); diff --git a/junit/src/main/java/io/cucumber/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java index a77388f65d..970dd8fbbb 100644 --- a/junit/src/main/java/io/cucumber/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java @@ -94,14 +94,14 @@ public Cucumber(Class clazz) throws InitializationError { ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); // Parse the options early to provide fast feedback about invalid options - RuntimeOptions bundleOptions = new CucumberPropertiesParser(resourceLoader) + RuntimeOptions propertiesFileOptions = new CucumberPropertiesParser(resourceLoader) .parse(CucumberProperties.fromPropertiesFile()) .build(); RuntimeOptions annotationOptions = new CucumberOptionsAnnotationParser(resourceLoader) .withOptionsProvider(new JUnitCucumberOptionsProvider()) .parse(clazz) - .build(bundleOptions); + .build(propertiesFileOptions); RuntimeOptions environmentOptions = new CucumberPropertiesParser(resourceLoader) .parse(CucumberProperties.fromEnvironment()) @@ -111,14 +111,23 @@ public Cucumber(Class clazz) throws InitializationError { .parse(CucumberProperties.fromSystemProperties()) .build(environmentOptions); + // Next parse the junit options + JUnitOptions junitPropertiesFileOptions = new JUnitOptionsParser() + .parse(CucumberProperties.fromPropertiesFile()) + .build(); + JUnitOptions junitAnnotationOptions = new JUnitOptionsParser() .parse(clazz) - .build(); + .build(junitPropertiesFileOptions); + + JUnitOptions junitEnvironmentOptions = new JUnitOptionsParser() + .parse(CucumberProperties.fromEnvironment()) + .build(junitAnnotationOptions); JUnitOptions junitOptions = new JUnitOptionsParser() - .parse(runtimeOptions.getJunitOptions()) + .parse(CucumberProperties.fromSystemProperties()) .setStrict(runtimeOptions.isStrict()) - .build(junitAnnotationOptions); + .build(junitEnvironmentOptions); // Parse the features early. Don't proceed when there are lexer errors FeatureLoader featureLoader = new FeatureLoader(resourceLoader); diff --git a/junit/src/main/java/io/cucumber/junit/CucumberOptions.java b/junit/src/main/java/io/cucumber/junit/CucumberOptions.java index e46b3974f6..f928c6150d 100644 --- a/junit/src/main/java/io/cucumber/junit/CucumberOptions.java +++ b/junit/src/main/java/io/cucumber/junit/CucumberOptions.java @@ -95,15 +95,6 @@ */ SnippetType snippets() default SnippetType.UNDERSCORE; - /** - * Pass options to the JUnit runner. - * - * @deprecated use {@link #useFileNameCompatibleName()} or - * {@link #stepNotifications()} instead. - */ - @Deprecated - String[] junit() default {}; - /** * Use filename compatible names. *

        diff --git a/junit/src/main/java/io/cucumber/junit/JUnitCucumberOptionsProvider.java b/junit/src/main/java/io/cucumber/junit/JUnitCucumberOptionsProvider.java index d33285c48b..8cc8db2100 100644 --- a/junit/src/main/java/io/cucumber/junit/JUnitCucumberOptionsProvider.java +++ b/junit/src/main/java/io/cucumber/junit/JUnitCucumberOptionsProvider.java @@ -76,10 +76,5 @@ public SnippetType snippets() { throw new IllegalArgumentException("" + annotation.snippets()); } } - - @Override - public String[] junit() { - return annotation.junit(); - } } } diff --git a/junit/src/main/java/io/cucumber/junit/JUnitOptionsParser.java b/junit/src/main/java/io/cucumber/junit/JUnitOptionsParser.java index 8ee8269995..42d5070978 100644 --- a/junit/src/main/java/io/cucumber/junit/JUnitOptionsParser.java +++ b/junit/src/main/java/io/cucumber/junit/JUnitOptionsParser.java @@ -1,46 +1,12 @@ package io.cucumber.junit; -import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.util.FixJava; - -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.ArrayList; -import java.util.List; +import java.util.Map; final class JUnitOptionsParser { - private static final String OPTIONS_RESOURCE = "/io/cucumber/junit/api/OPTIONS.txt"; - private static String optionsText; - - /** - * Create a new instance from a list of options, for example: - *

        - * - * - * @param args - * @return - */ - JUnitOptionsBuilder parse(List args) { - args = new ArrayList<>(args); - JUnitOptionsBuilder builder = new JUnitOptionsBuilder(); - - while (!args.isEmpty()) { - String arg = args.remove(0).trim(); - - if (arg.equals("--help") || arg.equals("-h")) { - printOptions(); - System.exit(0); - } else if (arg.equals("--no-filename-compatible-names") || arg.equals("--filename-compatible-names")) { - builder.setFilenameCompatibleNames(!arg.startsWith("--no-")); - } else if (arg.equals("--no-step-notifications") || arg.equals("--step-notifications")) { - builder.setStepNotifications(!arg.startsWith("--no-")); - } else { - printOptions(); - throw new CucumberException("Unknown option: " + arg); - } - } - return builder; + JUnitOptionsBuilder parse(Map properties) { + // TODO: Nothing to parse yet. See https://github.com/cucumber/cucumber-jvm/issues/1675 + return new JUnitOptionsBuilder(); } JUnitOptionsBuilder parse(Class clazz) { @@ -63,20 +29,5 @@ JUnitOptionsBuilder parse(Class clazz) { } return args; } - - private void printOptions() { - loadUsageTextIfNeeded(); - System.out.println(optionsText); - } - - private static void loadUsageTextIfNeeded() { - if (optionsText == null) { - try { - Reader reader = new InputStreamReader(FixJava.class.getResourceAsStream(OPTIONS_RESOURCE), "UTF-8"); - optionsText = FixJava.readReader(reader); - } catch (Exception e) { - optionsText = "Could not load usage text: " + e.toString(); - } - } - } } + diff --git a/junit/src/main/resources/io/cucumber/junit/OPTIONS.txt b/junit/src/main/resources/io/cucumber/junit/OPTIONS.txt deleted file mode 100644 index 4b34b9b044..0000000000 --- a/junit/src/main/resources/io/cucumber/junit/OPTIONS.txt +++ /dev/null @@ -1,16 +0,0 @@ -JUnit Options: - - -h, --help You're looking at it. - --[no-]filename-compatible-names Make sure that the names of the test cases - only is made up of [A-Za-Z0-9_] so that the - names for certain can be used as file names. - For instance gradle will use these names in - the file names of the JUnit xml report files. - --[no-]step-notifications By default steps are not included in - notifications and descriptions. This aligns - test case in the Cucumber-JVM domain - (Scenarios) with the test case in the JUnit - domain (the leafs in the description tree), - and works better with the report files of - the notification listeners like maven surefire - or gradle. diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index 169686b6d0..0d5912bb0f 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -23,7 +23,6 @@ import java.time.Clock; import java.time.Instant; import java.time.ZoneId; -import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -72,7 +71,7 @@ public void should_not_create_step_descriptions_by_default() throws Exception { ); - FeatureRunner runner = createFeatureRunner(cucumberFeature); + FeatureRunner runner = createFeatureRunner(cucumberFeature, new JUnitOptions()); Description feature = runner.getDescription(); Description scenarioA = feature.getChildren().get(0); @@ -104,7 +103,7 @@ public void should_not_issue_notification_for_steps_by_default_scenario_outline_ " | x | y |\n" + " | second | third |\n"); - RunNotifier notifier = runFeatureWithNotifier(feature); + RunNotifier notifier = runFeatureWithNotifier(feature, new JUnitOptions()); InOrder order = inOrder(notifier); @@ -131,7 +130,7 @@ public void should_not_issue_notification_for_steps_by_default_two_scenarios_wit " Scenario: scenario_2 name\n" + " Then another second step\n"); - RunNotifier notifier = runFeatureWithNotifier(feature); + RunNotifier notifier = runFeatureWithNotifier(feature, new JUnitOptions()); InOrder order = inOrder(notifier); @@ -143,18 +142,13 @@ public void should_not_issue_notification_for_steps_by_default_two_scenarios_wit order.verify(notifier).fireTestFinished(argThat(new DescriptionMatcher("scenario_2 name(feature name)"))); } - private RunNotifier runFeatureWithNotifier(CucumberFeature cucumberFeature, String... options) throws InitializationError { + private RunNotifier runFeatureWithNotifier(CucumberFeature cucumberFeature, JUnitOptions options) throws InitializationError { FeatureRunner runner = createFeatureRunner(cucumberFeature, options); RunNotifier notifier = mock(RunNotifier.class); runner.run(notifier); return notifier; } - private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, String... options) throws InitializationError { - JUnitOptions junitOption = new JUnitOptionsParser().parse(Arrays.asList(options)).build(); - return createFeatureRunner(cucumberFeature, junitOption); - } - private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, JUnitOptions junitOption) throws InitializationError { ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); final RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); @@ -207,10 +201,10 @@ public void should_populate_descriptions_with_stable_unique_ids() throws Excepti ); - FeatureRunner runner = createFeatureRunner(cucumberFeature); - FeatureRunner rerunner = createFeatureRunner(cucumberFeature); + FeatureRunner runner = createFeatureRunner(cucumberFeature, new JUnitOptions()); + FeatureRunner rerunner = createFeatureRunner(cucumberFeature, new JUnitOptions()); - Set descriptions = new HashSet(); + Set descriptions = new HashSet<>(); assertDescriptionIsUnique(runner.getDescription(), descriptions); assertDescriptionIsPredictable(runner.getDescription(), descriptions); assertDescriptionIsPredictable(rerunner.getDescription(), descriptions); @@ -237,7 +231,8 @@ public void step_descriptions_can_be_turned_on() throws Exception { ); - FeatureRunner runner = createFeatureRunner(cucumberFeature, "--step-notifications"); + JUnitOptions junitOption = new JUnitOptionsBuilder().setStepNotifications(true).build(); + FeatureRunner runner = createFeatureRunner(cucumberFeature, junitOption); Description feature = runner.getDescription(); Description scenarioA = feature.getChildren().get(0); @@ -269,7 +264,8 @@ public void step_notification_can_be_turned_on_scenario_outline_with_two_example " | x | y |\n" + " | second | third |\n"); - RunNotifier notifier = runFeatureWithNotifier(feature, "--step-notifications"); + JUnitOptions junitOption = new JUnitOptionsBuilder().setStepNotifications(true).build(); + RunNotifier notifier = runFeatureWithNotifier(feature, junitOption); InOrder order = inOrder(notifier); @@ -320,7 +316,8 @@ public void step_notification_can_be_turned_on_two_scenarios_with_background() t " Scenario: scenario_2 name\n" + " Then another second step\n"); - RunNotifier notifier = runFeatureWithNotifier(feature, "--step-notifications"); + JUnitOptions junitOption = new JUnitOptionsBuilder().setStepNotifications(true).build(); + RunNotifier notifier = runFeatureWithNotifier(feature, junitOption); InOrder order = inOrder(notifier); diff --git a/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java index 120114a05a..f197ac110d 100644 --- a/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java +++ b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java @@ -38,7 +38,7 @@ public class JUnitReporterTest { @Test public void test_case_started_fires_test_started_for_pickle() { createNonStrictReporter(); - PickleRunner pickleRunner = mockPickleRunner(Collections.emptyList()); + PickleRunner pickleRunner = mockPickleRunner(Collections.emptyList()); runNotifier = mock(RunNotifier.class); jUnitReporter.startExecutionUnit(pickleRunner, runNotifier); @@ -62,7 +62,7 @@ public void test_step_started_does_not_fire_test_started_for_step_by_default() { @Test public void test_step_started_fires_test_started_for_step_when_using_step_notifications() { - createNonStrictReporter("--step-notifications"); + createReporter(new JUnitOptionsBuilder().setStepNotifications(true).build()); PickleStep runnerStep = mockStep(); PickleRunner pickleRunner = mockPickleRunner(runnerSteps(runnerStep)); runNotifier = mock(RunNotifier.class); @@ -506,26 +506,30 @@ private void createRunNotifier(Description description) { jUnitReporter.startExecutionUnit(pickleRunner, runNotifier); } - private void createStrictReporter(String... options) { - jUnitReporter = new JUnitReporter(mock(EventBus.class), new JUnitOptionsParser().parse(asList(options)).setStrict(true).build()); + private void createStrictReporter() { + createReporter(new JUnitOptionsBuilder().setStrict(true).build()); } - private void createNonStrictReporter(String... options) { - jUnitReporter = new JUnitReporter(mock(EventBus.class), new JUnitOptionsParser().parse(asList(options)).build()); + private void createNonStrictReporter() { + createReporter(new JUnitOptions()); + } + + private void createReporter(JUnitOptions options) { + jUnitReporter = new JUnitReporter(mock(EventBus.class), options); } private void setUpStepNotifierAndStepErrors(Description description) { jUnitReporter.stepNotifier = new EachTestNotifier(runNotifier, description); - jUnitReporter.stepErrors = new ArrayList(); + jUnitReporter.stepErrors = new ArrayList<>(); } private void setUpNoStepNotifierAndStepErrors() { jUnitReporter.stepNotifier = new NoTestNotifier(); - jUnitReporter.stepErrors = new ArrayList(); + jUnitReporter.stepErrors = new ArrayList<>(); } private void populateStepErrors(List exceptions) { - jUnitReporter.stepErrors = new ArrayList(); + jUnitReporter.stepErrors = new ArrayList<>(); for (Throwable exception : exceptions) { jUnitReporter.stepErrors.add(exception); } diff --git a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java index af93982594..02e48354c2 100644 --- a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithNoStepDescriptionsTest.java @@ -5,8 +5,6 @@ import io.cucumber.junit.PickleRunners.PickleRunner; import org.junit.Test; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import static org.junit.Assert.assertEquals; @@ -15,41 +13,41 @@ public class PickleRunnerWithNoStepDescriptionsTest { @Test - public void shouldUseScenarioNameWithFeatureNameAsClassNameForDisplayName() throws Exception { + public void shouldUseScenarioNameWithFeatureNameAsClassNameForDisplayName() { List pickles = TestPickleBuilder.pickleEventsFromFeature("featurePath", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Then it works\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Then it works\n"); PickleRunner runner = PickleRunners.withNoStepDescriptions( - "feature name", - mock(RunnerSupplier.class), - pickles.get(0), - createJUnitOptions() + "feature name", + mock(RunnerSupplier.class), + pickles.get(0), + createJunitOptions() ); assertEquals("scenario name(feature name)", runner.getDescription().getDisplayName()); } @Test - public void shouldConvertTextFromFeatureFileForNamesWithFilenameCompatibleNameOption() throws Exception { + public void shouldConvertTextFromFeatureFileForNamesWithFilenameCompatibleNameOption() { List pickles = TestPickleBuilder.pickleEventsFromFeature("featurePath", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Then it works\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Then it works\n"); PickleRunner runner = PickleRunners.withNoStepDescriptions( - "feature name", - mock(RunnerSupplier.class), - pickles.get(0), - createJUnitOptions("--filename-compatible-names") + "feature name", + mock(RunnerSupplier.class), + pickles.get(0), + createFileNameCompatibleJUnitOptions() ); assertEquals("scenario_name(feature_name)", runner.getDescription().getDisplayName()); } @Test - public void shouldConvertTextFromFeatureFileWithRussianLanguage() throws Exception { + public void shouldConvertTextFromFeatureFileWithRussianLanguage() { List pickles = TestPickleBuilder.pickleEventsFromFeature("featurePath", "" + "#language:ru\n" + "ФункциÑ: Ð¸Ð¼Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸\n" + @@ -60,17 +58,17 @@ public void shouldConvertTextFromFeatureFileWithRussianLanguage() throws Excepti "Ð¸Ð¼Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸", mock(RunnerSupplier.class), pickles.get(0), - createJUnitOptions("--filename-compatible-names") + createFileNameCompatibleJUnitOptions() ); assertEquals("____________(___________)", runner.getDescription().getDisplayName()); } - private JUnitOptions createJUnitOptions() { - return new JUnitOptionsParser().parse(Collections.emptyList()).setStrict(true).build(); + private JUnitOptions createJunitOptions() { + return new JUnitOptionsBuilder().setStrict(true).build(); } - private JUnitOptions createJUnitOptions(String option) { - return new JUnitOptionsParser().parse(Collections.singletonList(option)).setStrict(true).build(); + private JUnitOptions createFileNameCompatibleJUnitOptions() { + return new JUnitOptionsBuilder().setFilenameCompatibleNames(true).setStrict(true).build(); } } diff --git a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java index 6755a01939..48c9a8fa04 100644 --- a/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java +++ b/junit/src/test/java/io/cucumber/junit/PickleRunnerWithStepDescriptionsTest.java @@ -1,7 +1,6 @@ package io.cucumber.junit; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import io.cucumber.core.runtime.RunnerSupplier; @@ -16,7 +15,6 @@ import org.junit.runner.Description; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class PickleRunnerWithStepDescriptionsTest { @@ -39,12 +37,12 @@ public void shouldAssignUnequalDescriptionsToDifferentOccurrencesOfSameStepInASc List pickleEvents = new ArrayList<>(); for (Pickle pickle : compiler.compile(features.getGherkinFeature())) { pickleEvents.add(new PickleEvent(features.getUri().toString(), pickle)); - }; + } WithStepDescriptions runner = (WithStepDescriptions) PickleRunners.withStepDescriptions( - mock(RunnerSupplier.class), - pickleEvents.get(0), - createJUnitOptions() + mock(RunnerSupplier.class), + pickleEvents.get(0), + createJunitOptions() ); // fish out the two occurrences of the same step and check whether we really got them @@ -58,7 +56,7 @@ public void shouldAssignUnequalDescriptionsToDifferentOccurrencesOfSameStepInASc Description stepDescription1 = runnerDescription.getChildren().get(0); Description stepDescription2 = runnerDescription.getChildren().get(2); - assertFalse("Descriptions must not be equal.", stepDescription1.equals(stepDescription2)); + assertNotEquals("Descriptions must not be equal.", stepDescription1, stepDescription2); } @Test @@ -74,16 +72,16 @@ public void shouldAssignUnequalDescriptionsToDifferentStepsInAScenarioOutline() ); WithStepDescriptions runner = (WithStepDescriptions) PickleRunners.withStepDescriptions( - mock(RunnerSupplier.class), - features.getPickles().get(0), - createJUnitOptions() + mock(RunnerSupplier.class), + features.getPickles().get(0), + createJunitOptions() ); Description runnerDescription = runner.getDescription(); Description stepDescription1 = runnerDescription.getChildren().get(0); Description stepDescription2 = runnerDescription.getChildren().get(1); - assertFalse("Descriptions must not be equal.", stepDescription1.equals(stepDescription2)); + assertNotEquals("Descriptions must not be equal.", stepDescription1, stepDescription2); } @Test @@ -100,9 +98,9 @@ public void shouldIncludeScenarioNameAsClassNameInStepDescriptions() throws Exce ); PickleRunner runner = PickleRunners.withStepDescriptions( - mock(RunnerSupplier.class), - features.getPickles().get(0), - createJUnitOptions() + mock(RunnerSupplier.class), + features.getPickles().get(0), + createJunitOptions() ); // fish out the data from runner @@ -118,14 +116,14 @@ public void shouldIncludeScenarioNameAsClassNameInStepDescriptions() throws Exce @Test public void shouldUseScenarioNameForDisplayName() throws Exception { List pickles = TestPickleBuilder.pickleEventsFromFeature("featurePath", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Then it works\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Then it works\n"); PickleRunner runner = PickleRunners.withStepDescriptions( - mock(RunnerSupplier.class), - pickles.get(0), - createJUnitOptions() + mock(RunnerSupplier.class), + pickles.get(0), + createJunitOptions() ); assertEquals("scenario name", runner.getDescription().getDisplayName()); @@ -134,14 +132,14 @@ public void shouldUseScenarioNameForDisplayName() throws Exception { @Test public void shouldUseStepKeyworkAndNameForChildName() throws Exception { List pickleEvents = TestPickleBuilder.pickleEventsFromFeature("featurePath", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Then it works\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Then it works\n"); PickleRunner runner = PickleRunners.withStepDescriptions( - mock(RunnerSupplier.class), - pickleEvents.get(0), - createJUnitOptions() + mock(RunnerSupplier.class), + pickleEvents.get(0), + createJunitOptions() ); assertEquals("it works", runner.getDescription().getChildren().get(0).getMethodName()); @@ -150,14 +148,14 @@ public void shouldUseStepKeyworkAndNameForChildName() throws Exception { @Test public void shouldConvertTextFromFeatureFileForNamesWithFilenameCompatibleNameOption() throws Exception { List pickles = TestPickleBuilder.pickleEventsFromFeature("featurePath", "" + - "Feature: feature name\n" + - " Scenario: scenario name\n" + - " Then it works\n"); + "Feature: feature name\n" + + " Scenario: scenario name\n" + + " Then it works\n"); PickleRunner runner = PickleRunners.withStepDescriptions( - mock(RunnerSupplier.class), - pickles.get(0), - createJunitOptions("--filename-compatible-names") + mock(RunnerSupplier.class), + pickles.get(0), + createFileNameCompatibleJunitOptions() ); assertEquals("scenario_name", runner.getDescription().getDisplayName()); @@ -165,11 +163,12 @@ public void shouldConvertTextFromFeatureFileForNamesWithFilenameCompatibleNameOp assertEquals("it_works", runner.getDescription().getChildren().get(0).getMethodName()); } - private JUnitOptions createJUnitOptions() { + private JUnitOptions createJunitOptions() { return new JUnitOptionsBuilder().setStrict(true).build(); } - private JUnitOptions createJunitOptions(String option) { - return new JUnitOptionsParser().parse(Arrays.asList(option)).setStrict(true).build(); + private JUnitOptions createFileNameCompatibleJunitOptions() { + return new JUnitOptionsBuilder().setFilenameCompatibleNames(true).setStrict(true).build(); } + } diff --git a/junit/src/test/java/io/cucumber/junit/RunCucumberTestNoStepNotifications.java b/junit/src/test/java/io/cucumber/junit/RunCucumberTestNoStepNotifications.java index 6f7f880292..55b27d7059 100644 --- a/junit/src/test/java/io/cucumber/junit/RunCucumberTestNoStepNotifications.java +++ b/junit/src/test/java/io/cucumber/junit/RunCucumberTestNoStepNotifications.java @@ -3,6 +3,6 @@ import org.junit.runner.RunWith; @RunWith(Cucumber.class) -@CucumberOptions(junit = "--no-step-notifications") +@CucumberOptions(stepNotifications = false) public class RunCucumberTestNoStepNotifications { } diff --git a/testng/src/main/java/io/cucumber/testng/TestNGCucumberOptionsProvider.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberOptionsProvider.java index 91fb6a2baa..159da70f1e 100644 --- a/testng/src/main/java/io/cucumber/testng/TestNGCucumberOptionsProvider.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberOptionsProvider.java @@ -76,10 +76,5 @@ public SnippetType snippets() { throw new IllegalArgumentException("" + annotation.snippets()); } } - - @Override - public String[] junit() { - return new String[0]; - } } } diff --git a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java index 33842b8cec..9d1e847eb5 100644 --- a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java @@ -64,14 +64,14 @@ public TestNGCucumberRunner(Class clazz) { ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); // Parse the options early to provide fast feedback about invalid options - RuntimeOptions bundleOptions = new CucumberPropertiesParser(resourceLoader) + RuntimeOptions propertiesFileOptions = new CucumberPropertiesParser(resourceLoader) .parse(CucumberProperties.fromPropertiesFile()) .build(); RuntimeOptions annotationOptions = new CucumberOptionsAnnotationParser(resourceLoader) .withOptionsProvider(new TestNGCucumberOptionsProvider()) .parse(clazz) - .build(bundleOptions); + .build(propertiesFileOptions); RuntimeOptions environmentOptions = new CucumberPropertiesParser(resourceLoader) .parse(CucumberProperties.fromEnvironment()) From db58efe6618e916238dbd9d4dc36d73f8d1eeaca Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 29 Jun 2019 20:16:46 +0200 Subject: [PATCH 107/155] [Core] Extract Status from Result --- .../java/io/cucumber/core/api/Scenario.java | 4 +- .../java/io/cucumber/core/event/Result.java | 72 +------------- .../java/io/cucumber/core/event/Status.java | 28 ++++++ .../cucumber/core/plugin/HTMLFormatter.java | 17 +++- .../cucumber/core/plugin/JSONFormatter.java | 20 +++- .../cucumber/core/plugin/JUnitFormatter.java | 27 ++++-- .../cucumber/core/plugin/PrettyFormatter.java | 17 +++- .../core/plugin/ProgressFormatter.java | 32 +++---- .../cucumber/core/plugin/RerunFormatter.java | 9 +- .../java/io/cucumber/core/plugin/Stats.java | 45 +++++---- .../cucumber/core/plugin/TestNGFormatter.java | 23 +++-- .../core/plugin/TimelineFormatter.java | 4 +- .../plugin/UnusedStepsSummaryPrinter.java | 4 +- .../cucumber/core/plugin/UsageFormatter.java | 3 +- .../io/cucumber/core/runner/Scenario.java | 20 ++-- .../io/cucumber/core/runner/TestStep.java | 31 +++--- .../io/cucumber/core/runtime/Runtime.java | 40 ++++---- .../core/plugin/JSONFormatterTest.java | 2 +- .../core/plugin/JUnitFormatterTest.java | 2 +- .../core/plugin/PluginFactoryTest.java | 3 +- .../io/cucumber/core/plugin/StatsTest.java | 69 +++++++------- .../core/plugin/UsageFormatterTest.java | 21 +++-- .../io/cucumber/core/runner/EventBusTest.java | 5 +- .../core/runner/HookTestStepTest.java | 6 +- .../core/runner/PickleStepTestStepTest.java | 17 ++-- .../core/{event => runner}/ResultTest.java | 50 +++++----- .../core/runner/ScenarioResultTest.java | 53 ++++++----- .../io/cucumber/core/runner/TestHelper.java | 94 ++++++++++--------- .../cucumber/core/runtime/ExitStatusTest.java | 79 ++++++++-------- .../io/cucumber/core/runtime/RuntimeTest.java | 29 +++--- .../java/io/cucumber/junit/JUnitReporter.java | 2 +- .../io/cucumber/junit/JUnitReporterTest.java | 49 +++++----- .../testng/TestCaseResultListener.java | 9 +- .../testng/TestCaseResultListenerTest.java | 13 +-- 34 files changed, 473 insertions(+), 426 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/event/Status.java rename core/src/test/java/io/cucumber/core/{event => runner}/ResultTest.java (62%) diff --git a/core/src/main/java/io/cucumber/core/api/Scenario.java b/core/src/main/java/io/cucumber/core/api/Scenario.java index c0f1113c89..a8de411b65 100644 --- a/core/src/main/java/io/cucumber/core/api/Scenario.java +++ b/core/src/main/java/io/cucumber/core/api/Scenario.java @@ -1,6 +1,6 @@ package io.cucumber.core.api; -import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import java.util.Collection; @@ -17,7 +17,7 @@ public interface Scenario { /** * @return the most severe status of the Scenario's Steps. */ - Result.Type getStatus(); + Status getStatus(); /** * @return true if and only if {@link #getStatus()} returns "failed" diff --git a/core/src/main/java/io/cucumber/core/event/Result.java b/core/src/main/java/io/cucumber/core/event/Result.java index b476a41b36..2692108718 100644 --- a/core/src/main/java/io/cucumber/core/event/Result.java +++ b/core/src/main/java/io/cucumber/core/event/Result.java @@ -1,52 +1,15 @@ package io.cucumber.core.event; -import java.io.PrintWriter; -import java.io.StringWriter; import java.time.Duration; -import java.util.Comparator; import java.util.Objects; -import static java.time.Duration.ZERO; -import static java.util.Locale.ROOT; import static java.util.Objects.requireNonNull; -public final class Result { +public final class Result{ - public static final Comparator SEVERITY = new Comparator() { - - @Override - public int compare(Result a, Result b) { - return a.status == b.status ? 0 : a.status.ordinal() > b.status.ordinal() ? 1 : -1; - } - }; - - private final Type status; + private final Status status; private final Duration duration; private final Throwable error; - public static final Result UNDEFINED = new Result(Result.Type.UNDEFINED, ZERO, null); - public enum Type { - PASSED, - SKIPPED, - PENDING, - UNDEFINED, - AMBIGUOUS, - FAILED, - UNUSED; - - public static Type fromLowerCaseName(String lowerCaseName) { - return valueOf(lowerCaseName.toUpperCase(ROOT)); - } - - public String lowerCaseName() { - return name().toLowerCase(ROOT); - } - - public String firstLetterCapitalizedName() { - return name().substring(0, 1) + name().substring(1).toLowerCase(ROOT); - } - - - } /** * The result of a step or scenario @@ -55,51 +18,24 @@ public String firstLetterCapitalizedName() { * @param duration the duration * @param error the error that caused the failure if any */ - public Result(Result.Type status, Duration duration, Throwable error) { + public Result(Status status, Duration duration, Throwable error) { this.status = requireNonNull(status); this.duration = requireNonNull(duration); this.error = error; } - public Result.Type getStatus() { + public Status getStatus() { return status; } public Duration getDuration() { return duration; } - - public String getErrorMessage() { - return error != null ? getErrorMessage(error) : null; - } public Throwable getError() { return error; } - public boolean is(Result.Type status) { - return this.status == status; - } - - public boolean isOk(boolean isStrict) { - return hasAlwaysOkStatus() || !isStrict && hasOkWhenNotStrictStatus(); - } - - private boolean hasAlwaysOkStatus() { - return is(Result.Type.PASSED) || is(Result.Type.SKIPPED); - } - - private boolean hasOkWhenNotStrictStatus() { - return is(Result.Type.UNDEFINED) || is(Result.Type.PENDING); - } - - private String getErrorMessage(Throwable error) { - StringWriter stringWriter = new StringWriter(); - PrintWriter printWriter = new PrintWriter(stringWriter); - error.printStackTrace(printWriter); - return stringWriter.getBuffer().toString(); - } - @Override public String toString() { return "Result{" + diff --git a/core/src/main/java/io/cucumber/core/event/Status.java b/core/src/main/java/io/cucumber/core/event/Status.java new file mode 100644 index 0000000000..94d6c2432f --- /dev/null +++ b/core/src/main/java/io/cucumber/core/event/Status.java @@ -0,0 +1,28 @@ +package io.cucumber.core.event; + +public enum Status { + PASSED, + SKIPPED, + PENDING, + UNDEFINED, + AMBIGUOUS, + FAILED, + UNUSED; + + public boolean is(Status status) { + return this == status; + } + + public boolean isOk(boolean isStrict) { + return hasAlwaysOkStatus() || !isStrict && hasOkWhenNotStrictStatus(); + } + + private boolean hasAlwaysOkStatus() { + return is(Status.PASSED) || is(Status.SKIPPED); + } + + private boolean hasOkWhenNotStrictStatus() { + return is(Status.UNDEFINED) || is(Status.PENDING); + } + +} diff --git a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index 7f4011aa1e..3214251ef8 100644 --- a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -41,12 +41,16 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.StringWriter; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import static java.util.Locale.ROOT; + public final class HTMLFormatter implements EventListener { private static final Gson gson = new GsonBuilder().setPrettyPrinting().create(); private static final String JS_FORMATTER_VAR = "formatter"; @@ -443,9 +447,9 @@ private Map createMatchMap(PickleStepTestStep testStep) { private Map createResultMap(Result result) { Map resultMap = new HashMap(); - resultMap.put("status", result.getStatus().lowerCaseName()); - if (result.getErrorMessage() != null) { - resultMap.put("error_message", result.getErrorMessage()); + resultMap.put("status", result.getStatus().name().toLowerCase(ROOT)); + if (result.getError() != null) { + resultMap.put("error_message", printStackTrace(result.getError())); } return resultMap; } @@ -477,6 +481,13 @@ private void copyReportFiles() { } } + private static String printStackTrace(Throwable error) { + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + error.printStackTrace(printWriter); + return stringWriter.toString(); + } + private URL toUrl(String fileName) { try { return new URL(htmlReportDir, fileName); diff --git a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java index 1d0ce96426..8061073e9c 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java @@ -4,6 +4,7 @@ import io.cucumber.core.event.HookType; import io.cucumber.core.event.PickleStepTestStep; import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestCase; import io.cucumber.core.event.TestStep; import io.cucumber.core.event.EmbedEvent; @@ -29,6 +30,8 @@ import gherkin.pickles.PickleTable; import gherkin.pickles.PickleTag; +import java.io.PrintWriter; +import java.io.StringWriter; import java.time.Instant; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; @@ -37,6 +40,8 @@ import java.util.List; import java.util.Map; +import static java.util.Locale.ROOT; + public final class JSONFormatter implements EventListener { private String currentFeatureFile; private List> featureMaps = new ArrayList>(); @@ -368,7 +373,7 @@ private Map createMatchMap(TestStep step, Result result) { matchMap.put("arguments", argumentList); } } - if (!result.is(Result.Type.UNDEFINED)) { + if (!result.getStatus().is(Status.UNDEFINED)) { matchMap.put("location", step.getCodeLocation()); } return matchMap; @@ -376,9 +381,9 @@ private Map createMatchMap(TestStep step, Result result) { private Map createResultMap(Result result) { Map resultMap = new HashMap(); - resultMap.put("status", result.getStatus().lowerCaseName()); - if (result.getErrorMessage() != null) { - resultMap.put("error_message", result.getErrorMessage()); + resultMap.put("status", result.getStatus().name().toLowerCase(ROOT)); + if (result.getError() != null) { + resultMap.put("error_message", printStackTrace(result.getError())); } if (!result.getDuration().isZero()) { resultMap.put("duration", result.getDuration().toNanos()); @@ -391,4 +396,11 @@ private String getDateTimeFromTimeStamp(Instant instant) { .withZone(ZoneOffset.UTC); return formatter.format(instant); } + + private static String printStackTrace(Throwable error) { + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + error.printStackTrace(printWriter); + return stringWriter.toString(); + } } diff --git a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java index 6756f99086..3e04cebf76 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java @@ -1,9 +1,10 @@ package io.cucumber.core.plugin; import io.cucumber.core.event.PickleStepTestStep; -import io.cucumber.core.event.Result; import io.cucumber.core.event.EventHandler; import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestCaseFinished; import io.cucumber.core.event.TestCaseStarted; import io.cucumber.core.event.TestRunFinished; @@ -25,6 +26,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import static java.util.Locale.ROOT; import static java.util.concurrent.TimeUnit.SECONDS; import java.io.Closeable; @@ -236,18 +238,19 @@ void addTestCaseElement(Document doc, Element tc, Result result) { StringBuilder sb = new StringBuilder(); addStepAndResultListing(sb); Element child; - if (result.is(Result.Type.FAILED) || result.is(Result.Type.AMBIGUOUS)) { + Status status = result.getStatus(); + if (status.is(Status.FAILED) || status.is(Status.AMBIGUOUS)) { addStackTrace(sb, result); - child = createElementWithMessage(doc, sb, "failure", result.getErrorMessage()); - } else if (result.is(Result.Type.PENDING) || result.is(Result.Type.UNDEFINED)) { + child = createElementWithMessage(doc, sb, "failure", printStackTrace(result.getError())); + } else if (status.is(Status.PENDING) || status.is(Status.UNDEFINED)) { if (strict) { child = createElementWithMessage(doc, sb, "failure", "The scenario has pending or undefined step(s)"); } else { child = createElement(doc, sb, "skipped"); } - } else if (result.is(Result.Type.SKIPPED) && result.getError() != null) { + } else if (status.is(Status.SKIPPED) && result.getError() != null) { addStackTrace(sb, result); - child = createElementWithMessage(doc, sb, "skipped", result.getErrorMessage()); + child = createElementWithMessage(doc, sb, "skipped", printStackTrace(result.getError())); } else { child = createElement(doc, sb, "system-out"); } @@ -275,7 +278,7 @@ private void addStepAndResultListing(StringBuilder sb) { int length = sb.length(); String resultStatus = "not executed"; if (i < results.size()) { - resultStatus = results.get(i).getStatus().lowerCaseName(); + resultStatus = results.get(i).getStatus().name().toLowerCase(ROOT); } sb.append(getKeywordFromSource(steps.get(i).getStepLine())); sb.append(steps.get(i).getStepText()); @@ -293,9 +296,13 @@ private String getKeywordFromSource(int stepLine) { private void addStackTrace(StringBuilder sb, Result failed) { sb.append("\nStackTrace:\n"); - StringWriter sw = new StringWriter(); - failed.getError().printStackTrace(new PrintWriter(sw)); - sb.append(sw.toString()); + sb.append(printStackTrace(failed.getError())); + } + + private String printStackTrace(Throwable error) { + StringWriter stringWriter = new StringWriter(); + error.printStackTrace(new PrintWriter(stringWriter)); + return stringWriter.toString(); } private Element createElementWithMessage(Document doc, StringBuilder sb, String elementType, String message) { diff --git a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java index 0ddb631266..d4953828fe 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java @@ -24,9 +24,13 @@ import gherkin.ast.Tag; import gherkin.pickles.PickleTag; +import java.io.PrintWriter; +import java.io.StringWriter; import java.net.URI; import java.util.List; +import static java.util.Locale.ROOT; + public final class PrettyFormatter implements EventListener, ColorAware { private static final String SCENARIO_INDENT = " "; private static final String STEP_INDENT = " "; @@ -202,7 +206,8 @@ private void printStep(PickleStepTestStep testStep, Result result) { String keyword = getStepKeyword(testStep); String stepText = testStep.getStepText(); String locationPadding = createPaddingToLocation(STEP_INDENT, keyword + stepText); - String formattedStepText = formatStepText(keyword, stepText, formats.get(result.getStatus().lowerCaseName()), formats.get(result.getStatus().lowerCaseName() + "_arg"), testStep.getDefinitionArgument()); + String status = result.getStatus().name().toLowerCase(ROOT); + String formattedStepText = formatStepText(keyword, stepText, formats.get(status), formats.get(status + "_arg"), testStep.getDefinitionArgument()); out.println(STEP_INDENT + formattedStepText + locationPadding + getLocationText(testStep.getCodeLocation())); } @@ -330,7 +335,8 @@ private void printScenarioDefinition(TestCase testCase) { private void printError(Result result) { if (result.getError() != null) { - out.println(" " + formats.get(result.getStatus().lowerCaseName()).text(result.getErrorMessage())); + String name = result.getStatus().name().toLowerCase(ROOT); + out.println(" " + formats.get(name).text(printStackTrace(result.getError()))); } } @@ -360,4 +366,11 @@ private String createPaddingToLocation(String indent, String text) { } return padding.toString(); } + + private static String printStackTrace(Throwable error) { + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + error.printStackTrace(printWriter); + return stringWriter.toString(); + } } diff --git a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java index 99688fb4f8..22cf217abd 100644 --- a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java @@ -1,9 +1,9 @@ package io.cucumber.core.plugin; import io.cucumber.core.event.PickleStepTestStep; -import io.cucumber.core.event.Result; import io.cucumber.core.event.EventHandler; import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestRunFinished; import io.cucumber.core.event.TestStepFinished; import io.cucumber.core.event.WriteEvent; @@ -12,21 +12,21 @@ import java.util.Map; public final class ProgressFormatter implements ConcurrentEventListener, ColorAware { - private static final Map CHARS = new HashMap() {{ - put(Result.Type.PASSED, '.'); - put(Result.Type.UNDEFINED, 'U'); - put(Result.Type.PENDING, 'P'); - put(Result.Type.SKIPPED, '-'); - put(Result.Type.FAILED, 'F'); - put(Result.Type.AMBIGUOUS, 'A'); + private static final Map CHARS = new HashMap() {{ + put(Status.PASSED, '.'); + put(Status.UNDEFINED, 'U'); + put(Status.PENDING, 'P'); + put(Status.SKIPPED, '-'); + put(Status.FAILED, 'F'); + put(Status.AMBIGUOUS, 'A'); }}; - private static final Map ANSI_ESCAPES = new HashMap() {{ - put(Result.Type.PASSED, AnsiEscapes.GREEN); - put(Result.Type.UNDEFINED, AnsiEscapes.YELLOW); - put(Result.Type.PENDING, AnsiEscapes.YELLOW); - put(Result.Type.SKIPPED, AnsiEscapes.CYAN); - put(Result.Type.FAILED, AnsiEscapes.RED); - put(Result.Type.AMBIGUOUS, AnsiEscapes.RED); + private static final Map ANSI_ESCAPES = new HashMap() {{ + put(Status.PASSED, AnsiEscapes.GREEN); + put(Status.UNDEFINED, AnsiEscapes.YELLOW); + put(Status.PENDING, AnsiEscapes.YELLOW); + put(Status.SKIPPED, AnsiEscapes.CYAN); + put(Status.FAILED, AnsiEscapes.RED); + put(Status.AMBIGUOUS, AnsiEscapes.RED); }}; private final NiceAppendable out; @@ -68,7 +68,7 @@ public void setEventPublisher(EventPublisher publisher) { } private void handleTestStepFinished(TestStepFinished event) { - if (event.testStep instanceof PickleStepTestStep || event.result.is(Result.Type.FAILED)) { + if (event.testStep instanceof PickleStepTestStep || event.result.getStatus().is(Status.FAILED)) { if (!monochrome) { ANSI_ESCAPES.get(event.result.getStatus()).appendTo(out); } diff --git a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java index 56ded200e9..6ae0e82497 100644 --- a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java @@ -37,7 +37,7 @@ public void receive(TestRunFinished event) { @Override public void receive(TestCaseFinished event) { - if (!event.result.isOk(isStrict)) { + if (!event.result.getStatus().isOk(isStrict)) { recordTestFailed(event.testCase); } } @@ -49,12 +49,7 @@ private void recordTestFailed(TestCase testCase) { } private Collection getFailedTestCaseLines(String uri) { - Collection failedTestCases = featureAndFailedLinesMapping.get(uri); - if (failedTestCases == null) { - failedTestCases = new ArrayList<>(); - featureAndFailedLinesMapping.put(uri, failedTestCases); - } - return failedTestCases; + return featureAndFailedLinesMapping.computeIfAbsent(uri, k -> new ArrayList<>()); } }; diff --git a/core/src/main/java/io/cucumber/core/plugin/Stats.java b/core/src/main/java/io/cucumber/core/plugin/Stats.java index d35ab3e293..ffe780dfec 100755 --- a/core/src/main/java/io/cucumber/core/plugin/Stats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Stats.java @@ -4,6 +4,7 @@ import io.cucumber.core.event.PickleStepTestStep; import io.cucumber.core.event.EventHandler; import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestCaseFinished; import io.cucumber.core.event.TestRunFinished; import io.cucumber.core.event.TestRunStarted; @@ -18,6 +19,7 @@ import java.util.List; import java.util.Locale; +import static java.util.Locale.ROOT; import static java.util.concurrent.TimeUnit.SECONDS; class Stats implements EventListener, ColorAware, StrictAware { @@ -128,21 +130,21 @@ private void printScenarioCounts(PrintStream out) { private void printSubCounts(PrintStream out, SubCounts subCounts) { boolean addComma = false; - addComma = printSubCount(out, subCounts.failed, Result.Type.FAILED, addComma); - addComma = printSubCount(out, subCounts.ambiguous, Result.Type.AMBIGUOUS, addComma); - addComma = printSubCount(out, subCounts.skipped, Result.Type.SKIPPED, addComma); - addComma = printSubCount(out, subCounts.pending, Result.Type.PENDING, addComma); - addComma = printSubCount(out, subCounts.undefined, Result.Type.UNDEFINED, addComma); - addComma = printSubCount(out, subCounts.passed, Result.Type.PASSED, addComma); + addComma = printSubCount(out, subCounts.failed, Status.FAILED, addComma); + addComma = printSubCount(out, subCounts.ambiguous, Status.AMBIGUOUS, addComma); + addComma = printSubCount(out, subCounts.skipped, Status.SKIPPED, addComma); + addComma = printSubCount(out, subCounts.pending, Status.PENDING, addComma); + addComma = printSubCount(out, subCounts.undefined, Status.UNDEFINED, addComma); + addComma = printSubCount(out, subCounts.passed, Status.PASSED, addComma); } - private boolean printSubCount(PrintStream out, int count, Result.Type type, boolean addComma) { + private boolean printSubCount(PrintStream out, int count, Status type, boolean addComma) { if (count != 0) { if (addComma) { out.print(", "); } - Format format = formats.get(type.lowerCaseName()); - out.print(format.text(count + " " + type.lowerCaseName())); + Format format = formats.get(type.name().toLowerCase(ROOT)); + out.print(format.text(count + " " + type.name().toLowerCase(ROOT))); addComma = true; } return addComma; @@ -155,18 +157,18 @@ private void printDuration(PrintStream out) { } private void printNonZeroResultScenarios(PrintStream out) { - printScenarios(out, failedScenarios, Result.Type.FAILED); - printScenarios(out, ambiguousScenarios, Result.Type.AMBIGUOUS); + printScenarios(out, failedScenarios, Status.FAILED); + printScenarios(out, ambiguousScenarios, Status.AMBIGUOUS); if (strict) { - printScenarios(out, pendingScenarios, Result.Type.PENDING); - printScenarios(out, undefinedScenarios, Result.Type.UNDEFINED); + printScenarios(out, pendingScenarios, Status.PENDING); + printScenarios(out, undefinedScenarios, Status.UNDEFINED); } } - private void printScenarios(PrintStream out, List scenarios, Result.Type type) { - Format format = formats.get(type.lowerCaseName()); + private void printScenarios(PrintStream out, List scenarios, Status type) { + Format format = formats.get(type.name().toLowerCase(ROOT)); if (!scenarios.isEmpty()) { - out.println(format.text(type.firstLetterCapitalizedName() + " scenarios:")); + out.println(format.text(firstLetterCapitalizedName(type) + " scenarios:")); } for (String scenario : scenarios) { String[] parts = scenario.split("#"); @@ -180,7 +182,12 @@ private void printScenarios(PrintStream out, List scenarios, Result.Type } } - void addStep(Result.Type resultStatus) { + public String firstLetterCapitalizedName(Status status) { + String name = status.name(); + return name.substring(0, 1) + name.substring(1).toLowerCase(ROOT); + } + + void addStep(Status resultStatus) { addResultToSubCount(stepSubCounts, resultStatus); } @@ -196,7 +203,7 @@ void setFinishTime(Instant finishTime) { this.totalDuration = Duration.between(startTime, finishTime); } - private void addResultToSubCount(SubCounts subCounts, Result.Type resultStatus) { + private void addResultToSubCount(SubCounts subCounts, Status resultStatus) { switch (resultStatus) { case FAILED: subCounts.failed++; @@ -218,7 +225,7 @@ private void addResultToSubCount(SubCounts subCounts, Result.Type resultStatus) } } - void addScenario(Result.Type resultStatus, String scenarioDesignation) { + void addScenario(Status resultStatus, String scenarioDesignation) { addResultToSubCount(scenarioSubCounts, resultStatus); switch (resultStatus) { case FAILED: diff --git a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java index 656b21dfaf..fcf2ec734e 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java @@ -1,9 +1,10 @@ package io.cucumber.core.plugin; import io.cucumber.core.event.PickleStepTestStep; -import io.cucumber.core.event.Result; import io.cucumber.core.event.EventHandler; import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestCaseFinished; import io.cucumber.core.event.TestCaseStarted; import io.cucumber.core.event.TestRunFinished; @@ -38,6 +39,7 @@ import java.util.List; import static java.time.Duration.ZERO; +import static java.util.Locale.ROOT; public final class TestNGFormatter implements EventListener, StrictAware { @@ -247,23 +249,22 @@ void finish(Document doc, Element element) { Result skipped = null; Result failed = null; for (Result result : results) { - if (result.is(Result.Type.FAILED) || result.is(Result.Type.AMBIGUOUS)) { + if (result.getStatus().is(Status.FAILED) || result.getStatus().is(Status.AMBIGUOUS)) { failed = result; } - if (result.is(Result.Type.UNDEFINED) || result.is(Result.Type.PENDING)) { + if (result.getStatus().is(Status.UNDEFINED) || result.getStatus().is(Status.PENDING)) { skipped = result; } } for (Result result : hooks) { - if (failed == null && result.is(Result.Type.FAILED)) { + if (failed == null && result.getStatus().is(Status.FAILED)) { failed = result; } } if (failed != null) { element.setAttribute("status", "FAIL"); - StringWriter stringWriter = new StringWriter(); - failed.getError().printStackTrace(new PrintWriter(stringWriter)); - Element exception = createException(doc, failed.getError().getClass().getName(), stringBuilder.toString(), stringWriter.toString()); + String stacktrace = printStrackTrace(failed); + Element exception = createException(doc, failed.getError().getClass().getName(), stringBuilder.toString(), stacktrace); element.appendChild(exception); } else if (skipped != null) { if (strict) { @@ -278,6 +279,12 @@ void finish(Document doc, Element element) { } } + private String printStrackTrace(Result failed) { + StringWriter stringWriter = new StringWriter(); + failed.getError().printStackTrace(new PrintWriter(stringWriter)); + return stringWriter.toString(); + } + private String calculateTotalDurationString() { Duration totalDuration = ZERO; for (Result r : results) { @@ -294,7 +301,7 @@ private void addStepAndResultListing(StringBuilder sb) { int length = sb.length(); String resultStatus = "not executed"; if (i < results.size()) { - resultStatus = results.get(i).getStatus().lowerCaseName(); + resultStatus = results.get(i).getStatus().name().toLowerCase(ROOT); } sb.append(getKeywordFromSource(steps.get(i).getStepLine())); sb.append(steps.get(i).getStepText()); diff --git a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index 1a9970cc53..52cc0cb650 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -28,6 +28,8 @@ import java.util.Map; import java.util.TreeMap; +import static java.util.Locale.ROOT; + public final class TimelineFormatter implements ConcurrentEventListener { private static final String[] TEXT_ASSETS = new String[]{ @@ -235,7 +237,7 @@ private String buildTagsValue(final TestCase testCase) { public void end(final TestCaseFinished event) { this.endTime = event.getInstant(); - this.className = event.result.getStatus().lowerCaseName(); + this.className = event.result.getStatus().name().toLowerCase(ROOT); } } diff --git a/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java index f54c9df495..f12363369d 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java @@ -6,6 +6,8 @@ import io.cucumber.core.event.*; +import static java.util.Locale.ROOT; + public class UnusedStepsSummaryPrinter implements ColorAware, EventListener, SummaryPrinter { private EventHandler stepDefinedHandler = new EventHandler() { @@ -30,7 +32,7 @@ public void receive(TestRunFinished event) { return; } - Format format = formats.get(Result.Type.UNUSED.lowerCaseName()); + Format format = formats.get(Status.UNUSED.name().toLowerCase(ROOT)); out.println(format.text(unusedSteps.size() + " Unused steps:")); // Output results when done diff --git a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java index 12b702b056..2eb049ea14 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java @@ -8,6 +8,7 @@ import io.cucumber.core.event.EventPublisher; import io.cucumber.core.event.PickleStepTestStep; import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestRunFinished; import io.cucumber.core.event.TestStepFinished; @@ -59,7 +60,7 @@ public void setEventPublisher(EventPublisher publisher) { } void handleTestStepFinished(TestStepFinished event) { - if (event.testStep instanceof PickleStepTestStep && event.result.is(Result.Type.PASSED)) { + if (event.testStep instanceof PickleStepTestStep && event.result.getStatus().is(Status.PASSED)) { PickleStepTestStep testStep = (PickleStepTestStep) event.testStep; addUsageEntry(event.result, testStep); } diff --git a/core/src/main/java/io/cucumber/core/runner/Scenario.java b/core/src/main/java/io/cucumber/core/runner/Scenario.java index a911073da8..524372b815 100644 --- a/core/src/main/java/io/cucumber/core/runner/Scenario.java +++ b/core/src/main/java/io/cucumber/core/runner/Scenario.java @@ -1,7 +1,8 @@ package io.cucumber.core.runner; -import io.cucumber.core.event.Result; import io.cucumber.core.event.EmbedEvent; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestCase; import io.cucumber.core.event.WriteEvent; import gherkin.pickles.PickleTag; @@ -14,10 +15,11 @@ import java.util.Set; import static java.util.Collections.max; +import static java.util.Comparator.comparing; class Scenario implements io.cucumber.core.api.Scenario { - private final List stepResults = new ArrayList(); + private final List stepResults = new ArrayList<>(); private final EventBus bus; private final TestCase testCase; @@ -26,7 +28,7 @@ class Scenario implements io.cucumber.core.api.Scenario { this.testCase = testCase; } - public void add(Result result) { + void add(Result result) { stepResults.add(result); } @@ -41,17 +43,17 @@ public Collection getSourceTagNames() { } @Override - public Result.Type getStatus() { + public Status getStatus() { if (stepResults.isEmpty()) { - return Result.Type.UNDEFINED; + return Status.UNDEFINED; } - return max(stepResults, Result.SEVERITY).getStatus(); + return max(stepResults, comparing(Result::getStatus)).getStatus(); } @Override public boolean isFailed() { - return getStatus() == Result.Type.FAILED; + return getStatus() == Status.FAILED; } @Override @@ -88,11 +90,11 @@ public Integer getLine() { return testCase.getLine(); } - public Throwable getError() { + Throwable getError() { if (stepResults.isEmpty()) { return null; } - return max(stepResults, Result.SEVERITY).getError(); + return max(stepResults, comparing(Result::getStatus)).getError(); } } diff --git a/core/src/main/java/io/cucumber/core/runner/TestStep.java b/core/src/main/java/io/cucumber/core/runner/TestStep.java index e3241e645d..e686fd7c40 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/TestStep.java @@ -2,6 +2,7 @@ import io.cucumber.core.backend.Pending; import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestCase; import io.cucumber.core.event.TestStepFinished; import io.cucumber.core.event.TestStepStarted; @@ -12,6 +13,8 @@ import java.time.Instant; import java.util.Arrays; +import static java.time.Duration.ZERO; + abstract class TestStep implements io.cucumber.core.event.TestStep { private static final String[] ASSUMPTION_VIOLATED_EXCEPTIONS = { "org.junit.AssumptionViolatedException", @@ -46,7 +49,7 @@ public String getCodeLocation() { boolean run(TestCase testCase, EventBus bus, Scenario scenario, boolean skipSteps) { Instant startTimeMillis = bus.getInstant(); bus.send(new TestStepStarted(startTimeMillis, testCase, this)); - Result.Type status; + Status status; Throwable error = null; try { status = executeStep(scenario, skipSteps); @@ -58,38 +61,38 @@ boolean run(TestCase testCase, EventBus bus, Scenario scenario, boolean skipStep Result result = mapStatusToResult(status, error, Duration.between(startTimeMillis, stopTimeNanos)); scenario.add(result); bus.send(new TestStepFinished(stopTimeNanos, testCase, this, result)); - return !result.is(Result.Type.PASSED); + return !result.getStatus().is(Status.PASSED); } - private Result.Type executeStep(Scenario scenario, boolean skipSteps) throws Throwable { + private Status executeStep(Scenario scenario, boolean skipSteps) throws Throwable { if (!skipSteps) { stepDefinitionMatch.runStep(scenario); - return Result.Type.PASSED; + return Status.PASSED; } else { stepDefinitionMatch.dryRunStep(scenario); - return Result.Type.SKIPPED; + return Status.SKIPPED; } } - private Result.Type mapThrowableToStatus(Throwable t) { + private Status mapThrowableToStatus(Throwable t) { if (t.getClass().isAnnotationPresent(Pending.class)) { - return Result.Type.PENDING; + return Status.PENDING; } if (Arrays.binarySearch(ASSUMPTION_VIOLATED_EXCEPTIONS, t.getClass().getName()) >= 0) { - return Result.Type.SKIPPED; + return Status.SKIPPED; } if (t.getClass() == UndefinedStepDefinitionException.class) { - return Result.Type.UNDEFINED; + return Status.UNDEFINED; } if (t.getClass() == AmbiguousStepDefinitionsException.class) { - return Result.Type.AMBIGUOUS; + return Status.AMBIGUOUS; } - return Result.Type.FAILED; + return Status.FAILED; } - private Result mapStatusToResult(Result.Type status, Throwable error, Duration duration) { - if (status == Result.Type.UNDEFINED) { - return Result.UNDEFINED; + private Result mapStatusToResult(Status status, Throwable error, Duration duration) { + if (status == Status.UNDEFINED) { + return new Result(status, ZERO, null); } return new Result(status, duration, error); } diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index e52485980d..0441d94f28 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -1,32 +1,34 @@ package io.cucumber.core.runtime; import gherkin.events.PickleEvent; -import io.cucumber.core.plugin.ConcurrentEventListener; import io.cucumber.core.event.EventHandler; import io.cucumber.core.event.EventPublisher; import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestCaseFinished; import io.cucumber.core.event.TestRunFinished; import io.cucumber.core.event.TestRunStarted; import io.cucumber.core.event.TestSourceRead; -import io.cucumber.core.plugin.Plugin; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.exception.CompositeCucumberException; import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.feature.CucumberFeature; +import io.cucumber.core.feature.FeatureLoader; import io.cucumber.core.filter.Filters; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.feature.CucumberFeature; -import io.cucumber.core.feature.FeatureLoader; +import io.cucumber.core.logging.Logger; +import io.cucumber.core.logging.LoggerFactory; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.order.PickleOrder; +import io.cucumber.core.plugin.ConcurrentEventListener; +import io.cucumber.core.plugin.Plugin; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.plugin.Plugins; -import io.cucumber.core.logging.Logger; -import io.cucumber.core.logging.LoggerFactory; +import java.time.Clock; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -40,12 +42,10 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import static io.cucumber.core.event.Result.SEVERITY; import static java.util.Collections.emptyList; import static java.util.Collections.max; import static java.util.Collections.min; - -import java.time.Clock; +import static java.util.Comparator.comparing; /** * This is the main entry point for running Cucumber features from the CLI. @@ -98,9 +98,9 @@ public void run() { final List orderedEvents = pickleOrder.orderPickleEvents(filteredEvents); final List limitedEvents = filters.limitPickleEvents(orderedEvents); - final List> executingPickles = new ArrayList<>(); - for(final PickleEvent pickleEvent : limitedEvents) { - executingPickles.add(executor.submit(new Runnable() { + final List> executingPickles = new ArrayList<>(); + for (final PickleEvent pickleEvent : limitedEvents) { + executingPickles.add(executor.submit(new Runnable() { @Override public void run() { runnerSupplier.get().runPickle(pickleEvent); @@ -114,17 +114,17 @@ public void run() { for (Future executingPickle : executingPickles) { try { executingPickle.get(); - } catch (ExecutionException e){ + } catch (ExecutionException e) { log.error("Exception while executing pickle", e); thrown.add(e.getCause()); - } catch (InterruptedException e){ + } catch (InterruptedException e) { executor.shutdownNow(); throw new CucumberException(e); } } - if(thrown.size() == 1){ + if (thrown.size() == 1) { throw new CucumberException(thrown.get(0)); - } else if (thrown.size() > 1){ + } else if (thrown.size() > 1) { throw new CompositeCucumberException(thrown); } @@ -316,10 +316,12 @@ byte exitStatus() { } if (runtimeOptions.isWip()) { - return min(results, SEVERITY).is(Result.Type.PASSED) ? ERRORS : DEFAULT; + Result leastSeverResult = min(results, comparing(Result::getStatus)); + return leastSeverResult.getStatus().is(Status.PASSED) ? ERRORS : DEFAULT; + } else { + Result mostSevereResult = max(results, comparing(Result::getStatus)); + return mostSevereResult.getStatus().isOk(runtimeOptions.isStrict()) ? DEFAULT : ERRORS; } - - return max(results, SEVERITY).isOk(runtimeOptions.isStrict()) ? DEFAULT : ERRORS; } } } diff --git a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java index a8427f134b..c37915d7b0 100755 --- a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.Scanner; +import io.cucumber.core.event.Result; import io.cucumber.core.options.CommandlineOptionsParser; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runner.TestHelper; @@ -29,7 +30,6 @@ import org.mockito.stubbing.Answer; import gherkin.pickles.PickleTag; -import io.cucumber.core.event.Result; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.eventbus.EventBus; diff --git a/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java index db68de5e84..7773a9e71d 100644 --- a/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JUnitFormatterTest.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.Scanner; +import io.cucumber.core.event.Result; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.XMLUnit; import org.junit.AssumptionViolatedException; @@ -27,7 +28,6 @@ import org.mockito.stubbing.Answer; import org.xml.sax.SAXException; -import io.cucumber.core.event.Result; import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.runner.TestHelper; diff --git a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java index 92172eaeb8..1ebd2d2caf 100644 --- a/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/PluginFactoryTest.java @@ -2,6 +2,7 @@ import io.cucumber.core.event.PickleStepTestStep; import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestCase; import io.cucumber.core.event.TestStepFinished; import io.cucumber.core.eventbus.EventBus; @@ -93,7 +94,7 @@ public void plugin_does_not_buffer_its_output() { ProgressFormatter plugin = (ProgressFormatter) fc.create(parse("progress")); EventBus bus = new TimeServiceEventBus(new ClockStub(ZERO)); plugin.setEventPublisher(bus); - Result result = new Result(Result.Type.PASSED, ZERO, null); + Result result = new Result(Status.PASSED, ZERO, null); TestStepFinished event = new TestStepFinished(bus.getInstant(), mock(TestCase.class), mock(PickleStepTestStep.class), result); bus.send(event); diff --git a/core/src/test/java/io/cucumber/core/plugin/StatsTest.java b/core/src/test/java/io/cucumber/core/plugin/StatsTest.java index d93581adc4..c3b2fe85c4 100755 --- a/core/src/test/java/io/cucumber/core/plugin/StatsTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/StatsTest.java @@ -9,13 +9,12 @@ import static org.hamcrest.CoreMatchers.endsWith; import static org.hamcrest.CoreMatchers.startsWith; -import io.cucumber.core.event.Result; - import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.time.Instant; import java.util.Locale; +import io.cucumber.core.event.Status; import org.junit.Test; public class StatsTest { @@ -37,10 +36,10 @@ public void should_only_print_sub_counts_if_not_zero() { Stats counter = createMonochromeSummaryCounter(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - counter.addStep(Result.Type.PASSED); - counter.addStep(Result.Type.PASSED); - counter.addStep(Result.Type.PASSED); - counter.addScenario(Result.Type.PASSED, "scenario designation"); + counter.addStep(Status.PASSED); + counter.addStep(Status.PASSED); + counter.addStep(Status.PASSED); + counter.addScenario(Status.PASSED, "scenario designation"); counter.printStats(new PrintStream(baos)); assertThat(baos.toString(), startsWith(String.format( @@ -53,12 +52,12 @@ public void should_print_sub_counts_in_order_failed_ambiguous_skipped_pending_un Stats counter = createMonochromeSummaryCounter(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - addOneStepScenario(counter, Result.Type.PASSED); - addOneStepScenario(counter, Result.Type.FAILED); - addOneStepScenario(counter, Result.Type.AMBIGUOUS); - addOneStepScenario(counter, Result.Type.PENDING); - addOneStepScenario(counter, Result.Type.UNDEFINED); - addOneStepScenario(counter, Result.Type.SKIPPED); + addOneStepScenario(counter, Status.PASSED); + addOneStepScenario(counter, Status.FAILED); + addOneStepScenario(counter, Status.AMBIGUOUS); + addOneStepScenario(counter, Status.PENDING); + addOneStepScenario(counter, Status.UNDEFINED); + addOneStepScenario(counter, Status.SKIPPED); counter.printStats(new PrintStream(baos)); assertThat(baos.toString(), containsString(String.format("" + @@ -71,12 +70,12 @@ public void should_print_sub_counts_in_order_failed_ambiguous_skipped_undefined_ Stats counter = createColorSummaryCounter(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - addOneStepScenario(counter, Result.Type.PASSED); - addOneStepScenario(counter, Result.Type.FAILED); - addOneStepScenario(counter, Result.Type.AMBIGUOUS); - addOneStepScenario(counter, Result.Type.PENDING); - addOneStepScenario(counter, Result.Type.UNDEFINED); - addOneStepScenario(counter, Result.Type.SKIPPED); + addOneStepScenario(counter, Status.PASSED); + addOneStepScenario(counter, Status.FAILED); + addOneStepScenario(counter, Status.AMBIGUOUS); + addOneStepScenario(counter, Status.PENDING); + addOneStepScenario(counter, Status.UNDEFINED); + addOneStepScenario(counter, Status.SKIPPED); counter.printStats(new PrintStream(baos)); String colorSubCounts = "" + @@ -159,14 +158,14 @@ public void should_print_failed_ambiguous_scenarios() { Stats counter = createMonochromeSummaryCounter(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - counter.addStep(Result.Type.FAILED); - counter.addScenario(Result.Type.FAILED, "path/file.feature:3 # Scenario: scenario_name"); - counter.addStep(Result.Type.AMBIGUOUS); - counter.addScenario(Result.Type.AMBIGUOUS, "path/file.feature:3 # Scenario: scenario_name"); - counter.addStep(Result.Type.UNDEFINED); - counter.addScenario(Result.Type.UNDEFINED, "path/file.feature:3 # Scenario: scenario_name"); - counter.addStep(Result.Type.PENDING); - counter.addScenario(Result.Type.PENDING, "path/file.feature:3 # Scenario: scenario_name"); + counter.addStep(Status.FAILED); + counter.addScenario(Status.FAILED, "path/file.feature:3 # Scenario: scenario_name"); + counter.addStep(Status.AMBIGUOUS); + counter.addScenario(Status.AMBIGUOUS, "path/file.feature:3 # Scenario: scenario_name"); + counter.addStep(Status.UNDEFINED); + counter.addScenario(Status.UNDEFINED, "path/file.feature:3 # Scenario: scenario_name"); + counter.addStep(Status.PENDING); + counter.addScenario(Status.PENDING, "path/file.feature:3 # Scenario: scenario_name"); counter.printStats(new PrintStream(baos)); assertThat(baos.toString(), startsWith(String.format("" + @@ -184,14 +183,14 @@ public void should_print_failed_ambiguous_pending_undefined_scenarios_if_strict( Stats counter = createMonochromeSummaryCounter(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - counter.addStep(Result.Type.FAILED); - counter.addScenario(Result.Type.FAILED, "path/file.feature:3 # Scenario: scenario_name"); - counter.addStep(Result.Type.AMBIGUOUS); - counter.addScenario(Result.Type.AMBIGUOUS, "path/file.feature:3 # Scenario: scenario_name"); - counter.addStep(Result.Type.UNDEFINED); - counter.addScenario(Result.Type.UNDEFINED, "path/file.feature:3 # Scenario: scenario_name"); - counter.addStep(Result.Type.PENDING); - counter.addScenario(Result.Type.PENDING, "path/file.feature:3 # Scenario: scenario_name"); + counter.addStep(Status.FAILED); + counter.addScenario(Status.FAILED, "path/file.feature:3 # Scenario: scenario_name"); + counter.addStep(Status.AMBIGUOUS); + counter.addScenario(Status.AMBIGUOUS, "path/file.feature:3 # Scenario: scenario_name"); + counter.addStep(Status.UNDEFINED); + counter.addScenario(Status.UNDEFINED, "path/file.feature:3 # Scenario: scenario_name"); + counter.addStep(Status.PENDING); + counter.addScenario(Status.PENDING, "path/file.feature:3 # Scenario: scenario_name"); counter.setStrict(true); counter.printStats(new PrintStream(baos)); @@ -211,7 +210,7 @@ public void should_print_failed_ambiguous_pending_undefined_scenarios_if_strict( "4 Scenarios"))); } - private void addOneStepScenario(Stats counter, Result.Type status) { + private void addOneStepScenario(Stats counter, Status status) { counter.addStep(status); counter.addScenario(status, "scenario designation"); } diff --git a/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java index 22537f9708..90cbe6e1ec 100644 --- a/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UsageFormatterTest.java @@ -2,6 +2,7 @@ import io.cucumber.core.event.PickleStepTestStep; import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestCase; import io.cucumber.core.event.TestStep; import io.cucumber.core.event.TestStepFinished; @@ -40,7 +41,7 @@ public void close() throws IOException { public void resultWithFailedStep() { Appendable out = mock(Appendable.class); UsageFormatter usageFormatter = new UsageFormatter(out); - Result result = new Result(Result.Type.FAILED, Duration.ZERO, null); + Result result = new Result(Status.FAILED, Duration.ZERO, null); usageFormatter.handleTestStepFinished(new TestStepFinished(Instant.EPOCH, mock(TestCase.class), mockTestStep(), result)); verifyZeroInteractions(out); } @@ -49,7 +50,7 @@ public void resultWithFailedStep() { public void resultWithSkippedStep() { Appendable out = mock(Appendable.class); UsageFormatter usageFormatter = new UsageFormatter(out); - Result result = new Result(Result.Type.SKIPPED, Duration.ZERO, null); + Result result = new Result(Status.SKIPPED, Duration.ZERO, null); usageFormatter.handleTestStepFinished(new TestStepFinished(Instant.EPOCH, mock(TestCase.class), mockTestStep(), result)); verifyZeroInteractions(out); } @@ -58,7 +59,7 @@ public void resultWithSkippedStep() { public void resultWithPendingStep() { Appendable out = mock(Appendable.class); UsageFormatter usageFormatter = new UsageFormatter(out); - Result result = new Result(Result.Type.PENDING, Duration.ZERO, null); + Result result = new Result(Status.PENDING, Duration.ZERO, null); usageFormatter.handleTestStepFinished(new TestStepFinished(Instant.EPOCH, mock(TestCase.class), mockTestStep(), result)); verifyZeroInteractions(out); } @@ -67,7 +68,7 @@ public void resultWithPendingStep() { public void resultWithAmbiguousStep() { Appendable out = mock(Appendable.class); UsageFormatter usageFormatter = new UsageFormatter(out); - Result result = new Result(Result.Type.AMBIGUOUS, Duration.ZERO, null); + Result result = new Result(Status.AMBIGUOUS, Duration.ZERO, null); usageFormatter.handleTestStepFinished(new TestStepFinished(Instant.EPOCH, mock(TestCase.class), mockTestStep(), result)); verifyZeroInteractions(out); } @@ -76,7 +77,7 @@ public void resultWithAmbiguousStep() { public void resultWithUndefinedStep() { Appendable out = mock(Appendable.class); UsageFormatter usageFormatter = new UsageFormatter(out); - Result result = new Result(Result.Type.AMBIGUOUS, Duration.ZERO, null); + Result result = new Result(Status.AMBIGUOUS, Duration.ZERO, null); usageFormatter.handleTestStepFinished(new TestStepFinished(Instant.EPOCH, mock(TestCase.class), mockTestStep(), result)); verifyZeroInteractions(out); } @@ -86,7 +87,7 @@ public void resultWithPassedStep() { Appendable out = mock(Appendable.class); UsageFormatter usageFormatter = new UsageFormatter(out); TestStep testStep = mockTestStep(); - Result result = new Result(Result.Type.PASSED, Duration.ofNanos(12345L), null); + Result result = new Result(Status.PASSED, Duration.ofNanos(12345L), null); usageFormatter.handleTestStepFinished(new TestStepFinished(Instant.EPOCH, mock(TestCase.class), testStep, result)); @@ -106,10 +107,10 @@ public void resultWithPassedAndFailedStep() { UsageFormatter usageFormatter = new UsageFormatter(out); TestStep testStep = mockTestStep(); - Result passed = new Result(Result.Type.PASSED, Duration.ofSeconds(12345L), null); + Result passed = new Result(Status.PASSED, Duration.ofSeconds(12345L), null); usageFormatter.handleTestStepFinished(new TestStepFinished(Instant.EPOCH, mock(TestCase.class), testStep, passed)); - Result failed = new Result(Result.Type.FAILED, Duration.ZERO, null); + Result failed = new Result(Status.FAILED, Duration.ZERO, null); usageFormatter.handleTestStepFinished(new TestStepFinished(Instant.EPOCH, mock(TestCase.class), testStep, failed)); Map> usageMap = usageFormatter.usageMap; @@ -126,7 +127,7 @@ public void resultWithZeroDuration() { Appendable out = mock(Appendable.class); UsageFormatter usageFormatter = new UsageFormatter(out); TestStep testStep = mockTestStep(); - Result result = new Result(Result.Type.PASSED, Duration.ZERO, null); + Result result = new Result(Status.PASSED, Duration.ZERO, null); usageFormatter.handleTestStepFinished(new TestStepFinished(Instant.EPOCH, mock(TestCase.class), testStep, result)); @@ -145,7 +146,7 @@ public void resultWithNullDuration() { Appendable out = mock(Appendable.class); UsageFormatter usageFormatter = new UsageFormatter(out); PickleStepTestStep testStep = mockTestStep(); - Result result = new Result(Result.Type.PASSED, Duration.ZERO, null); + Result result = new Result(Status.PASSED, Duration.ZERO, null); usageFormatter.handleTestStepFinished(new TestStepFinished(Instant.EPOCH, mock(TestCase.class), testStep, result)); diff --git a/core/src/test/java/io/cucumber/core/runner/EventBusTest.java b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java index 3308d9ec60..ba535a69d8 100644 --- a/core/src/test/java/io/cucumber/core/runner/EventBusTest.java +++ b/core/src/test/java/io/cucumber/core/runner/EventBusTest.java @@ -10,12 +10,13 @@ import java.time.Instant; import java.time.ZoneId; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.runtime.TimeServiceEventBus; import org.junit.Test; import io.cucumber.core.event.EventHandler; import io.cucumber.core.event.PickleStepTestStep; -import io.cucumber.core.event.Result; import io.cucumber.core.event.TestCase; import io.cucumber.core.event.TestStepFinished; import io.cucumber.core.event.TestStepStarted; @@ -27,7 +28,7 @@ public class EventBusTest { public void handlers_receive_the_events_they_registered_for() { EventHandler handler = mock(EventHandler.class); PickleStepTestStep testStep = mock(PickleStepTestStep.class); - Result result = new Result(Result.Type.PASSED, ZERO, null); + Result result = new Result(Status.PASSED, ZERO, null); TestCase testCase = mock(TestCase.class); TestStepFinished event = new TestStepFinished(EPOCH, testCase, testStep, result); diff --git a/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java index 7f8ffd34d9..a11a24f9df 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java @@ -1,7 +1,7 @@ package io.cucumber.core.runner; import io.cucumber.core.event.HookType; -import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestStepFinished; import io.cucumber.core.event.TestStepStarted; import io.cucumber.core.backend.HookDefinition; @@ -67,13 +67,13 @@ public void run_does_dry_run() throws Throwable { public void result_is_passed_when_step_definition_does_not_throw_exception() { boolean skipNextStep = step.run(testCase, bus, scenario, false); assertFalse(skipNextStep); - assertEquals(Result.Type.PASSED, scenario.getStatus()); + assertEquals(Status.PASSED, scenario.getStatus()); } @Test public void result_is_skipped_when_skip_step_is_skip_all_skipable() { boolean skipNextStep = step.run(testCase, bus, scenario, true); assertTrue(skipNextStep); - assertEquals(Result.Type.SKIPPED, scenario.getStatus()); + assertEquals(Status.SKIPPED, scenario.getStatus()); } } diff --git a/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java index ad41834218..a55b0bccf5 100644 --- a/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java @@ -1,6 +1,7 @@ package io.cucumber.core.runner; import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestCaseEvent; import io.cucumber.core.event.TestStepFinished; import io.cucumber.core.event.TestStepStarted; @@ -22,9 +23,9 @@ import static io.cucumber.core.event.HookType.AfterStep; import static io.cucumber.core.event.HookType.BeforeStep; -import static io.cucumber.core.event.Result.Type.FAILED; -import static io.cucumber.core.event.Result.Type.PASSED; -import static io.cucumber.core.event.Result.Type.SKIPPED; +import static io.cucumber.core.event.Status.FAILED; +import static io.cucumber.core.event.Status.PASSED; +import static io.cucumber.core.event.Status.SKIPPED; import static java.time.Duration.ZERO; import static java.time.Duration.ofMillis; import static java.time.Instant.ofEpochMilli; @@ -122,7 +123,7 @@ public void step_execution_is_dry_run_when_before_step_hook_does_not_pass() thro public void result_is_result_from_hook_when_before_step_hook_does_not_pass() throws Throwable { Exception exception = new RuntimeException(); doThrow(exception).when(beforeHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); - Result failure = new Result(Result.Type.FAILED, ZERO, exception); + Result failure = new Result(Status.FAILED, ZERO, exception); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); assertEquals(FAILED, scenario.getStatus()); @@ -136,7 +137,7 @@ public void result_is_result_from_hook_when_before_step_hook_does_not_pass() thr @Test public void result_is_result_from_step_when_step_hook_does_not_pass() throws Throwable { RuntimeException runtimeException = new RuntimeException(); - Result failure = new Result(Result.Type.FAILED, ZERO, runtimeException); + Result failure = new Result(Status.FAILED, ZERO, runtimeException); doThrow(runtimeException).when(definitionMatch).runStep(any(Scenario.class)); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); @@ -151,7 +152,7 @@ public void result_is_result_from_step_when_step_hook_does_not_pass() throws Thr @Test public void result_is_result_from_hook_when_after_step_hook_does_not_pass() throws Throwable { Exception exception = new RuntimeException(); - Result failure = new Result(Result.Type.FAILED, ZERO, exception); + Result failure = new Result(Status.FAILED, ZERO, exception); doThrow(exception).when(afterHookDefinition).execute(any(io.cucumber.core.api.Scenario.class)); boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); @@ -221,7 +222,7 @@ public void result_is_failed_when_step_definition_throws_exception() throws Thro boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); - assertEquals(Result.Type.FAILED, scenario.getStatus()); + assertEquals(Status.FAILED, scenario.getStatus()); } @Test @@ -231,7 +232,7 @@ public void result_is_pending_when_step_definition_throws_pending_exception() th boolean skipNextStep = step.run(testCase, bus, scenario, false); assertTrue(skipNextStep); - assertEquals(Result.Type.PENDING, scenario.getStatus()); + assertEquals(Status.PENDING, scenario.getStatus()); } @Test diff --git a/core/src/test/java/io/cucumber/core/event/ResultTest.java b/core/src/test/java/io/cucumber/core/runner/ResultTest.java similarity index 62% rename from core/src/test/java/io/cucumber/core/event/ResultTest.java rename to core/src/test/java/io/cucumber/core/runner/ResultTest.java index b8bf036fec..73d8219040 100644 --- a/core/src/test/java/io/cucumber/core/event/ResultTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ResultTest.java @@ -1,16 +1,18 @@ -package io.cucumber.core.event; +package io.cucumber.core.runner; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import org.junit.Test; +import java.util.Comparator; import java.util.List; -import static io.cucumber.core.event.Result.SEVERITY; -import static io.cucumber.core.event.Result.Type.AMBIGUOUS; -import static io.cucumber.core.event.Result.Type.FAILED; -import static io.cucumber.core.event.Result.Type.PASSED; -import static io.cucumber.core.event.Result.Type.PENDING; -import static io.cucumber.core.event.Result.Type.SKIPPED; -import static io.cucumber.core.event.Result.Type.UNDEFINED; +import static io.cucumber.core.event.Status.AMBIGUOUS; +import static io.cucumber.core.event.Status.FAILED; +import static io.cucumber.core.event.Status.PASSED; +import static io.cucumber.core.event.Status.PENDING; +import static io.cucumber.core.event.Status.SKIPPED; +import static io.cucumber.core.event.Status.UNDEFINED; import static java.time.Duration.ZERO; import static java.util.Arrays.asList; import static java.util.Collections.sort; @@ -32,7 +34,7 @@ public void severity_from_low_to_high_is_passed_skipped_pending_undefined_ambigu List results = asList(pending, passed, skipped, failed, ambiguous, undefined); - sort(results, SEVERITY); + sort(results, Comparator.comparing(Result::getStatus)); assertThat(results, equalTo(asList(passed, skipped, pending, undefined, ambiguous, failed))); } @@ -41,49 +43,49 @@ public void severity_from_low_to_high_is_passed_skipped_pending_undefined_ambigu public void passed_result_is_always_ok() { Result passedResult = new Result(PASSED, ZERO, null); - assertTrue(passedResult.isOk(isStrict(false))); - assertTrue(passedResult.isOk(isStrict(true))); + assertTrue(passedResult.getStatus().isOk(isStrict(false))); + assertTrue(passedResult.getStatus().isOk(isStrict(true))); } @Test public void skipped_result_is_always_ok() { Result skippedResult = new Result(SKIPPED, ZERO, null); - assertTrue(skippedResult.isOk(isStrict(false))); - assertTrue(skippedResult.isOk(isStrict(true))); + assertTrue(skippedResult.getStatus().isOk(isStrict(false))); + assertTrue(skippedResult.getStatus().isOk(isStrict(true))); } @Test public void failed_result_is_never_ok() { Result failedResult = new Result(FAILED, ZERO, null); - assertFalse(failedResult.isOk(isStrict(false))); - assertFalse(failedResult.isOk(isStrict(true))); + assertFalse(failedResult.getStatus().isOk(isStrict(false))); + assertFalse(failedResult.getStatus().isOk(isStrict(true))); } @Test public void undefined_result_is_only_ok_when_not_strict() { Result undefinedResult = new Result(UNDEFINED, ZERO, null); - assertTrue(undefinedResult.isOk(isStrict(false))); - assertFalse(undefinedResult.isOk(isStrict(true))); + assertTrue(undefinedResult.getStatus().isOk(isStrict(false))); + assertFalse(undefinedResult.getStatus().isOk(isStrict(true))); } @Test public void pending_result_is_only_ok_when_not_strict() { Result pendingResult = new Result(PENDING, ZERO, null); - assertTrue(pendingResult.isOk(isStrict(false))); - assertFalse(pendingResult.isOk(isStrict(true))); + assertTrue(pendingResult.getStatus().isOk(isStrict(false))); + assertFalse(pendingResult.getStatus().isOk(isStrict(true))); } @Test public void is_query_returns_true_for_the_status_of_the_result_object() { int checkCount = 0; - for (Result.Type status : Result.Type.values()) { + for (Status status : Status.values()) { Result result = new Result(status, ZERO, null); - assertTrue(result.is(result.getStatus())); + assertTrue(result.getStatus().is(result.getStatus())); checkCount += 1; } assertTrue("No checks performed", checkCount > 0); @@ -92,11 +94,11 @@ public void is_query_returns_true_for_the_status_of_the_result_object() { @Test public void is_query_returns_false_for_statuses_different_from_the_status_of_the_result_object() { int checkCount = 0; - for (Result.Type resultStatus : Result.Type.values()) { + for (Status resultStatus : Status.values()) { Result result = new Result(resultStatus, ZERO, null); - for (Result.Type status : Result.Type.values()) { + for (Status status : Status.values()) { if (status != resultStatus) { - assertFalse(result.is(status)); + assertFalse(result.getStatus().is(status)); checkCount += 1; } } diff --git a/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java index 27d2c79d96..ed5a275b78 100644 --- a/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java @@ -1,7 +1,8 @@ package io.cucumber.core.runner; -import io.cucumber.core.event.Result; import io.cucumber.core.event.EmbedEvent; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.WriteEvent; import gherkin.events.PickleEvent; import io.cucumber.core.eventbus.EventBus; @@ -37,50 +38,50 @@ public class ScenarioResultTest { @Test public void no_steps_is_undefined() { - assertEquals(Result.Type.UNDEFINED, s.getStatus()); + assertEquals(Status.UNDEFINED, s.getStatus()); } @Test public void one_passed_step_is_passed() { - s.add(new Result(Result.Type.PASSED, ZERO, null)); - assertEquals(Result.Type.PASSED, s.getStatus()); + s.add(new Result(Status.PASSED, ZERO, null)); + assertEquals(Status.PASSED, s.getStatus()); } @Test public void passed_failed_pending_undefined_skipped_is_failed() { - s.add(new Result(Result.Type.PASSED, ZERO, null)); - s.add(new Result(Result.Type.FAILED, ZERO, null)); - s.add(new Result(Result.Type.PENDING, ZERO, null)); - s.add(new Result(Result.Type.UNDEFINED, ZERO, null)); - s.add(new Result(Result.Type.SKIPPED, ZERO, null)); - assertEquals(Result.Type.FAILED, s.getStatus()); + s.add(new Result(Status.PASSED, ZERO, null)); + s.add(new Result(Status.FAILED, ZERO, null)); + s.add(new Result(Status.PENDING, ZERO, null)); + s.add(new Result(Status.UNDEFINED, ZERO, null)); + s.add(new Result(Status.SKIPPED, ZERO, null)); + assertEquals(Status.FAILED, s.getStatus()); assertTrue(s.isFailed()); } @Test public void passed_and_skipped_is_skipped_although_we_cant_have_skipped_without_undefined_or_pending() { - s.add(new Result(Result.Type.PASSED, ZERO, null)); - s.add(new Result(Result.Type.SKIPPED, ZERO, null)); - assertEquals(Result.Type.SKIPPED, s.getStatus()); + s.add(new Result(Status.PASSED, ZERO, null)); + s.add(new Result(Status.SKIPPED, ZERO, null)); + assertEquals(Status.SKIPPED, s.getStatus()); assertFalse(s.isFailed()); } @Test public void passed_pending_undefined_skipped_is_pending() { - s.add(new Result(Result.Type.PASSED, ZERO, null)); - s.add(new Result(Result.Type.UNDEFINED, ZERO, null)); - s.add(new Result(Result.Type.PENDING, ZERO, null)); - s.add(new Result(Result.Type.SKIPPED, ZERO, null)); - assertEquals(Result.Type.UNDEFINED, s.getStatus()); + s.add(new Result(Status.PASSED, ZERO, null)); + s.add(new Result(Status.UNDEFINED, ZERO, null)); + s.add(new Result(Status.PENDING, ZERO, null)); + s.add(new Result(Status.SKIPPED, ZERO, null)); + assertEquals(Status.UNDEFINED, s.getStatus()); assertFalse(s.isFailed()); } @Test public void passed_undefined_skipped_is_undefined() { - s.add(new Result(Result.Type.PASSED, ZERO, null)); - s.add(new Result(Result.Type.UNDEFINED, ZERO, null)); - s.add(new Result(Result.Type.SKIPPED, ZERO, null)); - assertEquals(Result.Type.UNDEFINED, s.getStatus()); + s.add(new Result(Status.PASSED, ZERO, null)); + s.add(new Result(Status.UNDEFINED, ZERO, null)); + s.add(new Result(Status.SKIPPED, ZERO, null)); + assertEquals(Status.UNDEFINED, s.getStatus()); assertFalse(s.isFailed()); } @@ -102,8 +103,8 @@ public void failed_followed_by_pending_yields_failed_error() { Throwable failedError = mock(Throwable.class); Throwable pendingError = mock(Throwable.class); - s.add(new Result(Result.Type.FAILED, ZERO, failedError)); - s.add(new Result(Result.Type.PENDING, ZERO, pendingError)); + s.add(new Result(Status.FAILED, ZERO, failedError)); + s.add(new Result(Status.PENDING, ZERO, pendingError)); assertThat(s.getError(), sameInstance(failedError)); } @@ -113,8 +114,8 @@ public void pending_followed_by_failed_yields_failed_error() { Throwable pendingError = mock(Throwable.class); Throwable failedError = mock(Throwable.class); - s.add(new Result(Result.Type.PENDING, ZERO, pendingError)); - s.add(new Result(Result.Type.FAILED, ZERO, failedError)); + s.add(new Result(Status.PENDING, ZERO, pendingError)); + s.add(new Result(Status.FAILED, ZERO, failedError)); assertThat(s.getError(), sameInstance(failedError)); } diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index 581563ec35..2ee8ce7e85 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -1,7 +1,8 @@ package io.cucumber.core.runner; -import io.cucumber.core.plugin.Plugin; import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; +import io.cucumber.core.plugin.Plugin; import io.cucumber.core.api.Scenario; import io.cucumber.core.plugin.ConcurrentEventListener; import io.cucumber.core.plugin.EventListener; @@ -49,13 +50,14 @@ import java.util.List; import java.util.Map; -import static io.cucumber.core.event.Result.Type.FAILED; -import static io.cucumber.core.event.Result.Type.PASSED; -import static io.cucumber.core.event.Result.Type.PENDING; -import static io.cucumber.core.event.Result.Type.SKIPPED; -import static io.cucumber.core.event.Result.Type.UNDEFINED; +import static io.cucumber.core.event.Status.FAILED; +import static io.cucumber.core.event.Status.PASSED; +import static io.cucumber.core.event.Status.PENDING; +import static io.cucumber.core.event.Status.SKIPPED; +import static io.cucumber.core.event.Status.UNDEFINED; import static java.time.Duration.ZERO; import static java.util.Locale.ENGLISH; +import static java.util.Locale.ROOT; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; @@ -71,9 +73,9 @@ public enum TimeServiceType { } private List features = Collections.emptyList(); - private Map stepsToResult = Collections.emptyMap(); + private Map stepsToResult = Collections.emptyMap(); private Map stepsToLocation = Collections.emptyMap(); - private List> hooks = Collections.emptyList(); + private List> hooks = Collections.emptyList(); private List hookLocations = Collections.emptyList(); private List> hookActions = Collections.emptyList(); private TimeServiceType timeServiceType = TimeServiceType.FIXED_INCREMENT_ON_STEP_START; @@ -87,24 +89,24 @@ private TestHelper() { public static final class TestHelperBackendSupplier extends TestBackendSupplier { private final List features; - private final Map stepsToResult; + private final Map stepsToResult; private final Map stepsToLocation; - private final List> hooks; + private final List> hooks; private final List hookLocations; private final List> hookActions; public TestHelperBackendSupplier(ResourceLoader resourceLoader, TypeRegistry typeRegistry) { this( - Collections.emptyList(), - Collections.emptyMap(), - Collections.emptyMap(), - Collections.>emptyList(), - Collections.emptyList(), - Collections.>emptyList() + Collections.emptyList(), + Collections.emptyMap(), + Collections.emptyMap(), + Collections.emptyList(), + Collections.emptyList(), + Collections.emptyList() ); } - public TestHelperBackendSupplier(List features, Map stepsToResult, Map stepsToLocation, List> hooks, List hookLocations, List> hookActions) { + public TestHelperBackendSupplier(List features, Map stepsToResult, Map stepsToLocation, List> hooks, List hookLocations, List> hookActions) { this.features = features; this.stepsToResult = stepsToResult; this.stepsToLocation = stepsToLocation; @@ -116,11 +118,11 @@ public TestHelperBackendSupplier(List features, Map features) { this( features, - Collections.emptyMap(), - Collections.emptyMap(), - Collections.>emptyList(), - Collections.emptyList(), - Collections.>emptyList() + Collections.emptyMap(), + Collections.emptyMap(), + Collections.emptyList(), + Collections.emptyList(), + Collections.emptyList() ); } @@ -136,7 +138,7 @@ public void loadGlue(Glue glue, List gluePaths) { } private static void mockSteps(Glue glue, List features, - Map stepsToResult, + Map stepsToResult, final Map stepsToLocation) { Compiler compiler = new Compiler(); TypeRegistry typeRegistry = new TypeRegistry(ENGLISH); @@ -153,8 +155,8 @@ private static void mockSteps(Glue glue, List features, } for (final PickleStep step : steps) { - final Result stepResult = getResultWithDefaultPassed(stepsToResult, step.getText()); - if (stepResult.is(UNDEFINED)) { + final io.cucumber.core.event.Result stepResult = getResultWithDefaultPassed(stepsToResult, step.getText()); + if (stepResult.getStatus().is(UNDEFINED)) { continue; } @@ -164,13 +166,13 @@ private static void mockSteps(Glue glue, List features, @Override public void execute(Object[] args) throws Throwable { super.execute(args); - if (stepResult.is(PENDING)) { + if (stepResult.getStatus().is(PENDING)) { throw new TestPendingException(); - } else if (stepResult.is(FAILED)) { + } else if (stepResult.getStatus().is(FAILED)) { throw stepResult.getError(); - } else if (stepResult.is(SKIPPED) && (stepResult.getError() != null)) { + } else if (stepResult.getStatus().is(SKIPPED) && (stepResult.getError() != null)) { throw stepResult.getError(); - } else if (!stepResult.is(PASSED) && !stepResult.is(SKIPPED)) { + } else if (!stepResult.getStatus().is(PASSED) && !stepResult.getStatus().is(SKIPPED)) { fail("Cannot mock step to the result: " + stepResult.getStatus()); } } @@ -186,7 +188,7 @@ public String getLocation(boolean detail) { } - private static Result getResultWithDefaultPassed(Map stepsToResult, String step) { + private static io.cucumber.core.event.Result getResultWithDefaultPassed(Map stepsToResult, String step) { return stepsToResult.containsKey(step) ? stepsToResult.get(step) : new Result(PASSED, ZERO, null); } @@ -215,7 +217,7 @@ private static Type[] mapArgumentToTypes(PickleStep step) { return types; } - private static void mockHooks(Glue glue, final List> hooks, + private static void mockHooks(Glue glue, final List> hooks, final List hookLocations, final List> hookActions) throws Throwable { List beforeHooks = new ArrayList<>(); @@ -241,7 +243,7 @@ private static void mockHooks(Glue glue, final List> } } - private static void mockHook(final SimpleEntry hookEntry, + private static void mockHook(final SimpleEntry hookEntry, final String hookLocation, final Answer action, final List beforeHooks, @@ -256,9 +258,9 @@ private static void mockHook(final SimpleEntry hookEntry, if (action != null) { doAnswer(action).when(hook).execute((Scenario) any()); } - if (hookEntry.getValue().is(FAILED)) { + if (hookEntry.getValue().getStatus().is(FAILED)) { doThrow(hookEntry.getValue().getError()).when(hook).execute((Scenario) any()); - } else if (hookEntry.getValue().is(PENDING)) { + } else if (hookEntry.getValue().getStatus().is(PENDING)) { doThrow(new TestPendingException()).when(hook).execute((io.cucumber.core.api.Scenario) any()); } if ("before".equals(hookEntry.getKey())) { @@ -354,7 +356,7 @@ public Builder withFeatures(List features) { return this; } - public Builder withStepsToResult(Map stepsToResult) { + public Builder withStepsToResult(Map stepsToResult) { this.instance.stepsToResult = stepsToResult; return this; } @@ -364,7 +366,7 @@ public Builder withStepsToLocation(Map stepsToLocation) { return this; } - public Builder withHooks(List> hooks) { + public Builder withHooks(List> hooks) { this.instance.hooks = hooks; return this; } @@ -454,15 +456,19 @@ public InputStream getInputStream() { }); } - public static Result result(String status) { - return result(Result.Type.fromLowerCaseName(status)); + public static io.cucumber.core.event.Result result(String status) { + return result(fromLowerCaseName(status)); + } + + public static io.cucumber.core.event.Result result(String status, Throwable error) { + return result(fromLowerCaseName(status), error); } - public static Result result(String status, Throwable error) { - return result(Result.Type.fromLowerCaseName(status), error); + private static Status fromLowerCaseName(String lowerCaseName) { + return Status.valueOf(lowerCaseName.toUpperCase(ROOT)); } - public static Result result(Result.Type status) { + public static io.cucumber.core.event.Result result(Status status) { switch (status) { case FAILED: return result(status, mockAssertionFailedError()); @@ -475,7 +481,7 @@ public static Result result(Result.Type status) { } } - public static Result result(Result.Type status, Throwable error) { + public static io.cucumber.core.event.Result result(Status status, Throwable error) { return new Result(status, Duration.ZERO, error); } @@ -514,6 +520,7 @@ public Object answer(InvocationOnMock invocation) { }; doAnswer(printStackTraceHandler).when(error).printStackTrace((PrintWriter) any()); when(error.getStackTrace()).thenReturn(new StackTraceElement[0]); + when(error.getMessage()).thenReturn("the message"); return error; } @@ -528,10 +535,11 @@ public Object answer(InvocationOnMock invocation) { } }; doAnswer(printStackTraceHandler).when(exception).printStackTrace((PrintWriter) any()); + when(exception.getMessage()).thenReturn("the message"); return exception; } - public static SimpleEntry hookEntry(String type, Result result) { + public static SimpleEntry hookEntry(String type, io.cucumber.core.event.Result result) { return new SimpleEntry<>(type, result); } diff --git a/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java index ab6a9094d3..bdb0ce85c9 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ExitStatusTest.java @@ -2,6 +2,7 @@ import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestCase; import io.cucumber.core.event.TestCaseFinished; import io.cucumber.core.eventbus.EventBus; @@ -25,7 +26,7 @@ public class ExitStatusTest { @Test public void non_strict_wip_with_ambiguous_scenarios() { createNonStrictWipExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.AMBIGUOUS)); + bus.send(testCaseFinishedWithStatus(Status.AMBIGUOUS)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -34,7 +35,7 @@ private void createNonStrictWipExitStatus() { createExitStatus("-g", "anything", "--wip"); } - private TestCaseFinished testCaseFinishedWithStatus(Result.Type resultStatus) { + private TestCaseFinished testCaseFinishedWithStatus(Status resultStatus) { return new TestCaseFinished(ANY_INSTANT, mock(TestCase.class), new Result(resultStatus, ZERO, null)); } @@ -50,7 +51,7 @@ private void createExitStatus(String... runtimeArgs) { @Test public void non_strict_wip_with_failed_scenarios() { createNonStrictWipExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -58,7 +59,7 @@ public void non_strict_wip_with_failed_scenarios() { @Test public void non_strict_wip_with_passed_scenarios() { createNonStrictWipExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.PASSED)); + bus.send(testCaseFinishedWithStatus(Status.PASSED)); assertEquals(0x1, exitStatus.exitStatus()); } @@ -66,7 +67,7 @@ public void non_strict_wip_with_passed_scenarios() { @Test public void non_strict_wip_with_pending_scenarios() { createNonStrictWipExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.PENDING)); + bus.send(testCaseFinishedWithStatus(Status.PENDING)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -74,7 +75,7 @@ public void non_strict_wip_with_pending_scenarios() { @Test public void non_strict_wip_with_skipped_scenarios() { createNonStrictWipExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.SKIPPED)); + bus.send(testCaseFinishedWithStatus(Status.SKIPPED)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -82,14 +83,14 @@ public void non_strict_wip_with_skipped_scenarios() { @Test public void non_strict_wip_with_undefined_scenarios() { createNonStrictWipExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.UNDEFINED)); + bus.send(testCaseFinishedWithStatus(Status.UNDEFINED)); assertEquals(0x0, exitStatus.exitStatus()); } @Test public void non_strict_with_ambiguous_scenarios() { createNonStrictExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.AMBIGUOUS)); + bus.send(testCaseFinishedWithStatus(Status.AMBIGUOUS)); assertEquals(0x1, exitStatus.exitStatus()); } @@ -101,7 +102,7 @@ private void createNonStrictExitStatus() { @Test public void non_strict_with_failed_scenarios() { createNonStrictExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); assertEquals(0x1, exitStatus.exitStatus()); } @@ -109,7 +110,7 @@ public void non_strict_with_failed_scenarios() { @Test public void non_strict_with_passed_scenarios() { createNonStrictExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.PASSED)); + bus.send(testCaseFinishedWithStatus(Status.PASSED)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -117,7 +118,7 @@ public void non_strict_with_passed_scenarios() { @Test public void non_strict_with_pending_scenarios() { createNonStrictExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.PENDING)); + bus.send(testCaseFinishedWithStatus(Status.PENDING)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -125,7 +126,7 @@ public void non_strict_with_pending_scenarios() { @Test public void non_strict_with_skipped_scenarios() { createNonStrictExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.SKIPPED)); + bus.send(testCaseFinishedWithStatus(Status.SKIPPED)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -133,7 +134,7 @@ public void non_strict_with_skipped_scenarios() { @Test public void non_strict_with_undefined_scenarios() { createNonStrictExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.UNDEFINED)); + bus.send(testCaseFinishedWithStatus(Status.UNDEFINED)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -146,7 +147,7 @@ public void should_pass_if_no_features_are_found() { @Test public void strict_wip_with_ambiguous_scenarios() { createStrictWipRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.AMBIGUOUS)); + bus.send(testCaseFinishedWithStatus(Status.AMBIGUOUS)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -158,8 +159,8 @@ private void createStrictWipRuntime() { @Test public void strict_wip_with_failed_failed_scenarios() { createStrictWipRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -167,8 +168,8 @@ public void strict_wip_with_failed_failed_scenarios() { @Test public void strict_wip_with_failed_passed_scenarios() { createStrictWipRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.PASSED)); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.PASSED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); assertEquals(0x1, exitStatus.exitStatus()); } @@ -176,7 +177,7 @@ public void strict_wip_with_failed_passed_scenarios() { @Test public void strict_wip_with_failed_scenarios() { createStrictWipRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -184,8 +185,8 @@ public void strict_wip_with_failed_scenarios() { @Test public void strict_wip_with_passed_failed_scenarios() { createStrictWipRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.PASSED)); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.PASSED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); assertEquals(0x1, exitStatus.exitStatus()); } @@ -193,7 +194,7 @@ public void strict_wip_with_passed_failed_scenarios() { @Test public void strict_wip_with_passed_scenarios() { createStrictWipRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.PASSED)); + bus.send(testCaseFinishedWithStatus(Status.PASSED)); assertEquals(0x1, exitStatus.exitStatus()); } @@ -201,7 +202,7 @@ public void strict_wip_with_passed_scenarios() { @Test public void strict_wip_with_pending_scenarios() { createStrictWipRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.PENDING)); + bus.send(testCaseFinishedWithStatus(Status.PENDING)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -209,7 +210,7 @@ public void strict_wip_with_pending_scenarios() { @Test public void strict_wip_with_skipped_scenarios() { createNonStrictWipExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.SKIPPED)); + bus.send(testCaseFinishedWithStatus(Status.SKIPPED)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -217,14 +218,14 @@ public void strict_wip_with_skipped_scenarios() { @Test public void strict_wip_with_undefined_scenarios() { createStrictWipRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.UNDEFINED)); + bus.send(testCaseFinishedWithStatus(Status.UNDEFINED)); assertEquals(0x0, exitStatus.exitStatus()); } @Test public void strict_with_ambiguous_scenarios() { createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.AMBIGUOUS)); + bus.send(testCaseFinishedWithStatus(Status.AMBIGUOUS)); assertEquals(0x1, exitStatus.exitStatus()); } @@ -236,8 +237,8 @@ private void createStrictRuntime() { @Test public void strict_with_failed_failed_scenarios() { createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); assertEquals(0x1, exitStatus.exitStatus()); } @@ -245,8 +246,8 @@ public void strict_with_failed_failed_scenarios() { @Test public void strict_with_failed_passed_scenarios() { createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); - bus.send(testCaseFinishedWithStatus(Result.Type.PASSED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.PASSED)); assertEquals(0x1, exitStatus.exitStatus()); } @@ -254,7 +255,7 @@ public void strict_with_failed_passed_scenarios() { @Test public void strict_with_failed_scenarios() { createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); assertEquals(0x1, exitStatus.exitStatus()); } @@ -262,8 +263,8 @@ public void strict_with_failed_scenarios() { @Test public void strict_with_passed_failed_scenarios() { createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.PASSED)); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.PASSED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); assertEquals(0x1, exitStatus.exitStatus()); } @@ -271,8 +272,8 @@ public void strict_with_passed_failed_scenarios() { @Test public void strict_with_passed_passed_scenarios() { createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.PASSED)); - bus.send(testCaseFinishedWithStatus(Result.Type.PASSED)); + bus.send(testCaseFinishedWithStatus(Status.PASSED)); + bus.send(testCaseFinishedWithStatus(Status.PASSED)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -280,7 +281,7 @@ public void strict_with_passed_passed_scenarios() { @Test public void strict_with_passed_scenarios() { createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.PASSED)); + bus.send(testCaseFinishedWithStatus(Status.PASSED)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -288,7 +289,7 @@ public void strict_with_passed_scenarios() { @Test public void strict_with_pending_scenarios() { createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.PENDING)); + bus.send(testCaseFinishedWithStatus(Status.PENDING)); assertEquals(0x1, exitStatus.exitStatus()); } @@ -296,7 +297,7 @@ public void strict_with_pending_scenarios() { @Test public void strict_with_skipped_scenarios() { createNonStrictExitStatus(); - bus.send(testCaseFinishedWithStatus(Result.Type.SKIPPED)); + bus.send(testCaseFinishedWithStatus(Status.SKIPPED)); assertEquals(0x0, exitStatus.exitStatus()); } @@ -304,7 +305,7 @@ public void strict_with_skipped_scenarios() { @Test public void strict_with_undefined_scenarios() { createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.UNDEFINED)); + bus.send(testCaseFinishedWithStatus(Status.UNDEFINED)); assertEquals(0x1, exitStatus.exitStatus()); } diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index d0ca3b15f1..3eb94ddde5 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -5,12 +5,13 @@ import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.plugin.ConcurrentEventListener; import io.cucumber.core.event.EventHandler; import io.cucumber.core.plugin.EventListener; import io.cucumber.core.event.EventPublisher; import io.cucumber.core.event.HookType; -import io.cucumber.core.event.Result; import io.cucumber.core.event.StepDefinedEvent; import io.cucumber.core.event.TestCase; import io.cucumber.core.event.TestCaseFinished; @@ -164,7 +165,7 @@ public void loadGlue(Glue glue, List gluePaths) { @Test public void strict_with_passed_scenarios() { Runtime runtime = createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.PASSED)); + bus.send(testCaseFinishedWithStatus(Status.PASSED)); assertEquals(0x0, runtime.exitStatus()); } @@ -172,7 +173,7 @@ public void strict_with_passed_scenarios() { @Test public void non_strict_with_passed_scenarios() { Runtime runtime = createNonStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.PASSED)); + bus.send(testCaseFinishedWithStatus(Status.PASSED)); assertEquals(0x0, runtime.exitStatus()); } @@ -180,21 +181,21 @@ public void non_strict_with_passed_scenarios() { @Test public void non_strict_with_undefined_scenarios() { Runtime runtime = createNonStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.UNDEFINED)); + bus.send(testCaseFinishedWithStatus(Status.UNDEFINED)); assertEquals(0x0, runtime.exitStatus()); } @Test public void strict_with_undefined_scenarios() { Runtime runtime = createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.UNDEFINED)); + bus.send(testCaseFinishedWithStatus(Status.UNDEFINED)); assertEquals(0x1, runtime.exitStatus()); } @Test public void strict_with_pending_scenarios() { Runtime runtime = createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.PENDING)); + bus.send(testCaseFinishedWithStatus(Status.PENDING)); assertEquals(0x1, runtime.exitStatus()); } @@ -202,7 +203,7 @@ public void strict_with_pending_scenarios() { @Test public void non_strict_with_pending_scenarios() { Runtime runtime = createNonStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.PENDING)); + bus.send(testCaseFinishedWithStatus(Status.PENDING)); assertEquals(0x0, runtime.exitStatus()); } @@ -210,7 +211,7 @@ public void non_strict_with_pending_scenarios() { @Test public void non_strict_with_skipped_scenarios() { Runtime runtime = createNonStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.SKIPPED)); + bus.send(testCaseFinishedWithStatus(Status.SKIPPED)); assertEquals(0x0, runtime.exitStatus()); } @@ -218,7 +219,7 @@ public void non_strict_with_skipped_scenarios() { @Test public void strict_with_skipped_scenarios() { Runtime runtime = createNonStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.SKIPPED)); + bus.send(testCaseFinishedWithStatus(Status.SKIPPED)); assertEquals(0x0, runtime.exitStatus()); } @@ -226,7 +227,7 @@ public void strict_with_skipped_scenarios() { @Test public void non_strict_with_failed_scenarios() { Runtime runtime = createNonStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); assertEquals(0x1, runtime.exitStatus()); } @@ -234,7 +235,7 @@ public void non_strict_with_failed_scenarios() { @Test public void strict_with_failed_scenarios() { Runtime runtime = createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.FAILED)); + bus.send(testCaseFinishedWithStatus(Status.FAILED)); assertEquals(0x1, runtime.exitStatus()); } @@ -242,7 +243,7 @@ public void strict_with_failed_scenarios() { @Test public void non_strict_with_ambiguous_scenarios() { Runtime runtime = createNonStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.AMBIGUOUS)); + bus.send(testCaseFinishedWithStatus(Status.AMBIGUOUS)); assertEquals(0x1, runtime.exitStatus()); } @@ -250,7 +251,7 @@ public void non_strict_with_ambiguous_scenarios() { @Test public void strict_with_ambiguous_scenarios() { Runtime runtime = createStrictRuntime(); - bus.send(testCaseFinishedWithStatus(Result.Type.AMBIGUOUS)); + bus.send(testCaseFinishedWithStatus(Status.AMBIGUOUS)); assertEquals(0x1, runtime.exitStatus()); } @@ -739,7 +740,7 @@ private void mockHook(Glue glue, HookDefinition hook, HookType hookType) { } } - private TestCaseFinished testCaseFinishedWithStatus(Result.Type resultStatus) { + private TestCaseFinished testCaseFinishedWithStatus(Status resultStatus) { return new TestCaseFinished(ANY_INSTANT, mock(TestCase.class), new Result(resultStatus, ZERO, null)); } diff --git a/junit/src/main/java/io/cucumber/junit/JUnitReporter.java b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java index 69b0fd143c..023cf0ee5d 100644 --- a/junit/src/main/java/io/cucumber/junit/JUnitReporter.java +++ b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java @@ -1,8 +1,8 @@ package io.cucumber.junit; -import io.cucumber.core.event.Result; import io.cucumber.core.event.PickleStepTestStep; import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.Result; import io.cucumber.core.event.TestCaseFinished; import io.cucumber.core.event.TestCaseStarted; import io.cucumber.core.event.TestStepFinished; diff --git a/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java index f197ac110d..754b459998 100644 --- a/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java +++ b/junit/src/test/java/io/cucumber/junit/JUnitReporterTest.java @@ -1,7 +1,8 @@ package io.cucumber.junit; -import io.cucumber.core.event.Result; import io.cucumber.core.event.PickleStepTestStep; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.eventbus.EventBus; import io.cucumber.junit.JUnitReporter.EachTestNotifier; import io.cucumber.junit.JUnitReporter.NoTestNotifier; @@ -79,7 +80,7 @@ public void test_step_finished_fires_only_test_finished_for_passed_step() { createDefaultRunNotifier(); Description description = mock(Description.class); setUpStepNotifierAndStepErrors(description); - Result result = mockResult(Result.Type.PASSED); + Result result = mockResult(Status.PASSED); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -92,7 +93,7 @@ public void test_step_finished_fires_assumption_failed_and_test_finished_for_ski createDefaultRunNotifier(); Description description = mock(Description.class); setUpStepNotifierAndStepErrors(description); - Result result = mockResult(Result.Type.SKIPPED); + Result result = mockResult(Status.SKIPPED); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -113,7 +114,7 @@ public void test_step_finished_fires_assumption_failed_and_test_finished_for_ski Description description = mock(Description.class); setUpStepNotifierAndStepErrors(description); Throwable exception = new AssumptionViolatedException("Oops"); - Result result = mockResult(Result.Type.SKIPPED, exception); + Result result = mockResult(Status.SKIPPED, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -131,7 +132,7 @@ public void test_step_finished_adds_no_step_exeption_for_skipped_step_without_ex createNonStrictReporter(); createDefaultRunNotifier(); setUpNoStepNotifierAndStepErrors(); - Result result = mockResult(Result.Type.SKIPPED); + Result result = mockResult(Status.SKIPPED); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -144,7 +145,7 @@ public void test_step_finished_adds_the_step_exeption_for_skipped_step_with_assu createDefaultRunNotifier(); setUpNoStepNotifierAndStepErrors(); Throwable exception = new AssumptionViolatedException("Oops"); - Result result = mockResult(Result.Type.SKIPPED, exception); + Result result = mockResult(Status.SKIPPED, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -158,7 +159,7 @@ public void test_step_finished_fires_assumption_failed_and_test_finished_for_pen Description description = mock(Description.class); setUpStepNotifierAndStepErrors(description); Throwable exception = new TestPendingException(); - Result result = mockResult(Result.Type.PENDING, exception); + Result result = mockResult(Status.PENDING, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -178,7 +179,7 @@ public void test_step_finished_fires_assumption_failed_and_test_finished_for_pen Description description = mock(Description.class); setUpStepNotifierAndStepErrors(description); Throwable exception = new TestPendingException(); - Result result = mockResult(Result.Type.PENDING, exception); + Result result = mockResult(Status.PENDING, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -197,7 +198,7 @@ public void test_step_finished_adds_the_step_exeption_for_pending_steps() { createDefaultRunNotifier(); setUpNoStepNotifierAndStepErrors(); Throwable exception = new TestPendingException(); - Result result = mockResult(Result.Type.PENDING, exception); + Result result = mockResult(Status.PENDING, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -210,7 +211,7 @@ public void test_step_finished_fires_assumption_failed_and_test_finished_for_und createDefaultRunNotifier(); Description description = mock(Description.class); setUpStepNotifierAndStepErrors(description); - Result result = mockResult(Result.Type.UNDEFINED); + Result result = mockResult(Status.UNDEFINED); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -230,7 +231,7 @@ public void test_step_finished_fires_failure_and_test_finished_for_undefined_ste createDefaultRunNotifier(); Description description = mock(Description.class); setUpStepNotifierAndStepErrors(description); - Result result = mockResult(Result.Type.UNDEFINED); + Result result = mockResult(Status.UNDEFINED); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -250,7 +251,7 @@ public void test_step_finished_adds_a_step_exeption_for_undefined_steps() { createDefaultRunNotifier(); setUpNoStepNotifierAndStepErrors(); PickleStepTestStep testStep = mockTestStep("XX"); - Result result = mockResult(Result.Type.UNDEFINED); + Result result = mockResult(Status.UNDEFINED); jUnitReporter.handleStepResult(testStep, result); @@ -265,7 +266,7 @@ public void test_step_finished_fires_failure_and_test_finished_for_failed_step() Description description = mock(Description.class); setUpStepNotifierAndStepErrors(description); Throwable exception = mock(Throwable.class); - Result result = mockResult(Result.Type.FAILED, exception); + Result result = mockResult(Status.FAILED, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -284,7 +285,7 @@ public void test_step_finished_adds_the_step_exeption_for_failed_steps() { createDefaultRunNotifier(); setUpNoStepNotifierAndStepErrors(); Throwable exception = new TestPendingException(); - Result result = mockResult(Result.Type.FAILED, exception); + Result result = mockResult(Status.FAILED, exception); jUnitReporter.handleStepResult(mock(PickleStepTestStep.class), result); @@ -296,7 +297,7 @@ public void test_case_finished_fires_only_test_finished_for_passed_step() { createNonStrictReporter(); Description description = mock(Description.class); createRunNotifier(description); - Result result = mockResult(Result.Type.PASSED); + Result result = mockResult(Status.PASSED); jUnitReporter.handleTestCaseResult(result); @@ -309,7 +310,7 @@ public void test_case_finished_fires_assumption_failed_and_test_finished_for_ski Description description = mock(Description.class); createRunNotifier(description); populateStepErrors(Collections.emptyList()); - Result result = mockResult(Result.Type.SKIPPED); + Result result = mockResult(Status.SKIPPED); jUnitReporter.handleTestCaseResult(result); @@ -330,7 +331,7 @@ public void test_case_finished_fires_assumption_failed_and_test_finished_for_ski Throwable exception1 = mock(AssumptionViolatedException.class); Throwable exception2 = mock(AssumptionViolatedException.class); populateStepErrors(asList(exception1, exception2)); - Result result = mockResult(Result.Type.SKIPPED); + Result result = mockResult(Status.SKIPPED); jUnitReporter.handleTestCaseResult(result); @@ -351,7 +352,7 @@ public void test_case_finished_fires_assumption_failed_and_test_finished_for_pen Throwable exception1 = mock(Throwable.class); Throwable exception2 = mock(Throwable.class); populateStepErrors(asList(exception1, exception2)); - Result result = mockResult(Result.Type.PENDING); + Result result = mockResult(Status.PENDING); jUnitReporter.handleTestCaseResult(result); @@ -372,7 +373,7 @@ public void test_case_finished_fires_failure_and_test_finished_for_pending_step_ Throwable exception1 = mock(Throwable.class); Throwable exception2 = mock(Throwable.class); populateStepErrors(asList(exception1, exception2)); - Result result = mockResult(Result.Type.PENDING); + Result result = mockResult(Status.PENDING); jUnitReporter.handleTestCaseResult(result); @@ -393,7 +394,7 @@ public void test_case_finished_fires_assumption_failed_and_test_finished_for_und Throwable exception1 = mock(Throwable.class); Throwable exception2 = mock(Throwable.class); populateStepErrors(asList(exception1, exception2)); - Result result = mockResult(Result.Type.UNDEFINED); + Result result = mockResult(Status.UNDEFINED); jUnitReporter.handleTestCaseResult(result); @@ -414,7 +415,7 @@ public void test_case_finished_fires_failure_and_test_finished_for_undefined_ste Throwable exception1 = mock(Throwable.class); Throwable exception2 = mock(Throwable.class); populateStepErrors(asList(exception1, exception2)); - Result result = mockResult(Result.Type.UNDEFINED); + Result result = mockResult(Status.UNDEFINED); jUnitReporter.handleTestCaseResult(result); @@ -435,7 +436,7 @@ public void test_case_finished_fires_failure_and_test_finished_for_failed_step() Throwable exception1 = mock(Throwable.class); Throwable exception2 = mock(Throwable.class); populateStepErrors(asList(exception1, exception2)); - Result result = mockResult(Result.Type.FAILED); + Result result = mockResult(Status.FAILED); jUnitReporter.handleTestCaseResult(result); @@ -450,11 +451,11 @@ public void test_case_finished_fires_failure_and_test_finished_for_failed_step() assertEquals(exception2, failures.get(1).getException()); } - private Result mockResult(Result.Type status, Throwable exception) { + private Result mockResult(Status status, Throwable exception) { return new Result(status, ZERO, exception); } - private Result mockResult(Result.Type status) { + private Result mockResult(Status status) { return new Result(status, ZERO, null); } diff --git a/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java b/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java index 417755ea59..ddab133851 100644 --- a/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java +++ b/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java @@ -1,7 +1,8 @@ package io.cucumber.testng; -import io.cucumber.core.event.Result; import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.TestCaseFinished; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.exception.CucumberException; @@ -36,7 +37,7 @@ void receiveResult(Result result) { } boolean isPassed() { - return result == null || result.is(Result.Type.PASSED); + return result == null || result.getStatus().is(Status.PASSED); } Throwable getError() { @@ -51,7 +52,7 @@ Throwable getError() { if (strict) { return result.getError(); } else { - return new SkipException(result.getErrorMessage(), result.getError()); + return new SkipException(result.getError().getMessage(), result.getError()); } case UNDEFINED: if (strict) { @@ -65,7 +66,7 @@ Throwable getError() { if (error instanceof SkipException) { return error; } else { - return new SkipException(result.getErrorMessage(), error); + return new SkipException(result.getError().getMessage(), error); } } else { return new SkipException(SKIPPED_MESSAGE); diff --git a/testng/src/test/java/io/cucumber/testng/TestCaseResultListenerTest.java b/testng/src/test/java/io/cucumber/testng/TestCaseResultListenerTest.java index 1f4b24d564..d183a957a2 100644 --- a/testng/src/test/java/io/cucumber/testng/TestCaseResultListenerTest.java +++ b/testng/src/test/java/io/cucumber/testng/TestCaseResultListenerTest.java @@ -1,6 +1,7 @@ package io.cucumber.testng; import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.runtime.TimeServiceEventBus; import org.testng.SkipException; @@ -101,27 +102,27 @@ public void should_be_skipped_for_skipped_result() { } private Result mockPassedResult() { - return new Result(Result.Type.PASSED, ZERO, null); + return new Result(Status.PASSED, ZERO, null); } private Result mockSkippedResult() { - return new Result(Result.Type.SKIPPED, ZERO, null); + return new Result(Status.SKIPPED, ZERO, null); } private Result mockUndefinedResult() { - return new Result(Result.Type.UNDEFINED, ZERO, null); + return new Result(Status.UNDEFINED, ZERO, null); } private Result mockFailedResult() { - return new Result(Result.Type.FAILED, ZERO, new Exception()); + return new Result(Status.FAILED, ZERO, new Exception()); } private Result mockAmbiguousResult() { - return new Result(Result.Type.AMBIGUOUS, ZERO, new Exception()); + return new Result(Status.AMBIGUOUS, ZERO, new Exception()); } private Result mockPendingResult() { - return new Result(Result.Type.PENDING, ZERO, new TestPendingException()); + return new Result(Status.PENDING, ZERO, new TestPendingException()); } } From 193b8833e007988345b2897786ba82c4774b79ef Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 29 Jun 2019 22:55:35 +0200 Subject: [PATCH 108/155] [Core] Clean up event API --- .../io/cucumber/core/backend/Backend.java | 2 + .../core/backend/BackendProviderService.java | 2 + .../io/cucumber/core/backend/Container.java | 3 + .../DuplicateStepDefinitionException.java | 2 + .../java/io/cucumber/core/backend/Glue.java | 2 + .../cucumber/core/backend/HookDefinition.java | 2 + .../java/io/cucumber/core/backend/Lookup.java | 3 + .../cucumber/core/backend/ObjectFactory.java | 2 +- .../io/cucumber/core/backend/Pending.java | 3 + .../cucumber/core/backend/StepDefinition.java | 4 +- .../main/java/io/cucumber/core/cli/Main.java | 2 + .../java/io/cucumber/core/event/Argument.java | 3 + .../io/cucumber/core/event/EmbedEvent.java | 19 ++- .../java/io/cucumber/core/event/Event.java | 4 + .../io/cucumber/core/event/EventHandler.java | 3 + .../cucumber/core/event/EventPublisher.java | 3 + .../io/cucumber/core/event/HookTestStep.java | 3 + .../java/io/cucumber/core/event/HookType.java | 10 +- .../core/event/PickleStepTestStep.java | 3 + .../java/io/cucumber/core/event/Result.java | 3 + .../core/event/SnippetsSuggestedEvent.java | 28 +++-- .../java/io/cucumber/core/event/Status.java | 3 + .../cucumber/core/event/StepDefinedEvent.java | 14 ++- .../cucumber/core/event/StepDefinition.java | 4 + .../java/io/cucumber/core/event/TestCase.java | 2 + .../io/cucumber/core/event/TestCaseEvent.java | 6 +- .../cucumber/core/event/TestCaseFinished.java | 21 +++- .../cucumber/core/event/TestCaseStarted.java | 12 +- .../cucumber/core/event/TestRunFinished.java | 3 + .../cucumber/core/event/TestRunStarted.java | 3 + .../cucumber/core/event/TestSourceRead.java | 19 ++- .../java/io/cucumber/core/event/TestStep.java | 4 + .../cucumber/core/event/TestStepFinished.java | 20 +++- .../cucumber/core/event/TestStepStarted.java | 12 +- .../cucumber/core/event/TimeStampedEvent.java | 8 +- .../io/cucumber/core/event/WriteEvent.java | 12 +- .../io/cucumber/core/plugin/ColorAware.java | 3 + .../core/plugin/ConcurrentEventListener.java | 2 + .../cucumber/core/plugin/EventListener.java | 2 + .../cucumber/core/plugin/HTMLFormatter.java | 108 ++++++++++-------- .../cucumber/core/plugin/JSONFormatter.java | 49 ++++---- .../cucumber/core/plugin/JUnitFormatter.java | 18 +-- .../java/io/cucumber/core/plugin/Plugin.java | 3 + .../cucumber/core/plugin/PrettyFormatter.java | 28 ++--- .../core/plugin/ProgressFormatter.java | 9 +- .../cucumber/core/plugin/RerunFormatter.java | 4 +- .../java/io/cucumber/core/plugin/Stats.java | 6 +- .../io/cucumber/core/plugin/StrictAware.java | 3 + .../cucumber/core/plugin/SummaryPrinter.java | 3 + .../cucumber/core/plugin/TestNGFormatter.java | 18 +-- .../core/plugin/TestSourcesModel.java | 4 +- .../core/plugin/TimelineFormatter.java | 4 +- .../core/plugin/UndefinedStepsTracker.java | 4 +- .../plugin/UnusedStepsSummaryPrinter.java | 4 +- .../cucumber/core/plugin/UsageFormatter.java | 6 +- .../core/runner/HookDefinitionMatch.java | 1 - .../runner/PickleStepDefinitionMatch.java | 1 - .../java/io/cucumber/core/runner/Runner.java | 8 +- .../io/cucumber/core/runner/Scenario.java | 10 -- .../StepDefinitionMatch.java | 4 +- .../io/cucumber/core/runner/TestStep.java | 1 - .../io/cucumber/core/runtime/Runtime.java | 2 +- .../plugin/UnusedStepsSummaryPrinterTest.java | 6 +- .../cucumber/core/runner/CachingGlueTest.java | 4 +- .../core/runner/HookTestStepTest.java | 2 +- .../core/runner/PickleStepTestStepTest.java | 16 +-- .../core/runner/ScenarioResultTest.java | 12 +- .../core/runner/StepDefinitionMatchTest.java | 1 - .../io/cucumber/core/runner/TestCaseTest.java | 12 +- .../io/cucumber/core/runtime/RuntimeTest.java | 12 +- .../ThreadLocalRunnerSupplierTest.java | 5 +- .../cucumber/java/JavaStepDefinitionTest.java | 2 +- .../java/io/cucumber/junit/JUnitReporter.java | 14 +-- .../testng/TestCaseResultListener.java | 2 +- 74 files changed, 417 insertions(+), 225 deletions(-) rename core/src/main/java/io/cucumber/core/{backend => runner}/StepDefinitionMatch.java (71%) diff --git a/core/src/main/java/io/cucumber/core/backend/Backend.java b/core/src/main/java/io/cucumber/core/backend/Backend.java index e26fbef8fc..9a793f1c8d 100644 --- a/core/src/main/java/io/cucumber/core/backend/Backend.java +++ b/core/src/main/java/io/cucumber/core/backend/Backend.java @@ -1,10 +1,12 @@ package io.cucumber.core.backend; import io.cucumber.core.snippets.Snippet; +import org.apiguardian.api.API; import java.net.URI; import java.util.List; +@API(status = API.Status.STABLE) public interface Backend { /** * Invoked once before all features. This is where stepdefs and hooks should be loaded. diff --git a/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java b/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java index 6cf6860b25..4bee6d632b 100644 --- a/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java +++ b/core/src/main/java/io/cucumber/core/backend/BackendProviderService.java @@ -1,7 +1,9 @@ package io.cucumber.core.backend; import io.cucumber.core.io.ResourceLoader; +import org.apiguardian.api.API; +@API(status = API.Status.STABLE) public interface BackendProviderService { Backend create(Lookup lookup, Container container, ResourceLoader resourceLoader); diff --git a/core/src/main/java/io/cucumber/core/backend/Container.java b/core/src/main/java/io/cucumber/core/backend/Container.java index b1c9f398d5..684993387b 100644 --- a/core/src/main/java/io/cucumber/core/backend/Container.java +++ b/core/src/main/java/io/cucumber/core/backend/Container.java @@ -1,5 +1,8 @@ package io.cucumber.core.backend; +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE) public interface Container { /** * Collects glue classes in the classpath. Called once on init. diff --git a/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java b/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java index c2346b1f7f..4e9a5be781 100644 --- a/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java +++ b/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java @@ -1,7 +1,9 @@ package io.cucumber.core.backend; import io.cucumber.core.exception.CucumberException; +import org.apiguardian.api.API; +@API(status = API.Status.STABLE) public final class DuplicateStepDefinitionException extends CucumberException { public DuplicateStepDefinitionException(StepDefinition a, StepDefinition b) { super(createMessage(a, b)); diff --git a/core/src/main/java/io/cucumber/core/backend/Glue.java b/core/src/main/java/io/cucumber/core/backend/Glue.java index 281c73617a..14f5889bbb 100644 --- a/core/src/main/java/io/cucumber/core/backend/Glue.java +++ b/core/src/main/java/io/cucumber/core/backend/Glue.java @@ -1,9 +1,11 @@ package io.cucumber.core.backend; import io.cucumber.core.stepexpression.TypeRegistry; +import org.apiguardian.api.API; import java.util.function.Function; +@API(status = API.Status.STABLE) public interface Glue { void addStepDefinition(Function stepDefinition) throws DuplicateStepDefinitionException; diff --git a/core/src/main/java/io/cucumber/core/backend/HookDefinition.java b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java index 6372e9dc56..9ff38ed372 100644 --- a/core/src/main/java/io/cucumber/core/backend/HookDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/HookDefinition.java @@ -2,9 +2,11 @@ import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleTag; +import org.apiguardian.api.API; import java.util.Collection; +@API(status = API.Status.STABLE) public interface HookDefinition { /** * The source line where the step definition is defined. diff --git a/core/src/main/java/io/cucumber/core/backend/Lookup.java b/core/src/main/java/io/cucumber/core/backend/Lookup.java index 3a8c184edd..9bf5037ea6 100644 --- a/core/src/main/java/io/cucumber/core/backend/Lookup.java +++ b/core/src/main/java/io/cucumber/core/backend/Lookup.java @@ -1,5 +1,8 @@ package io.cucumber.core.backend; +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE) public interface Lookup { /** * Provides the glue instances used to execute the current scenario. diff --git a/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java b/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java index 921e9dbb5e..4272a0705c 100644 --- a/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java +++ b/core/src/main/java/io/cucumber/core/backend/ObjectFactory.java @@ -6,7 +6,7 @@ * Minimal facade for Dependency Injection containers */ @API(status = API.Status.STABLE) -public interface ObjectFactory { +public interface ObjectFactory extends Container, Lookup { /** * Instantiate glue code before scenario execution. Called once per scenario. diff --git a/core/src/main/java/io/cucumber/core/backend/Pending.java b/core/src/main/java/io/cucumber/core/backend/Pending.java index cba5693a47..4d864857b4 100644 --- a/core/src/main/java/io/cucumber/core/backend/Pending.java +++ b/core/src/main/java/io/cucumber/core/backend/Pending.java @@ -1,6 +1,8 @@ package io.cucumber.core.backend; +import org.apiguardian.api.API; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -11,6 +13,7 @@ * That is - if the exception is thrown from a step definition or hook, the scenario's status will * be pending instead of failed. */ +@API(status = API.Status.STABLE) @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Pending { diff --git a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java index 3aaac9490e..0ee182fdab 100644 --- a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java @@ -2,9 +2,11 @@ import io.cucumber.core.stepexpression.Argument; import gherkin.pickles.PickleStep; +import org.apiguardian.api.API; import java.util.List; +@API(status = API.Status.STABLE) public interface StepDefinition extends io.cucumber.core.event.StepDefinition { /** * Returns a list of arguments. Return null if the step definition @@ -30,7 +32,7 @@ public interface StepDefinition extends io.cucumber.core.event.StepDefinition { * @return Return true if this matches the location. This is used to filter * stack traces. */ - boolean isDefinedAt(StackTraceElement stackTraceElement); // TODO: redundant with getLocation? + boolean isDefinedAt(StackTraceElement stackTraceElement); /** * @return How many declared parameters this step definition has. Returns null if unknown. diff --git a/core/src/main/java/io/cucumber/core/cli/Main.java b/core/src/main/java/io/cucumber/core/cli/Main.java index b732965748..454ecfef78 100644 --- a/core/src/main/java/io/cucumber/core/cli/Main.java +++ b/core/src/main/java/io/cucumber/core/cli/Main.java @@ -4,6 +4,7 @@ import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.options.*; import io.cucumber.core.runtime.Runtime; +import org.apiguardian.api.API; /** * Cucumber Main. Runs Cucumber as a CLI. @@ -16,6 +17,7 @@ *
      • {@code cucumber.options} property in {@code cucumber.properties}
      • * */ +@API(status = API.Status.STABLE) public class Main { public static void main(String[] argv) { diff --git a/core/src/main/java/io/cucumber/core/event/Argument.java b/core/src/main/java/io/cucumber/core/event/Argument.java index f75b61262e..6a71b74b79 100644 --- a/core/src/main/java/io/cucumber/core/event/Argument.java +++ b/core/src/main/java/io/cucumber/core/event/Argument.java @@ -1,5 +1,7 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + /** * Represents an argument in for a step definition. *

        @@ -8,6 +10,7 @@ * one argument with value {@code "4"}, starting at {@code 7} and * ending at {@code 8}. */ +@API(status = API.Status.STABLE) public interface Argument { String getValue(); diff --git a/core/src/main/java/io/cucumber/core/event/EmbedEvent.java b/core/src/main/java/io/cucumber/core/event/EmbedEvent.java index 62397ae68b..e3ee749e47 100644 --- a/core/src/main/java/io/cucumber/core/event/EmbedEvent.java +++ b/core/src/main/java/io/cucumber/core/event/EmbedEvent.java @@ -1,15 +1,26 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Instant; +import java.util.Objects; +@API(status = API.Status.STABLE) public final class EmbedEvent extends TestCaseEvent { - public final byte[] data; - public final String mimeType; + private final byte[] data; + private final String mimeType; public EmbedEvent(Instant timeInstant, TestCase testCase, byte[] data, String mimeType) { super(timeInstant, testCase); - this.data = data; - this.mimeType = mimeType; + this.data = Objects.requireNonNull(data); + this.mimeType = Objects.requireNonNull(mimeType); + } + + public byte[] getData() { + return data; } + public String getMimeType() { + return mimeType; + } } diff --git a/core/src/main/java/io/cucumber/core/event/Event.java b/core/src/main/java/io/cucumber/core/event/Event.java index e7ae8dece3..ed44e4b614 100644 --- a/core/src/main/java/io/cucumber/core/event/Event.java +++ b/core/src/main/java/io/cucumber/core/event/Event.java @@ -1,6 +1,10 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Instant; + +@API(status = API.Status.STABLE) public interface Event { /** diff --git a/core/src/main/java/io/cucumber/core/event/EventHandler.java b/core/src/main/java/io/cucumber/core/event/EventHandler.java index 9f460b0228..d9a6d15d66 100644 --- a/core/src/main/java/io/cucumber/core/event/EventHandler.java +++ b/core/src/main/java/io/cucumber/core/event/EventHandler.java @@ -1,5 +1,8 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE) public interface EventHandler { void receive(T event); diff --git a/core/src/main/java/io/cucumber/core/event/EventPublisher.java b/core/src/main/java/io/cucumber/core/event/EventPublisher.java index 08a46641c0..00aca48ecd 100644 --- a/core/src/main/java/io/cucumber/core/event/EventPublisher.java +++ b/core/src/main/java/io/cucumber/core/event/EventPublisher.java @@ -1,5 +1,8 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE) public interface EventPublisher { /** diff --git a/core/src/main/java/io/cucumber/core/event/HookTestStep.java b/core/src/main/java/io/cucumber/core/event/HookTestStep.java index c31a1b7591..64416652b3 100644 --- a/core/src/main/java/io/cucumber/core/event/HookTestStep.java +++ b/core/src/main/java/io/cucumber/core/event/HookTestStep.java @@ -1,5 +1,7 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + /** * Hooks are invoked before and after each scenario and before and * after each gherkin step in a scenario. @@ -7,6 +9,7 @@ * @see TestCaseStarted * @see TestCaseFinished */ +@API(status = API.Status.STABLE) public interface HookTestStep extends TestStep { /** diff --git a/core/src/main/java/io/cucumber/core/event/HookType.java b/core/src/main/java/io/cucumber/core/event/HookType.java index 43d2a366b1..70d8f28865 100644 --- a/core/src/main/java/io/cucumber/core/event/HookType.java +++ b/core/src/main/java/io/cucumber/core/event/HookType.java @@ -1,12 +1,8 @@ package io.cucumber.core.event; -import static java.util.Locale.ROOT; +import org.apiguardian.api.API; +@API(status = API.Status.STABLE) public enum HookType { - Before, After, BeforeStep, AfterStep; - - @Override - public String toString() { - return super.toString().toLowerCase(ROOT); - } + BEFORE, AFTER, BEFORE_STEP, AFTER_STEP; } diff --git a/core/src/main/java/io/cucumber/core/event/PickleStepTestStep.java b/core/src/main/java/io/cucumber/core/event/PickleStepTestStep.java index c605617ac1..485e459586 100644 --- a/core/src/main/java/io/cucumber/core/event/PickleStepTestStep.java +++ b/core/src/main/java/io/cucumber/core/event/PickleStepTestStep.java @@ -1,10 +1,13 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.util.List; /** * A pickle test step matches a line in a Gherkin scenario or background. */ +@API(status = API.Status.STABLE) public interface PickleStepTestStep extends TestStep { /** diff --git a/core/src/main/java/io/cucumber/core/event/Result.java b/core/src/main/java/io/cucumber/core/event/Result.java index 2692108718..408bbe768a 100644 --- a/core/src/main/java/io/cucumber/core/event/Result.java +++ b/core/src/main/java/io/cucumber/core/event/Result.java @@ -1,10 +1,13 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Duration; import java.util.Objects; import static java.util.Objects.requireNonNull; +@API(status = API.Status.STABLE) public final class Result{ private final Status status; diff --git a/core/src/main/java/io/cucumber/core/event/SnippetsSuggestedEvent.java b/core/src/main/java/io/cucumber/core/event/SnippetsSuggestedEvent.java index ac3118c0ef..19d56cf6fc 100644 --- a/core/src/main/java/io/cucumber/core/event/SnippetsSuggestedEvent.java +++ b/core/src/main/java/io/cucumber/core/event/SnippetsSuggestedEvent.java @@ -1,21 +1,35 @@ package io.cucumber.core.event; import gherkin.pickles.PickleLocation; +import org.apiguardian.api.API; import java.time.Instant; import java.util.Collections; import java.util.List; +import java.util.Objects; -public class SnippetsSuggestedEvent extends TimeStampedEvent { - public final String uri; - public final List stepLocations; - public final List snippets; +@API(status = API.Status.STABLE) +public final class SnippetsSuggestedEvent extends TimeStampedEvent { + private final String uri; + private final List stepLocations; + private final List snippets; public SnippetsSuggestedEvent(Instant timeInstant, String uri, List stepLocations, List snippets) { super(timeInstant); - this.uri = uri; - this.stepLocations = stepLocations; - this.snippets = Collections.unmodifiableList(snippets); + this.uri = Objects.requireNonNull(uri); + this.stepLocations = Objects.requireNonNull(stepLocations); + this.snippets = Collections.unmodifiableList(Objects.requireNonNull(snippets)); } + public String getUri() { + return uri; + } + + public List getStepLocations() { + return stepLocations; + } + + public List getSnippets() { + return snippets; + } } diff --git a/core/src/main/java/io/cucumber/core/event/Status.java b/core/src/main/java/io/cucumber/core/event/Status.java index 94d6c2432f..ea9cd72a60 100644 --- a/core/src/main/java/io/cucumber/core/event/Status.java +++ b/core/src/main/java/io/cucumber/core/event/Status.java @@ -1,5 +1,8 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE) public enum Status { PASSED, SKIPPED, diff --git a/core/src/main/java/io/cucumber/core/event/StepDefinedEvent.java b/core/src/main/java/io/cucumber/core/event/StepDefinedEvent.java index 3a25cef961..54c5f4dc1d 100644 --- a/core/src/main/java/io/cucumber/core/event/StepDefinedEvent.java +++ b/core/src/main/java/io/cucumber/core/event/StepDefinedEvent.java @@ -1,13 +1,21 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Instant; +import java.util.Objects; -public class StepDefinedEvent extends TimeStampedEvent { - public final StepDefinition stepDefinition; +@API(status = API.Status.STABLE) +public final class StepDefinedEvent extends TimeStampedEvent { + private final StepDefinition stepDefinition; public StepDefinedEvent(Instant timeInstant, StepDefinition stepDefinition) { super(timeInstant); - this.stepDefinition = stepDefinition; + this.stepDefinition = Objects.requireNonNull(stepDefinition); + } + + public StepDefinition getStepDefinition() { + return stepDefinition; } } diff --git a/core/src/main/java/io/cucumber/core/event/StepDefinition.java b/core/src/main/java/io/cucumber/core/event/StepDefinition.java index 1b07fe3ff3..b43e083565 100644 --- a/core/src/main/java/io/cucumber/core/event/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/event/StepDefinition.java @@ -1,5 +1,9 @@ package io.cucumber.core.event; + +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE) public interface StepDefinition { /** diff --git a/core/src/main/java/io/cucumber/core/event/TestCase.java b/core/src/main/java/io/cucumber/core/event/TestCase.java index ac19208ec5..38298ff3ef 100644 --- a/core/src/main/java/io/cucumber/core/event/TestCase.java +++ b/core/src/main/java/io/cucumber/core/event/TestCase.java @@ -1,9 +1,11 @@ package io.cucumber.core.event; import gherkin.pickles.PickleTag; +import org.apiguardian.api.API; import java.util.List; +@API(status = API.Status.STABLE) public interface TestCase { /** diff --git a/core/src/main/java/io/cucumber/core/event/TestCaseEvent.java b/core/src/main/java/io/cucumber/core/event/TestCaseEvent.java index b53b8ce44d..df8fe28054 100644 --- a/core/src/main/java/io/cucumber/core/event/TestCaseEvent.java +++ b/core/src/main/java/io/cucumber/core/event/TestCaseEvent.java @@ -1,14 +1,18 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Instant; +import java.util.Objects; +@API(status = API.Status.STABLE) public abstract class TestCaseEvent extends TimeStampedEvent { private final TestCase testCase; TestCaseEvent(Instant timeInstant, TestCase testCase) { super(timeInstant); - this.testCase = testCase; + this.testCase = Objects.requireNonNull(testCase); } public TestCase getTestCase() { diff --git a/core/src/main/java/io/cucumber/core/event/TestCaseFinished.java b/core/src/main/java/io/cucumber/core/event/TestCaseFinished.java index 01d4aa08dc..07b4c65a20 100644 --- a/core/src/main/java/io/cucumber/core/event/TestCaseFinished.java +++ b/core/src/main/java/io/cucumber/core/event/TestCaseFinished.java @@ -1,14 +1,27 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Instant; +import java.util.Objects; +@API(status = API.Status.STABLE) public final class TestCaseFinished extends TestCaseEvent { - public final Result result; - public final TestCase testCase; + private final Result result; + private final TestCase testCase; public TestCaseFinished(Instant timeInstant, TestCase testCase, Result result) { super(timeInstant, testCase); - this.testCase = testCase; - this.result = result; + this.testCase = Objects.requireNonNull(testCase); + this.result = Objects.requireNonNull(result); } + + public Result getResult() { + return result; + } + + @Override + public TestCase getTestCase() { + return testCase; + } } diff --git a/core/src/main/java/io/cucumber/core/event/TestCaseStarted.java b/core/src/main/java/io/cucumber/core/event/TestCaseStarted.java index ba57efe8d8..c6c5b28ee0 100644 --- a/core/src/main/java/io/cucumber/core/event/TestCaseStarted.java +++ b/core/src/main/java/io/cucumber/core/event/TestCaseStarted.java @@ -1,13 +1,21 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Instant; +import java.util.Objects; +@API(status = API.Status.STABLE) public final class TestCaseStarted extends TestCaseEvent { - public final TestCase testCase; + private final TestCase testCase; public TestCaseStarted(Instant timeInstant, TestCase testCase) { super(timeInstant, testCase); - this.testCase = testCase; + this.testCase = Objects.requireNonNull(testCase); } + @Override + public TestCase getTestCase() { + return testCase; + } } diff --git a/core/src/main/java/io/cucumber/core/event/TestRunFinished.java b/core/src/main/java/io/cucumber/core/event/TestRunFinished.java index ea8d176154..14e6c02985 100644 --- a/core/src/main/java/io/cucumber/core/event/TestRunFinished.java +++ b/core/src/main/java/io/cucumber/core/event/TestRunFinished.java @@ -1,7 +1,10 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Instant; +@API(status = API.Status.STABLE) public final class TestRunFinished extends TimeStampedEvent { public TestRunFinished(Instant timeInstant) { diff --git a/core/src/main/java/io/cucumber/core/event/TestRunStarted.java b/core/src/main/java/io/cucumber/core/event/TestRunStarted.java index d4daf7d883..ab7ce723af 100644 --- a/core/src/main/java/io/cucumber/core/event/TestRunStarted.java +++ b/core/src/main/java/io/cucumber/core/event/TestRunStarted.java @@ -1,7 +1,10 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Instant; +@API(status = API.Status.STABLE) public final class TestRunStarted extends TimeStampedEvent { public TestRunStarted(Instant timeInstant) { diff --git a/core/src/main/java/io/cucumber/core/event/TestSourceRead.java b/core/src/main/java/io/cucumber/core/event/TestSourceRead.java index 9ffe38593e..7df4734922 100644 --- a/core/src/main/java/io/cucumber/core/event/TestSourceRead.java +++ b/core/src/main/java/io/cucumber/core/event/TestSourceRead.java @@ -1,15 +1,26 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Instant; +import java.util.Objects; +@API(status = API.Status.STABLE) public final class TestSourceRead extends TimeStampedEvent { - public final String uri; - public final String source; + private final String uri; + private final String source; public TestSourceRead(Instant timeInstant, String uri, String source) { super(timeInstant); - this.uri = uri; - this.source = source; + this.uri = Objects.requireNonNull(uri); + this.source = Objects.requireNonNull(source); + } + + public String getSource() { + return source; } + public String getUri() { + return uri; + } } diff --git a/core/src/main/java/io/cucumber/core/event/TestStep.java b/core/src/main/java/io/cucumber/core/event/TestStep.java index df8832d17b..fdc9bff095 100644 --- a/core/src/main/java/io/cucumber/core/event/TestStep.java +++ b/core/src/main/java/io/cucumber/core/event/TestStep.java @@ -1,5 +1,7 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + /** * A test step can either represent the execution of a hook * or a pickle step. Each step is tied to some glue code. @@ -7,6 +9,8 @@ * @see TestCaseStarted * @see TestCaseFinished */ + +@API(status = API.Status.STABLE) public interface TestStep { /** diff --git a/core/src/main/java/io/cucumber/core/event/TestStepFinished.java b/core/src/main/java/io/cucumber/core/event/TestStepFinished.java index ae1b550fcc..13422104e1 100644 --- a/core/src/main/java/io/cucumber/core/event/TestStepFinished.java +++ b/core/src/main/java/io/cucumber/core/event/TestStepFinished.java @@ -1,6 +1,9 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Instant; +import java.util.Objects; /** * A test step finished event is broadcast when ever a step finishes. @@ -18,14 +21,23 @@ * @see PickleStepTestStep * @see HookTestStep */ + +@API(status = API.Status.STABLE) public final class TestStepFinished extends TestCaseEvent { - public final TestStep testStep; - public final Result result; + private final TestStep testStep; + private final Result result; public TestStepFinished(Instant timeInstant, TestCase testCase, TestStep testStep, Result result) { super(timeInstant, testCase); - this.testStep = testStep; - this.result = result; + this.testStep = Objects.requireNonNull(testStep); + this.result = Objects.requireNonNull(result); } + public Result getResult() { + return result; + } + + public TestStep getTestStep() { + return testStep; + } } diff --git a/core/src/main/java/io/cucumber/core/event/TestStepStarted.java b/core/src/main/java/io/cucumber/core/event/TestStepStarted.java index bb4b3e06a5..c6d47f0ce9 100644 --- a/core/src/main/java/io/cucumber/core/event/TestStepStarted.java +++ b/core/src/main/java/io/cucumber/core/event/TestStepStarted.java @@ -1,6 +1,9 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Instant; +import java.util.Objects; /** * A test step started event is broadcast when ever a step starts. @@ -19,12 +22,17 @@ * @see PickleStepTestStep * @see HookTestStep */ + +@API(status = API.Status.STABLE) public final class TestStepStarted extends TestCaseEvent { - public final TestStep testStep; + private final TestStep testStep; public TestStepStarted(Instant timeInstant, TestCase testCase, TestStep testStep) { super(timeInstant, testCase); - this.testStep = testStep; + this.testStep = Objects.requireNonNull(testStep); } + public TestStep getTestStep() { + return testStep; + } } diff --git a/core/src/main/java/io/cucumber/core/event/TimeStampedEvent.java b/core/src/main/java/io/cucumber/core/event/TimeStampedEvent.java index 17ccb42bf5..b51fc8b9dc 100644 --- a/core/src/main/java/io/cucumber/core/event/TimeStampedEvent.java +++ b/core/src/main/java/io/cucumber/core/event/TimeStampedEvent.java @@ -1,18 +1,16 @@ package io.cucumber.core.event; import java.time.Instant; +import java.util.Objects; + abstract class TimeStampedEvent implements Event { private final Instant instant; TimeStampedEvent(Instant timeInstant) { - this.instant = timeInstant; + this.instant = Objects.requireNonNull(timeInstant); } - - /** - * {@inheritDoc} - */ /** * {@inheritDoc} diff --git a/core/src/main/java/io/cucumber/core/event/WriteEvent.java b/core/src/main/java/io/cucumber/core/event/WriteEvent.java index 412f5236fe..e3fbab800d 100644 --- a/core/src/main/java/io/cucumber/core/event/WriteEvent.java +++ b/core/src/main/java/io/cucumber/core/event/WriteEvent.java @@ -1,12 +1,20 @@ package io.cucumber.core.event; +import org.apiguardian.api.API; + import java.time.Instant; +import java.util.Objects; +@API(status = API.Status.STABLE) public final class WriteEvent extends TestCaseEvent { - public final String text; + private final String text; public WriteEvent(Instant timeInstant, TestCase testCase, String text) { super(timeInstant, testCase); - this.text = text; + this.text = Objects.requireNonNull(text); + } + + public String getText() { + return text; } } diff --git a/core/src/main/java/io/cucumber/core/plugin/ColorAware.java b/core/src/main/java/io/cucumber/core/plugin/ColorAware.java index ee823d2979..ec0d626ff5 100644 --- a/core/src/main/java/io/cucumber/core/plugin/ColorAware.java +++ b/core/src/main/java/io/cucumber/core/plugin/ColorAware.java @@ -1,8 +1,11 @@ package io.cucumber.core.plugin; +import org.apiguardian.api.API; + /** * Interface for Plugins that use ANSI escape codes to print coloured output. */ +@API(status = API.Status.STABLE) public interface ColorAware extends Plugin { /** * When set to monochrome the plugin should not use colored output. diff --git a/core/src/main/java/io/cucumber/core/plugin/ConcurrentEventListener.java b/core/src/main/java/io/cucumber/core/plugin/ConcurrentEventListener.java index f0af4135e2..c3118a2151 100644 --- a/core/src/main/java/io/cucumber/core/plugin/ConcurrentEventListener.java +++ b/core/src/main/java/io/cucumber/core/plugin/ConcurrentEventListener.java @@ -3,6 +3,7 @@ import io.cucumber.core.event.Event; import io.cucumber.core.event.EventPublisher; import io.cucumber.core.event.TestCase; +import org.apiguardian.api.API; /** * Listens to pickle execution events. Can be used to @@ -31,6 +32,7 @@ * * @see Event */ +@API(status = API.Status.STABLE) public interface ConcurrentEventListener extends Plugin { /** diff --git a/core/src/main/java/io/cucumber/core/plugin/EventListener.java b/core/src/main/java/io/cucumber/core/plugin/EventListener.java index c313a4add4..f23b21fb38 100644 --- a/core/src/main/java/io/cucumber/core/plugin/EventListener.java +++ b/core/src/main/java/io/cucumber/core/plugin/EventListener.java @@ -2,6 +2,7 @@ import io.cucumber.core.event.Event; import io.cucumber.core.event.EventPublisher; +import org.apiguardian.api.API; /** * Listens to pickle execution events. Can be used to @@ -16,6 +17,7 @@ * @see Event * @see ConcurrentEventListener */ +@API(status = API.Status.STABLE) public interface EventListener extends Plugin { /** diff --git a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index 3214251ef8..c893243fa8 100644 --- a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -1,19 +1,5 @@ package io.cucumber.core.plugin; -import io.cucumber.core.event.HookTestStep; -import io.cucumber.core.event.PickleStepTestStep; -import io.cucumber.core.event.Result; -import io.cucumber.core.event.TestCase; -import io.cucumber.core.event.EmbedEvent; -import io.cucumber.core.event.EventHandler; -import io.cucumber.core.event.EventPublisher; -import io.cucumber.core.event.TestCaseStarted; -import io.cucumber.core.event.TestRunFinished; -import io.cucumber.core.event.TestSourceRead; -import io.cucumber.core.event.TestStepFinished; -import io.cucumber.core.event.TestStepStarted; -import io.cucumber.core.event.WriteEvent; -import io.cucumber.core.exception.CucumberException; import gherkin.ast.Background; import gherkin.ast.DataTable; import gherkin.ast.DocString; @@ -34,6 +20,21 @@ import gherkin.pickles.PickleString; import gherkin.pickles.PickleTable; import gherkin.pickles.PickleTag; +import io.cucumber.core.event.EmbedEvent; +import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.EventPublisher; +import io.cucumber.core.event.HookTestStep; +import io.cucumber.core.event.HookType; +import io.cucumber.core.event.PickleStepTestStep; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.TestCase; +import io.cucumber.core.event.TestCaseStarted; +import io.cucumber.core.event.TestRunFinished; +import io.cucumber.core.event.TestSourceRead; +import io.cucumber.core.event.TestStepFinished; +import io.cucumber.core.event.TestStepStarted; +import io.cucumber.core.event.WriteEvent; +import io.cucumber.core.exception.CucumberException; import java.io.Closeable; import java.io.File; @@ -49,6 +50,7 @@ import java.util.List; import java.util.Map; +import static java.util.Locale.ENGLISH; import static java.util.Locale.ROOT; public final class HTMLFormatter implements EventListener { @@ -56,11 +58,11 @@ public final class HTMLFormatter implements EventListener { private static final String JS_FORMATTER_VAR = "formatter"; private static final String JS_REPORT_FILENAME = "report.js"; private static final String[] TEXT_ASSETS = new String[]{ - "/io/cucumber/formatter/html/formatter.js", - "/io/cucumber/formatter/html/index.html", - "/io/cucumber/formatter/html/jquery-1.8.2.min.js", - "/io/cucumber/formatter/html/style.css" - }; + "/io/cucumber/formatter/html/formatter.js", + "/io/cucumber/formatter/html/index.html", + "/io/cucumber/formatter/html/jquery-1.8.2.min.js", + "/io/cucumber/formatter/html/style.css" + }; private static final Map MIME_TYPES_EXTENSIONS = new HashMap() { { put("image/bmp", "bmp"); @@ -89,7 +91,7 @@ public void receive(TestSourceRead event) { handleTestSourceRead(event); } }; - private EventHandler caseStartedHandler= new EventHandler() { + private EventHandler caseStartedHandler = new EventHandler() { @Override public void receive(TestCaseStarted event) { handleTestCaseStarted(event); @@ -148,7 +150,7 @@ public void setEventPublisher(EventPublisher publisher) { } private void handleTestSourceRead(TestSourceRead event) { - testSources.addTestSourceReadEvent(event.uri, event); + testSources.addTestSourceReadEvent(event.getUri(), event); } private void handleTestCaseStarted(TestCaseStarted event) { @@ -157,11 +159,11 @@ private void handleTestCaseStarted(TestCaseStarted event) { .append(JS_FORMATTER_VAR).append(" = new CucumberHTML.DOMFormatter($('.cucumber-report'));"); firstFeature = false; } - handleStartOfFeature(event.testCase); - handleScenarioOutline(event.testCase); - currentTestCaseMap = createTestCase(event.testCase); - if (testSources.hasBackground(currentFeatureFile, event.testCase.getLine())) { - jsFunctionCall("background", createBackground(event.testCase)); + handleStartOfFeature(event.getTestCase()); + handleScenarioOutline(event.getTestCase()); + currentTestCaseMap = createTestCase(event.getTestCase()); + if (testSources.hasBackground(currentFeatureFile, event.getTestCase().getLine())) { + jsFunctionCall("background", createBackground(event.getTestCase())); } else { jsFunctionCall("scenario", currentTestCaseMap); currentTestCaseMap = null; @@ -169,46 +171,62 @@ private void handleTestCaseStarted(TestCaseStarted event) { } private void handleTestStepStarted(TestStepStarted event) { - if (event.testStep instanceof PickleStepTestStep) { - PickleStepTestStep testStep = (PickleStepTestStep) event.testStep; + if (event.getTestStep() instanceof PickleStepTestStep) { + PickleStepTestStep testStep = (PickleStepTestStep) event.getTestStep(); if (isFirstStepAfterBackground(testStep)) { jsFunctionCall("scenario", currentTestCaseMap); currentTestCaseMap = null; } jsFunctionCall("step", createTestStep(testStep)); - jsFunctionCall("match", createMatchMap((PickleStepTestStep) event.testStep)); + jsFunctionCall("match", createMatchMap((PickleStepTestStep) event.getTestStep())); } } private void handleTestStepFinished(TestStepFinished event) { - if (event.testStep instanceof PickleStepTestStep) { - jsFunctionCall("result", createResultMap(event.result)); - } else if(event.testStep instanceof HookTestStep) { - HookTestStep hookTestStep = (HookTestStep) event.testStep; - jsFunctionCall(hookTestStep.getHookType().toString(), createResultMap(event.result)); + if (event.getTestStep() instanceof PickleStepTestStep) { + jsFunctionCall("result", createResultMap(event.getResult())); + } else if (event.getTestStep() instanceof HookTestStep) { + HookTestStep hookTestStep = (HookTestStep) event.getTestStep(); + jsFunctionCall(getFunctionName(hookTestStep), createResultMap(event.getResult())); } else { throw new IllegalStateException(); } } + private String getFunctionName(HookTestStep hookTestStep) { + HookType hookType = hookTestStep.getHookType(); + switch (hookType) { + case BEFORE: + return "before"; + case AFTER: + return "after"; + case BEFORE_STEP: + return "beforestep"; + case AFTER_STEP: + return "afterstep"; + default: + throw new IllegalArgumentException(hookType.name()); + } + } + private void handleEmbed(EmbedEvent event) { - String mimeType = event.mimeType; - if(mimeType.startsWith("text/")) { + String mimeType = event.getMimeType(); + if (mimeType.startsWith("text/")) { // just pass straight to the plugin to output in the html - jsFunctionCall("embedding", mimeType, new String(event.data)); + jsFunctionCall("embedding", mimeType, new String(event.getData())); } else { // Creating a file instead of using data urls to not clutter the js file String extension = MIME_TYPES_EXTENSIONS.get(mimeType); if (extension != null) { StringBuilder fileName = new StringBuilder("embedded").append(embeddedIndex++).append(".").append(extension); - writeBytesToURL(event.data, toUrl(fileName.toString())); + writeBytesToURL(event.getData(), toUrl(fileName.toString())); jsFunctionCall("embedding", mimeType, fileName); } } } private void handleWrite(WriteEvent event) { - jsFunctionCall("write", event.text); + jsFunctionCall("write", event.getText()); } private void finishReport() { @@ -254,13 +272,13 @@ private List> createTagList(List tags) { private void handleScenarioOutline(TestCase testCase) { TestSourcesModel.AstNode astNode = testSources.getAstNode(currentFeatureFile, testCase.getLine()); if (TestSourcesModel.isScenarioOutlineScenario(astNode)) { - ScenarioOutline scenarioOutline = (ScenarioOutline)TestSourcesModel.getScenarioDefinition(astNode); + ScenarioOutline scenarioOutline = (ScenarioOutline) TestSourcesModel.getScenarioDefinition(astNode); if (currentScenarioOutline == null || !currentScenarioOutline.equals(scenarioOutline)) { currentScenarioOutline = scenarioOutline; jsFunctionCall("scenarioOutline", createScenarioOutline(currentScenarioOutline)); addOutlineStepsToReport(scenarioOutline); } - Examples examples = (Examples)astNode.parent.node; + Examples examples = (Examples) astNode.parent.node; if (currentExamples == null || !currentExamples.equals(examples)) { currentExamples = examples; jsFunctionCall("examples", createExamples(currentExamples)); @@ -290,9 +308,9 @@ private void addOutlineStepsToReport(ScenarioOutline scenarioOutline) { if (step.getArgument() != null) { Node argument = step.getArgument(); if (argument instanceof DocString) { - stepMap.put("doc_string", createDocStringMap((DocString)argument)); + stepMap.put("doc_string", createDocStringMap((DocString) argument)); } else if (argument instanceof DataTable) { - stepMap.put("rows", createDataTableList((DataTable)argument)); + stepMap.put("rows", createDataTableList((DataTable) argument)); } } jsFunctionCall("step", stepMap); @@ -394,9 +412,9 @@ private Map createTestStep(PickleStepTestStep testStep) { if (!testStep.getStepArgument().isEmpty()) { Argument argument = testStep.getStepArgument().get(0); if (argument instanceof PickleString) { - stepMap.put("doc_string", createDocStringMap((PickleString)argument)); + stepMap.put("doc_string", createDocStringMap((PickleString) argument)); } else if (argument instanceof PickleTable) { - stepMap.put("rows", createDataTableList((PickleTable)argument)); + stepMap.put("rows", createDataTableList((PickleTable) argument)); } } TestSourcesModel.AstNode astNode = testSources.getAstNode(currentFeatureFile, testStep.getStepLine()); diff --git a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java index 8061073e9c..1672f715be 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java @@ -43,6 +43,8 @@ import static java.util.Locale.ROOT; public final class JSONFormatter implements EventListener { + private static final String before = "before"; + private static final String after = "after"; private String currentFeatureFile; private List> featureMaps = new ArrayList>(); private List> currentElementsList; @@ -115,19 +117,19 @@ public void setEventPublisher(EventPublisher publisher) { } private void handleTestSourceRead(TestSourceRead event) { - testSources.addTestSourceReadEvent(event.uri, event); + testSources.addTestSourceReadEvent(event.getUri(), event); } private void handleTestCaseStarted(TestCaseStarted event) { - if (currentFeatureFile == null || !currentFeatureFile.equals(event.testCase.getUri())) { - currentFeatureFile = event.testCase.getUri(); - Map currentFeatureMap = createFeatureMap(event.testCase); + if (currentFeatureFile == null || !currentFeatureFile.equals(event.getTestCase().getUri())) { + currentFeatureFile = event.getTestCase().getUri(); + Map currentFeatureMap = createFeatureMap(event.getTestCase()); featureMaps.add(currentFeatureMap); currentElementsList = (List>) currentFeatureMap.get("elements"); } currentTestCaseMap = createTestCase(event); - if (testSources.hasBackground(currentFeatureFile, event.testCase.getLine())) { - currentElementMap = createBackground(event.testCase); + if (testSources.hasBackground(currentFeatureFile, event.getTestCase().getLine())) { + currentElementMap = createBackground(event.getTestCase()); currentElementsList.add(currentElementMap); } else { currentElementMap = currentTestCaseMap; @@ -137,21 +139,21 @@ private void handleTestCaseStarted(TestCaseStarted event) { } private void handleTestStepStarted(TestStepStarted event) { - if (event.testStep instanceof PickleStepTestStep) { - PickleStepTestStep testStep = (PickleStepTestStep) event.testStep; + if (event.getTestStep() instanceof PickleStepTestStep) { + PickleStepTestStep testStep = (PickleStepTestStep) event.getTestStep(); if (isFirstStepAfterBackground(testStep)) { currentElementMap = currentTestCaseMap; currentStepsList = (List>) currentElementMap.get("steps"); } currentStepOrHookMap = createTestStep(testStep); //add beforeSteps list to current step - if (currentBeforeStepHookList.containsKey(HookType.Before.toString())) { - currentStepOrHookMap.put(HookType.Before.toString(), currentBeforeStepHookList.get(HookType.Before.toString())); + if (currentBeforeStepHookList.containsKey(before)) { + currentStepOrHookMap.put(before, currentBeforeStepHookList.get(before)); currentBeforeStepHookList.clear(); } currentStepsList.add(currentStepOrHookMap); - } else if(event.testStep instanceof HookTestStep) { - HookTestStep hookTestStep = (HookTestStep) event.testStep; + } else if(event.getTestStep() instanceof HookTestStep) { + HookTestStep hookTestStep = (HookTestStep) event.getTestStep(); currentStepOrHookMap = createHookStep(hookTestStep); addHookStepToTestCaseMap(currentStepOrHookMap, hookTestStep.getHookType()); } else { @@ -160,16 +162,16 @@ private void handleTestStepStarted(TestStepStarted event) { } private void handleWrite(WriteEvent event) { - addOutputToHookMap(event.text); + addOutputToHookMap(event.getText()); } private void handleEmbed(EmbedEvent event) { - addEmbeddingToHookMap(event.data, event.mimeType); + addEmbeddingToHookMap(event.getData(), event.getMimeType()); } private void handleTestStepFinished(TestStepFinished event) { - currentStepOrHookMap.put("match", createMatchMap(event.testStep, event.result)); - currentStepOrHookMap.put("result", createResultMap(event.result)); + currentStepOrHookMap.put("match", createMatchMap(event.getTestStep(), event.getResult())); + currentStepOrHookMap.put("result", createResultMap(event.getResult())); } private void finishReport() { @@ -304,24 +306,23 @@ private Map createHookStep(HookTestStep hookTestStep) { private void addHookStepToTestCaseMap(Map currentStepOrHookMap, HookType hookType) { String hookName; - if (hookType.toString().contains("after")) - hookName = "after"; + if (hookType == HookType.AFTER || hookType == HookType.AFTER_STEP) + hookName = after; else - hookName = "before"; - + hookName = before; Map mapToAddTo; switch (hookType) { - case Before: + case BEFORE: mapToAddTo = currentTestCaseMap; break; - case After: + case AFTER: mapToAddTo = currentTestCaseMap; break; - case BeforeStep: + case BEFORE_STEP: mapToAddTo = currentBeforeStepHookList; break; - case AfterStep: + case AFTER_STEP: mapToAddTo = currentStepsList.get(currentStepsList.size() - 1); break; default: diff --git a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java index 3e04cebf76..cae28ce10d 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JUnitFormatter.java @@ -117,16 +117,16 @@ public void setStrict(boolean strict) { } private void handleTestSourceRead(TestSourceRead event) { - testSources.addTestSourceReadEvent(event.uri, event); + testSources.addTestSourceReadEvent(event.getUri(), event); } private void handleTestCaseStarted(TestCaseStarted event) { - if (currentFeatureFile == null || !currentFeatureFile.equals(event.testCase.getUri())) { - currentFeatureFile = event.testCase.getUri(); + if (currentFeatureFile == null || !currentFeatureFile.equals(event.getTestCase().getUri())) { + currentFeatureFile = event.getTestCase().getUri(); previousTestCaseName = ""; exampleNumber = 1; } - testCase = new TestCase(event.testCase); + testCase = new TestCase(event.getTestCase()); root = testCase.createElement(document); testCase.writeElement(root); rootElement.appendChild(root); @@ -135,17 +135,17 @@ private void handleTestCaseStarted(TestCaseStarted event) { } private void handleTestStepFinished(TestStepFinished event) { - if (event.testStep instanceof PickleStepTestStep) { - testCase.steps.add((PickleStepTestStep) event.testStep); - testCase.results.add(event.result); + if (event.getTestStep() instanceof PickleStepTestStep) { + testCase.steps.add((PickleStepTestStep) event.getTestStep()); + testCase.results.add(event.getResult()); } } private void handleTestCaseFinished(TestCaseFinished event) { if (testCase.steps.isEmpty()) { - testCase.handleEmptyTestCase(document, root, event.result); + testCase.handleEmptyTestCase(document, root, event.getResult()); } else { - testCase.addTestCaseElement(document, root, event.result); + testCase.addTestCaseElement(document, root, event.getResult()); } } diff --git a/core/src/main/java/io/cucumber/core/plugin/Plugin.java b/core/src/main/java/io/cucumber/core/plugin/Plugin.java index 035721df09..82d0f3835c 100644 --- a/core/src/main/java/io/cucumber/core/plugin/Plugin.java +++ b/core/src/main/java/io/cucumber/core/plugin/Plugin.java @@ -1,5 +1,7 @@ package io.cucumber.core.plugin; +import org.apiguardian.api.API; + import java.io.File; import java.net.URI; import java.net.URL; @@ -32,5 +34,6 @@ *

      • {@link SummaryPrinter}
      • * */ +@API(status = API.Status.STABLE) public interface Plugin { } diff --git a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java index d4953828fe..677e6a9c55 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java @@ -119,23 +119,23 @@ public void setMonochrome(boolean monochrome) { } private void handleTestSourceRead(TestSourceRead event) { - testSources.addTestSourceReadEvent(event.uri, event); + testSources.addTestSourceReadEvent(event.getUri(), event); } private void handleTestCaseStarted(TestCaseStarted event) { handleStartOfFeature(event); handleScenarioOutline(event); - if (testSources.hasBackground(currentFeatureFile, event.testCase.getLine())) { - printBackground(event.testCase); - currentTestCase = event.testCase; + if (testSources.hasBackground(currentFeatureFile, event.getTestCase().getLine())) { + printBackground(event.getTestCase()); + currentTestCase = event.getTestCase(); } else { - printScenarioDefinition(event.testCase); + printScenarioDefinition(event.getTestCase()); } } private void handleTestStepStarted(TestStepStarted event) { - if (event.testStep instanceof PickleStepTestStep) { - if (isFirstStepAfterBackground((PickleStepTestStep) event.testStep)) { + if (event.getTestStep() instanceof PickleStepTestStep) { + if (isFirstStepAfterBackground((PickleStepTestStep) event.getTestStep())) { printScenarioDefinition(currentTestCase); currentTestCase = null; } @@ -143,14 +143,14 @@ private void handleTestStepStarted(TestStepStarted event) { } private void handleTestStepFinished(TestStepFinished event) { - if (event.testStep instanceof PickleStepTestStep) { - printStep((PickleStepTestStep) event.testStep, event.result); + if (event.getTestStep() instanceof PickleStepTestStep) { + printStep((PickleStepTestStep) event.getTestStep(), event.getResult()); } - printError(event.result); + printError(event.getResult()); } private void handleWrite(WriteEvent event) { - out.println(event.text); + out.println(event.getText()); } private void finishReport() { @@ -158,17 +158,17 @@ private void finishReport() { } private void handleStartOfFeature(TestCaseStarted event) { - if (currentFeatureFile == null || !currentFeatureFile.equals(event.testCase.getUri())) { + if (currentFeatureFile == null || !currentFeatureFile.equals(event.getTestCase().getUri())) { if (currentFeatureFile != null) { out.println(); } - currentFeatureFile = event.testCase.getUri(); + currentFeatureFile = event.getTestCase().getUri(); printFeature(currentFeatureFile); } } private void handleScenarioOutline(TestCaseStarted event) { - TestSourcesModel.AstNode astNode = testSources.getAstNode(currentFeatureFile, event.testCase.getLine()); + TestSourcesModel.AstNode astNode = testSources.getAstNode(currentFeatureFile, event.getTestCase().getLine()); if (TestSourcesModel.isScenarioOutlineScenario(astNode)) { ScenarioOutline scenarioOutline = (ScenarioOutline)TestSourcesModel.getScenarioDefinition(astNode); if (currentScenarioOutline == null || !currentScenarioOutline.equals(scenarioOutline)) { diff --git a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java index 22cf217abd..2be839d27c 100644 --- a/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/ProgressFormatter.java @@ -50,7 +50,6 @@ public void receive(TestRunFinished event) { } }; - @SuppressWarnings("WeakerAccess") // Used by PluginFactory public ProgressFormatter(Appendable appendable) { out = new NiceAppendable(appendable); } @@ -68,11 +67,11 @@ public void setEventPublisher(EventPublisher publisher) { } private void handleTestStepFinished(TestStepFinished event) { - if (event.testStep instanceof PickleStepTestStep || event.result.getStatus().is(Status.FAILED)) { + if (event.getTestStep() instanceof PickleStepTestStep || event.getResult().getStatus().is(Status.FAILED)) { if (!monochrome) { - ANSI_ESCAPES.get(event.result.getStatus()).appendTo(out); + ANSI_ESCAPES.get(event.getResult().getStatus()).appendTo(out); } - out.append(CHARS.get(event.result.getStatus())); + out.append(CHARS.get(event.getResult().getStatus())); if (!monochrome) { AnsiEscapes.RESET.appendTo(out); } @@ -80,7 +79,7 @@ private void handleTestStepFinished(TestStepFinished event) { } private void handleWrite(WriteEvent event) { - out.append(event.text); + out.append(event.getText()); } private void handleTestRunFinished() { diff --git a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java index 6ae0e82497..e6c51a9f8b 100644 --- a/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/RerunFormatter.java @@ -37,8 +37,8 @@ public void receive(TestRunFinished event) { @Override public void receive(TestCaseFinished event) { - if (!event.result.getStatus().isOk(isStrict)) { - recordTestFailed(event.testCase); + if (!event.getResult().getStatus().isOk(isStrict)) { + recordTestFailed(event.getTestCase()); } } diff --git a/core/src/main/java/io/cucumber/core/plugin/Stats.java b/core/src/main/java/io/cucumber/core/plugin/Stats.java index ffe780dfec..510f109ce6 100755 --- a/core/src/main/java/io/cucumber/core/plugin/Stats.java +++ b/core/src/main/java/io/cucumber/core/plugin/Stats.java @@ -45,11 +45,11 @@ public void receive(TestRunStarted event) { private final EventHandler stepFinishedHandler = new EventHandler() { @Override public void receive(TestStepFinished event) { - Result result = event.result; + Result result = event.getResult(); if (result.getError() != null) { addError(result.getError()); } - if (event.testStep instanceof PickleStepTestStep) { + if (event.getTestStep() instanceof PickleStepTestStep) { addStep(result.getStatus()); } } @@ -57,7 +57,7 @@ public void receive(TestStepFinished event) { private final EventHandler testCaseFinishedHandler = new EventHandler() { @Override public void receive(TestCaseFinished event) { - addScenario(event.result.getStatus(), event.testCase.getScenarioDesignation()); + addScenario(event.getResult().getStatus(), event.getTestCase().getScenarioDesignation()); } }; private final EventHandler testRunFinishedHandler = new EventHandler() { diff --git a/core/src/main/java/io/cucumber/core/plugin/StrictAware.java b/core/src/main/java/io/cucumber/core/plugin/StrictAware.java index cdbbf00767..42b1992ee6 100755 --- a/core/src/main/java/io/cucumber/core/plugin/StrictAware.java +++ b/core/src/main/java/io/cucumber/core/plugin/StrictAware.java @@ -1,8 +1,11 @@ package io.cucumber.core.plugin; +import org.apiguardian.api.API; + /** * Interface for Plugins that need to know if the Runtime is strict. */ +@API(status = API.Status.STABLE) public interface StrictAware extends Plugin { /** * When set to strict the plugin should indicate failure for undefined and pending steps diff --git a/core/src/main/java/io/cucumber/core/plugin/SummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/SummaryPrinter.java index 45db5edf00..66a26755a7 100644 --- a/core/src/main/java/io/cucumber/core/plugin/SummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/SummaryPrinter.java @@ -1,10 +1,13 @@ package io.cucumber.core.plugin; +import org.apiguardian.api.API; + /** * Interface for plugins that print a summary after test execution. * * @see Plugin */ +@API(status = API.Status.STABLE) public interface SummaryPrinter extends Plugin { } diff --git a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java index fcf2ec734e..5e5ab0045b 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestNGFormatter.java @@ -119,30 +119,30 @@ public void setStrict(boolean strict) { } private void handleTestSourceRead(TestSourceRead event) { - testSources.addTestSourceReadEvent(event.uri, event); + testSources.addTestSourceReadEvent(event.getUri(), event); } private void handleTestCaseStarted(TestCaseStarted event) { - if (currentFeatureFile == null || !currentFeatureFile.equals(event.testCase.getUri())) { - currentFeatureFile = event.testCase.getUri(); + if (currentFeatureFile == null || !currentFeatureFile.equals(event.getTestCase().getUri())) { + currentFeatureFile = event.getTestCase().getUri(); previousTestCaseName = ""; exampleNumber = 1; clazz = document.createElement("class"); - clazz.setAttribute("name", testSources.getFeature(event.testCase.getUri()).getName()); + clazz.setAttribute("name", testSources.getFeature(event.getTestCase().getUri()).getName()); test.appendChild(clazz); } root = document.createElement("test-method"); clazz.appendChild(root); - testCase = new TestCase(event.testCase); + testCase = new TestCase(event.getTestCase()); testCase.start(root); } private void handleTestStepFinished(TestStepFinished event) { - if (event.testStep instanceof PickleStepTestStep) { - testCase.steps.add((PickleStepTestStep) event.testStep); - testCase.results.add(event.result); + if (event.getTestStep() instanceof PickleStepTestStep) { + testCase.steps.add((PickleStepTestStep) event.getTestStep()); + testCase.results.add(event.getResult()); } else { - testCase.hooks.add(event.result); + testCase.hooks.add(event.getResult()); } } diff --git a/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java b/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java index dded4c74ee..735ec2b738 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java +++ b/core/src/main/java/io/cucumber/core/plugin/TestSourcesModel.java @@ -121,7 +121,7 @@ String getKeywordFromSource(String uri, int stepLine) { Feature feature = getFeature(uri); if (feature != null) { TestSourceRead event = getTestSourceReadEvent(uri); - String trimmedSourceLine = event.source.split("\n")[stepLine - 1].trim(); + String trimmedSourceLine = event.getSource().split("\n")[stepLine - 1].trim(); GherkinDialect dialect = new GherkinDialectProvider(feature.getLanguage()).getDefaultDialect(); for (String keyword : dialect.getStepKeywords()) { if (trimmedSourceLine.startsWith(keyword)) { @@ -154,7 +154,7 @@ private void parseGherkinSource(String path) { Parser parser = new Parser(new AstBuilder()); TokenMatcher matcher = new TokenMatcher(); try { - GherkinDocument gherkinDocument = parser.parse(pathToReadEventMap.get(path).source, matcher); + GherkinDocument gherkinDocument = parser.parse(pathToReadEventMap.get(path).getSource(), matcher); pathToAstMap.put(path, gherkinDocument); Map nodeMap = new HashMap(); AstNode currentParent = new AstNode(gherkinDocument.getFeature(), null); diff --git a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index 52cc0cb650..f7e42657b8 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -49,7 +49,7 @@ public final class TimelineFormatter implements ConcurrentEventListener { private final EventHandler testSourceReadHandler = new EventHandler() { @Override public void receive(TestSourceRead event) { - testSources.addTestSourceReadEvent(event.uri, event); + testSources.addTestSourceReadEvent(event.getUri(), event); } }; private final EventHandler caseStartedHandler = new EventHandler() { @@ -237,7 +237,7 @@ private String buildTagsValue(final TestCase testCase) { public void end(final TestCaseFinished event) { this.endTime = event.getInstant(); - this.className = event.result.getStatus().name().toLowerCase(ROOT); + this.className = event.getResult().getStatus().name().toLowerCase(ROOT); } } diff --git a/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java index 22cea30c16..2ec7f6672a 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java +++ b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java @@ -32,13 +32,13 @@ final class UndefinedStepsTracker implements EventListener { private EventHandler testSourceReadHandler = new EventHandler() { @Override public void receive(TestSourceRead event) { - pathToSourceMap.put(event.uri, event.source); + pathToSourceMap.put(event.getUri(), event.getSource()); } }; private EventHandler snippetsSuggestedHandler = new EventHandler() { @Override public void receive(SnippetsSuggestedEvent event) { - handleSnippetsSuggested(event.uri, event.stepLocations, event.snippets); + handleSnippetsSuggested(event.getUri(), event.getStepLocations(), event.getSnippets()); } }; diff --git a/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java b/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java index f12363369d..e0772f2b75 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinter.java @@ -13,13 +13,13 @@ public class UnusedStepsSummaryPrinter implements ColorAware, EventListener, Sum private EventHandler stepDefinedHandler = new EventHandler() { @Override public void receive(StepDefinedEvent event) { - unusedSteps.put(event.stepDefinition.getLocation(false), event.stepDefinition.getPattern()); + unusedSteps.put(event.getStepDefinition().getLocation(false), event.getStepDefinition().getPattern()); } }; private EventHandler testStepFinishedHandler = new EventHandler() { @Override public void receive(TestStepFinished event) { - String codeLocation = event.testStep.getCodeLocation(); + String codeLocation = event.getTestStep().getCodeLocation(); if (codeLocation != null) { unusedSteps.remove(codeLocation); } diff --git a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java index 2eb049ea14..cc0c9b0352 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/UsageFormatter.java @@ -60,9 +60,9 @@ public void setEventPublisher(EventPublisher publisher) { } void handleTestStepFinished(TestStepFinished event) { - if (event.testStep instanceof PickleStepTestStep && event.result.getStatus().is(Status.PASSED)) { - PickleStepTestStep testStep = (PickleStepTestStep) event.testStep; - addUsageEntry(event.result, testStep); + if (event.getTestStep() instanceof PickleStepTestStep && event.getResult().getStatus().is(Status.PASSED)) { + PickleStepTestStep testStep = (PickleStepTestStep) event.getTestStep(); + addUsageEntry(event.getResult(), testStep); } } diff --git a/core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java index 6fb30f9b6a..2d0c9a6147 100644 --- a/core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/HookDefinitionMatch.java @@ -2,7 +2,6 @@ import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.backend.StepDefinitionMatch; final class HookDefinitionMatch implements StepDefinitionMatch { private final HookDefinition hookDefinition; diff --git a/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java index a2bc994c68..991f0f3127 100644 --- a/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java @@ -2,7 +2,6 @@ import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.backend.StepDefinitionMatch; import io.cucumber.core.exception.CucumberException; import gherkin.pickles.PickleStep; import io.cucumber.cucumberexpressions.CucumberExpressionException; diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index 1c9d7fbdc8..f0a1698b1c 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -103,11 +103,11 @@ private void addTestStepsForPickleSteps(List testSteps, Pick } private void addTestStepsForBeforeHooks(List testSteps, List tags) { - addTestStepsForHooks(testSteps, tags, glue.getBeforeHooks(), HookType.Before); + addTestStepsForHooks(testSteps, tags, glue.getBeforeHooks(), HookType.BEFORE); } private void addTestStepsForAfterHooks(List testSteps, List tags) { - addTestStepsForHooks(testSteps, tags, glue.getAfterHooks(), HookType.After); + addTestStepsForHooks(testSteps, tags, glue.getAfterHooks(), HookType.AFTER); } private void addTestStepsForHooks(List testSteps, List tags, List hooks, HookType hookType) { @@ -121,13 +121,13 @@ private void addTestStepsForHooks(List testSteps, List private List getAfterStepHooks(List tags) { List hookSteps = new ArrayList<>(); - addTestStepsForHooks(hookSteps, tags, glue.getAfterStepHooks(), HookType.AfterStep); + addTestStepsForHooks(hookSteps, tags, glue.getAfterStepHooks(), HookType.AFTER_STEP); return hookSteps; } private List getBeforeStepHooks(List tags) { List hookSteps = new ArrayList<>(); - addTestStepsForHooks(hookSteps, tags, glue.getBeforeStepHooks(), HookType.BeforeStep); + addTestStepsForHooks(hookSteps, tags, glue.getBeforeStepHooks(), HookType.BEFORE_STEP); return hookSteps; } diff --git a/core/src/main/java/io/cucumber/core/runner/Scenario.java b/core/src/main/java/io/cucumber/core/runner/Scenario.java index 524372b815..706e332a48 100644 --- a/core/src/main/java/io/cucumber/core/runner/Scenario.java +++ b/core/src/main/java/io/cucumber/core/runner/Scenario.java @@ -32,16 +32,6 @@ void add(Result result) { stepResults.add(result); } - @Override - public Collection getSourceTagNames() { - Set result = new HashSet<>(); - for (PickleTag tag : testCase.getTags()) { - result.add(tag.getName()); - } - // Has to be a List in order for JRuby to convert to Ruby Array. - return new ArrayList<>(result); - } - @Override public Status getStatus() { if (stepResults.isEmpty()) { diff --git a/core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/StepDefinitionMatch.java similarity index 71% rename from core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java rename to core/src/main/java/io/cucumber/core/runner/StepDefinitionMatch.java index c9a04f08dc..a2513c8c52 100644 --- a/core/src/main/java/io/cucumber/core/backend/StepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/StepDefinitionMatch.java @@ -1,8 +1,8 @@ -package io.cucumber.core.backend; +package io.cucumber.core.runner; import io.cucumber.core.api.Scenario; -public interface StepDefinitionMatch { +interface StepDefinitionMatch { void runStep(Scenario scenario) throws Throwable; void dryRunStep(Scenario scenario) throws Throwable; diff --git a/core/src/main/java/io/cucumber/core/runner/TestStep.java b/core/src/main/java/io/cucumber/core/runner/TestStep.java index e686fd7c40..72aa001898 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/TestStep.java @@ -6,7 +6,6 @@ import io.cucumber.core.event.TestCase; import io.cucumber.core.event.TestStepFinished; import io.cucumber.core.event.TestStepStarted; -import io.cucumber.core.backend.StepDefinitionMatch; import io.cucumber.core.eventbus.EventBus; import java.time.Duration; diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 0441d94f28..46ea84f20d 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -297,7 +297,7 @@ static final class ExitStatus implements ConcurrentEventListener { private final EventHandler testCaseFinishedHandler = new EventHandler() { @Override public void receive(TestCaseFinished event) { - results.add(event.result); + results.add(event.getResult()); } }; diff --git a/core/src/test/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinterTest.java b/core/src/test/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinterTest.java index 45c1b77d14..3a7abaae09 100644 --- a/core/src/test/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UnusedStepsSummaryPrinterTest.java @@ -1,8 +1,12 @@ package io.cucumber.core.plugin; import java.time.Clock; +import java.time.Duration; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.StepDefinedEvent; +import io.cucumber.core.event.TestCase; import io.cucumber.core.event.TestRunFinished; import io.cucumber.core.event.TestStep; import io.cucumber.core.event.TestStepFinished; @@ -25,7 +29,7 @@ public void verifyUnusedStepsPrinted() { // Register two steps, use one, then finish the test run bus.send(new StepDefinedEvent(bus.getInstant(), mockStepDef("my/belly.feature:3", "a few cukes"))); bus.send(new StepDefinedEvent(bus.getInstant(), mockStepDef("my/tummy.feature:5", "some more cukes"))); - bus.send(new TestStepFinished(bus.getInstant(), null, mockTestStep("my/belly.feature:3"), null)); + bus.send(new TestStepFinished(bus.getInstant(), mock(TestCase.class), mockTestStep("my/belly.feature:3"), new Result(Status.UNUSED, Duration.ZERO, null))); bus.send(new TestRunFinished(bus.getInstant())); // Verify produced output diff --git a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index 1d9ad6c4d9..1535ede275 100644 --- a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -13,6 +13,7 @@ import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.eventbus.EventBus; +import io.cucumber.core.runtime.TimeServiceEventBus; import io.cucumber.core.stepexpression.ArgumentMatcher; import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; import io.cucumber.core.stepexpression.StepExpression; @@ -21,6 +22,7 @@ import io.cucumber.datatable.DataTable; import org.junit.Test; +import java.time.Clock; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -41,7 +43,7 @@ public class CachingGlueTest { private final TypeRegistry typeRegistry = new TypeRegistry(ENGLISH); - private CachingGlue glue = new CachingGlue(mock(EventBus.class), typeRegistry); + private CachingGlue glue = new CachingGlue(new TimeServiceEventBus(Clock.systemUTC()), typeRegistry); @Test public void throws_duplicate_error_on_dupe_stepdefs() { diff --git a/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java index a11a24f9df..2b9dcf6322 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTestStepTest.java @@ -36,7 +36,7 @@ public class HookTestStepTest { ); private final EventBus bus = mock(EventBus.class); private final Scenario scenario = new Scenario(bus, testCase); - private HookTestStep step = new HookTestStep(HookType.AfterStep, definitionMatch); + private HookTestStep step = new HookTestStep(HookType.AFTER_STEP, definitionMatch); @Before public void init() { diff --git a/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java index a55b0bccf5..5b4de3fd3f 100644 --- a/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java +++ b/core/src/test/java/io/cucumber/core/runner/PickleStepTestStepTest.java @@ -21,8 +21,8 @@ import java.util.Collections; import java.util.List; -import static io.cucumber.core.event.HookType.AfterStep; -import static io.cucumber.core.event.HookType.BeforeStep; +import static io.cucumber.core.event.HookType.AFTER_STEP; +import static io.cucumber.core.event.HookType.BEFORE_STEP; import static io.cucumber.core.event.Status.FAILED; import static io.cucumber.core.event.Status.PASSED; import static io.cucumber.core.event.Status.SKIPPED; @@ -54,8 +54,8 @@ public class PickleStepTestStepTest { private final PickleStepDefinitionMatch definitionMatch = mock(PickleStepDefinitionMatch.class); private HookDefinition afterHookDefinition = mock(HookDefinition.class); private HookDefinition beforeHookDefinition = mock(HookDefinition.class); - private final HookTestStep beforeHook = new HookTestStep(BeforeStep, new HookDefinitionMatch(beforeHookDefinition)); - private final HookTestStep afterHook = new HookTestStep(AfterStep, new HookDefinitionMatch(afterHookDefinition)); + private final HookTestStep beforeHook = new HookTestStep(BEFORE_STEP, new HookDefinitionMatch(beforeHookDefinition)); + private final HookTestStep afterHook = new HookTestStep(AFTER_STEP, new HookDefinitionMatch(afterHookDefinition)); private final PickleStepTestStep step = new PickleStepTestStep( "uri", mock(PickleStep.class), @@ -131,7 +131,7 @@ public void result_is_result_from_hook_when_before_step_hook_does_not_pass() thr ArgumentCaptor captor = forClass(TestCaseEvent.class); verify(bus, times(6)).send(captor.capture()); List allValues = captor.getAllValues(); - assertEquals(failure, ((TestStepFinished) allValues.get(1)).result); + assertEquals(failure, ((TestStepFinished) allValues.get(1)).getResult()); } @Test @@ -146,7 +146,7 @@ public void result_is_result_from_step_when_step_hook_does_not_pass() throws Thr ArgumentCaptor captor = forClass(TestCaseEvent.class); verify(bus, times(6)).send(captor.capture()); List allValues = captor.getAllValues(); - assertEquals(failure, ((TestStepFinished) allValues.get(3)).result); + assertEquals(failure, ((TestStepFinished) allValues.get(3)).getResult()); } @Test @@ -161,7 +161,7 @@ public void result_is_result_from_hook_when_after_step_hook_does_not_pass() thro ArgumentCaptor captor = forClass(TestCaseEvent.class); verify(bus, times(6)).send(captor.capture()); List allValues = captor.getAllValues(); - assertEquals(failure, ((TestStepFinished) allValues.get(5)).result); + assertEquals(failure, ((TestStepFinished) allValues.get(5)).getResult()); } @Test @@ -250,7 +250,7 @@ public void step_execution_time_is_measured() { assertEquals(ofEpochMilli(234L), started.getInstant()); assertEquals(ofEpochMilli(1234L), finished.getInstant()); - assertEquals(ofMillis(1000L), finished.result.getDuration()); + assertEquals(ofMillis(1000L), finished.getResult().getDuration()); } } diff --git a/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java index ed5a275b78..544314ae89 100644 --- a/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java +++ b/core/src/test/java/io/cucumber/core/runner/ScenarioResultTest.java @@ -6,9 +6,11 @@ import io.cucumber.core.event.WriteEvent; import gherkin.events.PickleEvent; import io.cucumber.core.eventbus.EventBus; +import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentMatcher; +import java.time.Instant; import java.util.Arrays; import java.util.Collections; @@ -21,6 +23,7 @@ import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; public class ScenarioResultTest { @@ -36,6 +39,11 @@ public class ScenarioResultTest { ) ); + @Before + public void setup(){ + when(bus.getInstant()).thenReturn(Instant.now()); + } + @Test public void no_steps_is_undefined() { assertEquals(Status.UNDEFINED, s.getStatus()); @@ -132,7 +140,7 @@ private final class EmbedEventMatcher implements ArgumentMatcher { @Override public boolean matches(EmbedEvent argument) { return (argument != null && - Arrays.equals(argument.data, data) && argument.mimeType.equals(mimeType)); + Arrays.equals(argument.getData(), data) && argument.getMimeType().equals(mimeType)); } } @@ -145,7 +153,7 @@ private final class WriteEventMatcher implements ArgumentMatcher { @Override public boolean matches(WriteEvent argument) { - return (argument != null && argument.text.equals(text)); + return (argument != null && argument.getText().equals(text)); } } } \ No newline at end of file diff --git a/core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java b/core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java index 09ab99aee7..a930bf2819 100644 --- a/core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java @@ -1,7 +1,6 @@ package io.cucumber.core.runner; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.backend.StepDefinitionMatch; import io.cucumber.core.runtime.StubStepDefinition; import io.cucumber.core.stepexpression.TypeRegistry; import gherkin.pickles.PickleCell; diff --git a/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java index e673ea1c9f..83ff839795 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java +++ b/core/src/test/java/io/cucumber/core/runner/TestCaseTest.java @@ -18,8 +18,8 @@ import java.time.Instant; import java.util.Collections; -import static io.cucumber.core.event.HookType.AfterStep; -import static io.cucumber.core.event.HookType.BeforeStep; +import static io.cucumber.core.event.HookType.AFTER_STEP; +import static io.cucumber.core.event.HookType.BEFORE_STEP; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.mockito.ArgumentMatchers.isA; @@ -46,8 +46,8 @@ public void init() { private final PickleStepTestStep testStep1 = new PickleStepTestStep( "uri", mock(PickleStep.class), - singletonList(new HookTestStep(BeforeStep, new HookDefinitionMatch(beforeStep1HookDefinition1))), - singletonList(new HookTestStep(AfterStep, new HookDefinitionMatch(afterStep1HookDefinition1))), + singletonList(new HookTestStep(BEFORE_STEP, new HookDefinitionMatch(beforeStep1HookDefinition1))), + singletonList(new HookTestStep(AFTER_STEP, new HookDefinitionMatch(afterStep1HookDefinition1))), definitionMatch1 ); @@ -58,8 +58,8 @@ public void init() { private final PickleStepTestStep testStep2 = new PickleStepTestStep( "uri", mock(PickleStep.class), - singletonList(new HookTestStep(BeforeStep, new HookDefinitionMatch(beforeStep1HookDefinition2))), - singletonList(new HookTestStep(AfterStep, new HookDefinitionMatch(afterStep1HookDefinition2))), + singletonList(new HookTestStep(BEFORE_STEP, new HookDefinitionMatch(beforeStep1HookDefinition2))), + singletonList(new HookTestStep(AFTER_STEP, new HookDefinitionMatch(afterStep1HookDefinition2))), definitionMatch2 ); diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index 3eb94ddde5..f25ff87f9e 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -302,7 +302,7 @@ public void loadGlue(Glue glue, List gluePaths) { mockMatch(glue, step.getText()); } } - mockHook(glue, beforeHook, HookType.Before); + mockHook(glue, beforeHook, HookType.BEFORE); } }; } @@ -565,7 +565,7 @@ public void setEventPublisher(EventPublisher publisher) { publisher.registerHandlerFor(StepDefinedEvent.class, new EventHandler() { @Override public void receive(StepDefinedEvent event) { - stepDefinedEvents.add(event.stepDefinition); + stepDefinedEvents.add(event.getStepDefinition()); } }); } @@ -723,16 +723,16 @@ private void mockMatch(Glue glue, String text) { private void mockHook(Glue glue, HookDefinition hook, HookType hookType) { switch (hookType) { - case Before: + case BEFORE: glue.addBeforeHook(hook); return; - case After: + case AFTER: glue.addAfterHook(hook); return; - case AfterStep: + case AFTER_STEP: glue.addAfterStepHook(hook); return; - case BeforeStep: + case BEFORE_STEP: glue.addBeforeStepHook(hook); return; default: diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 0c090b80ec..7ea0beb2b8 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -2,6 +2,7 @@ import io.cucumber.core.event.EventHandler; +import io.cucumber.core.event.TestCase; import io.cucumber.core.event.TestCaseStarted; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.io.ClassFinder; @@ -12,6 +13,7 @@ import io.cucumber.core.runner.Runner; import org.junit.Before; import org.junit.Test; +import org.mockito.Mockito; import java.time.Clock; @@ -22,6 +24,7 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; public class ThreadLocalRunnerSupplierTest { @@ -95,6 +98,6 @@ public void receive(TestCaseStarted event) { fail(); } }); - eventBus.send(new TestCaseStarted(EPOCH, null)); + eventBus.send(new TestCaseStarted(EPOCH, mock(TestCase.class))); } } \ No newline at end of file diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 3463ef30e4..52ae39f414 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -86,7 +86,7 @@ public Collection get() { bus.registerHandlerFor(TestStepFinished.class, new EventHandler() { @Override public void receive(TestStepFinished event) { - latestReceivedResult = event.result; + latestReceivedResult = event.getResult(); } }); } diff --git a/junit/src/main/java/io/cucumber/junit/JUnitReporter.java b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java index 023cf0ee5d..6750c815c5 100644 --- a/junit/src/main/java/io/cucumber/junit/JUnitReporter.java +++ b/junit/src/main/java/io/cucumber/junit/JUnitReporter.java @@ -41,8 +41,8 @@ public void receive(TestCaseStarted event) { @Override public void receive(TestStepStarted event) { - if (event.testStep instanceof PickleStepTestStep) { - PickleStepTestStep testStep = (PickleStepTestStep) event.testStep; + if (event.getTestStep() instanceof PickleStepTestStep) { + PickleStepTestStep testStep = (PickleStepTestStep) event.getTestStep(); handleStepStarted(testStep.getPickleStep()); } } @@ -52,11 +52,11 @@ public void receive(TestStepStarted event) { @Override public void receive(TestStepFinished event) { - if (event.testStep instanceof PickleStepTestStep) { - PickleStepTestStep testStep = (PickleStepTestStep) event.testStep; - handleStepResult(testStep, event.result); + if (event.getTestStep() instanceof PickleStepTestStep) { + PickleStepTestStep testStep = (PickleStepTestStep) event.getTestStep(); + handleStepResult(testStep, event.getResult()); } else { - handleHookResult(event.result); + handleHookResult(event.getResult()); } } @@ -65,7 +65,7 @@ public void receive(TestStepFinished event) { @Override public void receive(TestCaseFinished event) { - handleTestCaseResult(event.result); + handleTestCaseResult(event.getResult()); } }; diff --git a/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java b/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java index ddab133851..d650bb0e6f 100644 --- a/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java +++ b/testng/src/main/java/io/cucumber/testng/TestCaseResultListener.java @@ -17,7 +17,7 @@ class TestCaseResultListener { private final EventHandler testCaseFinishedHandler = new EventHandler() { @Override public void receive(TestCaseFinished event) { - receiveResult(event.result); + receiveResult(event.getResult()); } }; From ee3e671bf17af5cf9ae3ca715020457c39f41f21 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 29 Jun 2019 23:17:59 +0200 Subject: [PATCH 109/155] [Core] Remove gherkin classes from public API --- .../core/event/SnippetsSuggestedEvent.java | 26 +++++++-- .../java/io/cucumber/core/event/TestCase.java | 3 +- .../cucumber/core/plugin/HTMLFormatter.java | 57 +++++++++---------- .../cucumber/core/plugin/JSONFormatter.java | 49 ++++++++-------- .../cucumber/core/plugin/PrettyFormatter.java | 6 +- .../core/plugin/TimelineFormatter.java | 5 +- .../core/plugin/UndefinedStepsTracker.java | 23 ++++---- .../java/io/cucumber/core/runner/Runner.java | 8 ++- .../io/cucumber/core/runner/TestCase.java | 10 +++- .../plugin/UndefinedStepsTrackerTest.java | 8 +-- 10 files changed, 107 insertions(+), 88 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/event/SnippetsSuggestedEvent.java b/core/src/main/java/io/cucumber/core/event/SnippetsSuggestedEvent.java index 19d56cf6fc..c881e0b972 100644 --- a/core/src/main/java/io/cucumber/core/event/SnippetsSuggestedEvent.java +++ b/core/src/main/java/io/cucumber/core/event/SnippetsSuggestedEvent.java @@ -1,6 +1,5 @@ package io.cucumber.core.event; -import gherkin.pickles.PickleLocation; import org.apiguardian.api.API; import java.time.Instant; @@ -11,10 +10,10 @@ @API(status = API.Status.STABLE) public final class SnippetsSuggestedEvent extends TimeStampedEvent { private final String uri; - private final List stepLocations; + private final List stepLocations; private final List snippets; - public SnippetsSuggestedEvent(Instant timeInstant, String uri, List stepLocations, List snippets) { + public SnippetsSuggestedEvent(Instant timeInstant, String uri, List stepLocations, List snippets) { super(timeInstant); this.uri = Objects.requireNonNull(uri); this.stepLocations = Objects.requireNonNull(stepLocations); @@ -25,11 +24,30 @@ public String getUri() { return uri; } - public List getStepLocations() { + public List getStepLocations() { return stepLocations; } public List getSnippets() { return snippets; } + + public static final class Location { + private final int line; + private final int column; + + public Location(int line, int column) { + this.line = line; + this.column = column; + } + + public int getLine() { + return line; + } + + public int getColumn() { + return column; + } + } + } diff --git a/core/src/main/java/io/cucumber/core/event/TestCase.java b/core/src/main/java/io/cucumber/core/event/TestCase.java index 38298ff3ef..eb3a65821e 100644 --- a/core/src/main/java/io/cucumber/core/event/TestCase.java +++ b/core/src/main/java/io/cucumber/core/event/TestCase.java @@ -1,6 +1,5 @@ package io.cucumber.core.event; -import gherkin.pickles.PickleTag; import org.apiguardian.api.API; import java.util.List; @@ -19,7 +18,7 @@ public interface TestCase { String getScenarioDesignation(); - List getTags(); + List getTags(); List getTestSteps(); diff --git a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index c893243fa8..454370319e 100644 --- a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -19,7 +19,6 @@ import gherkin.pickles.PickleRow; import gherkin.pickles.PickleString; import gherkin.pickles.PickleTable; -import gherkin.pickles.PickleTag; import io.cucumber.core.event.EmbedEvent; import io.cucumber.core.event.EventHandler; import io.cucumber.core.event.EventPublisher; @@ -50,7 +49,7 @@ import java.util.List; import java.util.Map; -import static java.util.Locale.ENGLISH; +import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Locale.ROOT; public final class HTMLFormatter implements EventListener { @@ -246,7 +245,7 @@ private void handleStartOfFeature(TestCase testCase) { } private Map createFeature(TestCase testCase) { - Map featureMap = new HashMap(); + Map featureMap = new HashMap<>(); Feature feature = testSources.getFeature(testCase.getUri()); if (feature != null) { featureMap.put("keyword", feature.getKeyword()); @@ -260,9 +259,9 @@ private Map createFeature(TestCase testCase) { } private List> createTagList(List tags) { - List> tagList = new ArrayList>(); + List> tagList = new ArrayList<>(); for (Tag tag : tags) { - Map tagMap = new HashMap(); + Map tagMap = new HashMap<>(); tagMap.put("name", tag.getName()); tagList.add(tagMap); } @@ -290,7 +289,7 @@ private void handleScenarioOutline(TestCase testCase) { } private Map createScenarioOutline(ScenarioOutline scenarioOutline) { - Map scenarioOutlineMap = new HashMap(); + Map scenarioOutlineMap = new HashMap<>(); scenarioOutlineMap.put("name", scenarioOutline.getName()); scenarioOutlineMap.put("keyword", scenarioOutline.getKeyword()); scenarioOutlineMap.put("description", scenarioOutline.getDescription() != null ? scenarioOutline.getDescription() : ""); @@ -302,7 +301,7 @@ private Map createScenarioOutline(ScenarioOutline scenarioOutlin private void addOutlineStepsToReport(ScenarioOutline scenarioOutline) { for (Step step : scenarioOutline.getSteps()) { - Map stepMap = new HashMap(); + Map stepMap = new HashMap<>(); stepMap.put("name", step.getText()); stepMap.put("keyword", step.getKeyword()); if (step.getArgument() != null) { @@ -318,13 +317,13 @@ private void addOutlineStepsToReport(ScenarioOutline scenarioOutline) { } private Map createDocStringMap(DocString docString) { - Map docStringMap = new HashMap(); + Map docStringMap = new HashMap<>(); docStringMap.put("value", docString.getContent()); return docStringMap; } private List> createDataTableList(DataTable dataTable) { - List> rowList = new ArrayList>(); + List> rowList = new ArrayList<>(); for (TableRow row : dataTable.getRows()) { rowList.add(createRowMap(row)); } @@ -332,13 +331,13 @@ private List> createDataTableList(DataTable dataTable) { } private Map createRowMap(TableRow row) { - Map rowMap = new HashMap(); + Map rowMap = new HashMap<>(); rowMap.put("cells", createCellList(row)); return rowMap; } private List createCellList(TableRow row) { - List cells = new ArrayList(); + List cells = new ArrayList<>(); for (TableCell cell : row.getCells()) { cells.add(cell.getValue()); } @@ -346,11 +345,11 @@ private List createCellList(TableRow row) { } private Map createExamples(Examples examples) { - Map examplesMap = new HashMap(); + Map examplesMap = new HashMap<>(); examplesMap.put("name", examples.getName()); examplesMap.put("keyword", examples.getKeyword()); examplesMap.put("description", examples.getDescription() != null ? examples.getDescription() : ""); - List> rowList = new ArrayList>(); + List> rowList = new ArrayList<>(); rowList.add(createRowMap(examples.getTableHeader())); for (TableRow row : examples.getTableBody()) { rowList.add(createRowMap(row)); @@ -363,7 +362,7 @@ private Map createExamples(Examples examples) { } private Map createTestCase(TestCase testCase) { - Map testCaseMap = new HashMap(); + Map testCaseMap = new HashMap<>(); testCaseMap.put("name", testCase.getName()); TestSourcesModel.AstNode astNode = testSources.getAstNode(currentFeatureFile, testCase.getLine()); if (astNode != null) { @@ -372,10 +371,10 @@ private Map createTestCase(TestCase testCase) { testCaseMap.put("description", scenarioDefinition.getDescription() != null ? scenarioDefinition.getDescription() : ""); } if (!testCase.getTags().isEmpty()) { - List> tagList = new ArrayList>(); - for (PickleTag tag : testCase.getTags()) { - Map tagMap = new HashMap(); - tagMap.put("name", tag.getName()); + List> tagList = new ArrayList<>(); + for (String tag : testCase.getTags()) { + Map tagMap = new HashMap<>(); + tagMap.put("name", tag); tagList.add(tagMap); } testCaseMap.put("tags", tagList); @@ -387,7 +386,7 @@ private Map createBackground(TestCase testCase) { TestSourcesModel.AstNode astNode = testSources.getAstNode(currentFeatureFile, testCase.getLine()); if (astNode != null) { Background background = TestSourcesModel.getBackgroundForTestCase(astNode); - Map testCaseMap = new HashMap(); + Map testCaseMap = new HashMap<>(); testCaseMap.put("name", background.getName()); testCaseMap.put("keyword", background.getKeyword()); testCaseMap.put("description", background.getDescription() != null ? background.getDescription() : ""); @@ -399,15 +398,13 @@ private Map createBackground(TestCase testCase) { private boolean isFirstStepAfterBackground(PickleStepTestStep testStep) { TestSourcesModel.AstNode astNode = testSources.getAstNode(currentFeatureFile, testStep.getStepLine()); if (astNode != null) { - if (currentTestCaseMap != null && !TestSourcesModel.isBackgroundStep(astNode)) { - return true; - } + return currentTestCaseMap != null && !TestSourcesModel.isBackgroundStep(astNode); } return false; } private Map createTestStep(PickleStepTestStep testStep) { - Map stepMap = new HashMap(); + Map stepMap = new HashMap<>(); stepMap.put("name", testStep.getStepText()); if (!testStep.getStepArgument().isEmpty()) { Argument argument = testStep.getStepArgument().get(0); @@ -427,13 +424,13 @@ private Map createTestStep(PickleStepTestStep testStep) { } private Map createDocStringMap(PickleString docString) { - Map docStringMap = new HashMap(); + Map docStringMap = new HashMap<>(); docStringMap.put("value", docString.getContent()); return docStringMap; } private List> createDataTableList(PickleTable dataTable) { - List> rowList = new ArrayList>(); + List> rowList = new ArrayList<>(); for (PickleRow row : dataTable.getRows()) { rowList.add(createRowMap(row)); } @@ -441,13 +438,13 @@ private List> createDataTableList(PickleTable dataTable) { } private Map createRowMap(PickleRow row) { - Map rowMap = new HashMap(); + Map rowMap = new HashMap<>(); rowMap.put("cells", createCellList(row)); return rowMap; } private List createCellList(PickleRow row) { - List cells = new ArrayList(); + List cells = new ArrayList<>(); for (PickleCell cell : row.getCells()) { cells.add(cell.getValue()); } @@ -455,7 +452,7 @@ private List createCellList(PickleRow row) { } private Map createMatchMap(PickleStepTestStep testStep) { - Map matchMap = new HashMap(); + Map matchMap = new HashMap<>(); String location = testStep.getCodeLocation(); if (location != null) { matchMap.put("location", location); @@ -464,7 +461,7 @@ private Map createMatchMap(PickleStepTestStep testStep) { } private Map createResultMap(Result result) { - Map resultMap = new HashMap(); + Map resultMap = new HashMap<>(); resultMap.put("status", result.getStatus().name().toLowerCase(ROOT)); if (result.getError() != null) { resultMap.put("error_message", printStackTrace(result.getError())); @@ -544,7 +541,7 @@ private static void writeBytesToURL(byte[] buf, URL url) throws CucumberExceptio private static NiceAppendable createJsOut(URL htmlReportDir) { try { - return new NiceAppendable(new OutputStreamWriter(createReportFileOutputStream(new URL(htmlReportDir, JS_REPORT_FILENAME)), "UTF-8")); + return new NiceAppendable(new OutputStreamWriter(createReportFileOutputStream(new URL(htmlReportDir, JS_REPORT_FILENAME)), UTF_8)); } catch (IOException e) { throw new CucumberException(e); } diff --git a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java index 1672f715be..1bcad06a24 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java @@ -28,7 +28,6 @@ import gherkin.pickles.PickleRow; import gherkin.pickles.PickleString; import gherkin.pickles.PickleTable; -import gherkin.pickles.PickleTag; import java.io.PrintWriter; import java.io.StringWriter; @@ -46,13 +45,13 @@ public final class JSONFormatter implements EventListener { private static final String before = "before"; private static final String after = "after"; private String currentFeatureFile; - private List> featureMaps = new ArrayList>(); + private List> featureMaps = new ArrayList<>(); private List> currentElementsList; private Map currentElementMap; private Map currentTestCaseMap; private List> currentStepsList; private Map currentStepOrHookMap; - private Map currentBeforeStepHookList = new HashMap(); + private Map currentBeforeStepHookList = new HashMap<>(); private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); private final NiceAppendable out; private final TestSourcesModel testSources = new TestSourcesModel(); @@ -180,7 +179,7 @@ private void finishReport() { } private Map createFeatureMap(TestCase testCase) { - Map featureMap = new HashMap(); + Map featureMap = new HashMap<>(); featureMap.put("uri", testCase.getUri()); featureMap.put("elements", new ArrayList>()); Feature feature = testSources.getFeature(testCase.getUri()); @@ -197,7 +196,7 @@ private Map createFeatureMap(TestCase testCase) { } private Map createTestCase(TestCaseStarted event) { - Map testCaseMap = new HashMap(); + Map testCaseMap = new HashMap<>(); testCaseMap.put("start_timestamp", getDateTimeFromTimeStamp(event.getInstant())); @@ -215,10 +214,10 @@ private Map createTestCase(TestCaseStarted event) { } testCaseMap.put("steps", new ArrayList>()); if (!testCase.getTags().isEmpty()) { - List> tagList = new ArrayList>(); - for (PickleTag tag : testCase.getTags()) { - Map tagMap = new HashMap(); - tagMap.put("name", tag.getName()); + List> tagList = new ArrayList<>(); + for (String tag : testCase.getTags()) { + Map tagMap = new HashMap<>(); + tagMap.put("name", tag); tagList.add(tagMap); } testCaseMap.put("tags", tagList); @@ -230,7 +229,7 @@ private Map createBackground(TestCase testCase) { TestSourcesModel.AstNode astNode = testSources.getAstNode(currentFeatureFile, testCase.getLine()); if (astNode != null) { Background background = TestSourcesModel.getBackgroundForTestCase(astNode); - Map testCaseMap = new HashMap(); + Map testCaseMap = new HashMap<>(); testCaseMap.put("name", background.getName()); testCaseMap.put("line", background.getLocation().getLine()); testCaseMap.put("type", "background"); @@ -244,16 +243,14 @@ private Map createBackground(TestCase testCase) { private boolean isFirstStepAfterBackground(PickleStepTestStep testStep) { TestSourcesModel.AstNode astNode = testSources.getAstNode(currentFeatureFile, testStep.getStepLine()); - if (astNode != null) { - if (currentElementMap != currentTestCaseMap && !TestSourcesModel.isBackgroundStep(astNode)) { - return true; - } + if (astNode == null) { + return false; } - return false; + return currentElementMap != currentTestCaseMap && !TestSourcesModel.isBackgroundStep(astNode); } private Map createTestStep(PickleStepTestStep testStep) { - Map stepMap = new HashMap(); + Map stepMap = new HashMap<>(); stepMap.put("name", testStep.getStepText()); stepMap.put("line", testStep.getStepLine()); TestSourcesModel.AstNode astNode = testSources.getAstNode(currentFeatureFile, testStep.getStepLine()); @@ -274,7 +271,7 @@ private Map createTestStep(PickleStepTestStep testStep) { } private Map createDocStringMap(Argument argument) { - Map docStringMap = new HashMap(); + Map docStringMap = new HashMap<>(); PickleString docString = ((PickleString)argument); docStringMap.put("value", docString.getContent()); docStringMap.put("line", docString.getLocation().getLine()); @@ -283,9 +280,9 @@ private Map createDocStringMap(Argument argument) { } private List> createDataTableList(Argument argument) { - List> rowList = new ArrayList>(); + List> rowList = new ArrayList<>(); for (PickleRow row : ((PickleTable)argument).getRows()) { - Map rowMap = new HashMap(); + Map rowMap = new HashMap<>(); rowMap.put("cells", createCellList(row)); rowList.add(rowMap); } @@ -293,7 +290,7 @@ private List> createDataTableList(Argument argument) { } private List createCellList(PickleRow row) { - List cells = new ArrayList(); + List cells = new ArrayList<>(); for (PickleCell cell : row.getCells()) { cells.add(cell.getValue()); } @@ -301,7 +298,7 @@ private List createCellList(PickleRow row) { } private Map createHookStep(HookTestStep hookTestStep) { - return new HashMap(); + return new HashMap<>(); } private void addHookStepToTestCaseMap(Map currentStepOrHookMap, HookType hookType) { @@ -351,20 +348,20 @@ private void addEmbeddingToHookMap(byte[] data, String mimeType) { } private Map createEmbeddingMap(byte[] data, String mimeType) { - Map embedMap = new HashMap(); + Map embedMap = new HashMap<>(); embedMap.put("mime_type", mimeType); embedMap.put("data", Base64.encodeBytes(data)); return embedMap; } private Map createMatchMap(TestStep step, Result result) { - Map matchMap = new HashMap(); + Map matchMap = new HashMap<>(); if(step instanceof PickleStepTestStep) { PickleStepTestStep testStep = (PickleStepTestStep) step; if (!testStep.getDefinitionArgument().isEmpty()) { - List> argumentList = new ArrayList>(); + List> argumentList = new ArrayList<>(); for (io.cucumber.core.event.Argument argument : testStep.getDefinitionArgument()) { - Map argumentMap = new HashMap(); + Map argumentMap = new HashMap<>(); if (argument.getValue() != null) { argumentMap.put("val", argument.getValue()); argumentMap.put("offset", argument.getStart()); @@ -381,7 +378,7 @@ private Map createMatchMap(TestStep step, Result result) { } private Map createResultMap(Result result) { - Map resultMap = new HashMap(); + Map resultMap = new HashMap<>(); resultMap.put("status", result.getStatus().name().toLowerCase(ROOT)); if (result.getError() != null) { resultMap.put("error_message", printStackTrace(result.getError())); diff --git a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java index 677e6a9c55..00beab2f21 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java @@ -296,9 +296,9 @@ private void printTags(List tags, String indent) { } } - private void printPickleTags(List tags, String indent) { + private void printPickleTags(List tags, String indent) { if (!tags.isEmpty()) { - out.println(indent + FixJava.join(FixJava.map(tags, pickleTagNameMapper), " ")); + out.println(indent + FixJava.join(tags, " ")); } } @@ -360,7 +360,7 @@ private void calculateLocationIndentation(String definitionText, List } private String createPaddingToLocation(String indent, String text) { - StringBuffer padding = new StringBuffer(); + StringBuilder padding = new StringBuilder(); for (int i = indent.length() + text.length(); i < locationIndentation; ++i) { padding.append(' '); } diff --git a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java index f7e42657b8..7c5f4eef64 100644 --- a/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/TimelineFormatter.java @@ -12,7 +12,6 @@ import gherkin.deps.com.google.gson.Gson; import gherkin.deps.com.google.gson.GsonBuilder; import gherkin.deps.com.google.gson.annotations.SerializedName; -import gherkin.pickles.PickleTag; import java.io.Closeable; import java.io.File; @@ -229,8 +228,8 @@ class TestData { private String buildTagsValue(final TestCase testCase) { final StringBuilder tags = new StringBuilder(); - for (final PickleTag tag : testCase.getTags()) { - tags.append(tag.getName().toLowerCase()).append(","); + for (final String tag : testCase.getTags()) { + tags.append(tag.toLowerCase()).append(","); } return tags.toString(); } diff --git a/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java index 2ec7f6672a..5401528041 100644 --- a/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java +++ b/core/src/main/java/io/cucumber/core/plugin/UndefinedStepsTracker.java @@ -15,7 +15,6 @@ import gherkin.ast.GherkinDocument; import gherkin.ast.ScenarioDefinition; import gherkin.ast.Step; -import gherkin.pickles.PickleLocation; import java.util.ArrayList; import java.util.HashMap; @@ -23,10 +22,10 @@ import java.util.Map; final class UndefinedStepsTracker implements EventListener { - private final List snippets = new ArrayList(); + private final List snippets = new ArrayList<>(); private final IGherkinDialectProvider dialectProvider = new GherkinDialectProvider(); - private final Map pathToSourceMap = new HashMap(); - private final Map pathToStepMap = new HashMap(); + private final Map pathToSourceMap = new HashMap<>(); + private final Map pathToStepMap = new HashMap<>(); private boolean hasUndefinedSteps = false; private EventHandler testSourceReadHandler = new EventHandler() { @@ -56,7 +55,7 @@ List getSnippets() { return snippets; } - void handleSnippetsSuggested(String uri, List stepLocations, List snippets) { + void handleSnippetsSuggested(String uri, List stepLocations, List snippets) { hasUndefinedSteps = true; String keyword = givenWhenThenKeyword(uri, stepLocations); for (String rawSnippet : snippets) { @@ -67,7 +66,7 @@ void handleSnippetsSuggested(String uri, List stepLocations, Lis } } - private String givenWhenThenKeyword(String uri, List stepLocations) { + private String givenWhenThenKeyword(String uri, List stepLocations) { String keyword = null; if (!stepLocations.isEmpty()) { if (pathToSourceMap.containsKey(uri)) { @@ -77,7 +76,7 @@ private String givenWhenThenKeyword(String uri, List stepLocatio return keyword != null ? keyword : getFirstGivenKeyword(dialectProvider.getDefaultDialect()); } - private String getKeywordFromSource(String path, List stepLocations) { + private String getKeywordFromSource(String path, List stepLocations) { if (!pathToStepMap.containsKey(path)) { createFeatureStepMap(path); } @@ -87,13 +86,13 @@ private String getKeywordFromSource(String path, List stepLocati GherkinDialect featureDialect = pathToStepMap.get(path).dialect; List givenThenWhenKeywords = getGivenWhenThenKeywords(featureDialect); Map stepMap = pathToStepMap.get(path).stepMap; - for (PickleLocation stepLocation : stepLocations) { + for (SnippetsSuggestedEvent.Location stepLocation : stepLocations) { if (!stepMap.containsKey(stepLocation.getLine())) { continue; } for (StepNode stepNode = stepMap.get(stepLocation.getLine()); stepNode != null; stepNode = stepNode.previous) { for (String keyword : givenThenWhenKeywords) { - if (!keyword.equals("* ") && keyword == stepNode.step.getKeyword()) { + if (!keyword.equals("* ") && keyword.equals(stepNode.step.getKeyword())) { return convertToCodeKeyword(keyword); } } @@ -106,11 +105,11 @@ private void createFeatureStepMap(String path) { if (!pathToSourceMap.containsKey(path)) { return; } - Parser parser = new Parser(new AstBuilder()); + Parser parser = new Parser<>(new AstBuilder()); TokenMatcher matcher = new TokenMatcher(); try { GherkinDocument gherkinDocument = parser.parse(pathToSourceMap.get(path), matcher); - Map stepMap = new HashMap(); + Map stepMap = new HashMap<>(); StepNode initialPreviousNode = null; for (ScenarioDefinition child : gherkinDocument.getFeature().getChildren()) { StepNode lastStepNode = processScenarioDefinition(stepMap, initialPreviousNode, child); @@ -135,7 +134,7 @@ private StepNode processScenarioDefinition(Map stepMap, StepN } private List getGivenWhenThenKeywords(GherkinDialect dialect) { - List keywords = new ArrayList(); + List keywords = new ArrayList<>(); keywords.addAll(dialect.getGivenKeywords()); keywords.addAll(dialect.getWhenKeywords()); keywords.addAll(dialect.getThenKeywords()); diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index f0a1698b1c..dbcd4e8f2d 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -85,7 +85,7 @@ private void addTestStepsForPickleSteps(List testSteps, Pick snippets.addAll(snippet); } if (!snippets.isEmpty()) { - bus.send(new SnippetsSuggestedEvent(bus.getInstant(), pickleEvent.uri, step.getLocations(), snippets)); + bus.send(new SnippetsSuggestedEvent(bus.getInstant(), pickleEvent.uri, locations(step), snippets)); } match = new UndefinedPickleStepDefinitionMatch(step); } @@ -102,6 +102,12 @@ private void addTestStepsForPickleSteps(List testSteps, Pick } } + private List locations(PickleStep step) { + return step.getLocations().stream() + .map(p -> new SnippetsSuggestedEvent.Location(p.getLine(), p.getLine())) + .collect(Collectors.toList()); + } + private void addTestStepsForBeforeHooks(List testSteps, List tags) { addTestStepsForHooks(testSteps, tags, glue.getBeforeHooks(), HookType.BEFORE); } diff --git a/core/src/main/java/io/cucumber/core/runner/TestCase.java b/core/src/main/java/io/cucumber/core/runner/TestCase.java index 97cbea8264..467efbfab1 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestCase.java +++ b/core/src/main/java/io/cucumber/core/runner/TestCase.java @@ -13,6 +13,7 @@ import java.time.Instant; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; final class TestCase implements io.cucumber.core.event.TestCase { private final PickleEvent pickleEvent; @@ -57,7 +58,7 @@ void run(EventBus bus) { @Override public List getTestSteps() { - List testSteps = new ArrayList(beforeHooks); + List testSteps = new ArrayList<>(beforeHooks); for (PickleStepTestStep step : this.testSteps) { testSteps.addAll(step.getBeforeStepHookSteps()); testSteps.add(step); @@ -91,7 +92,10 @@ private String fileColonLine(Integer line) { } @Override - public List getTags() { - return pickleEvent.pickle.getTags(); + public List getTags() { + return pickleEvent.pickle.getTags() + .stream() + .map(PickleTag::getName) + .collect(Collectors.toList()); } } diff --git a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java index 8eebba9d3e..61d05ef089 100644 --- a/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/UndefinedStepsTrackerTest.java @@ -10,9 +10,9 @@ import java.util.Collections; import java.util.List; +import io.cucumber.core.event.SnippetsSuggestedEvent; import org.junit.Test; -import gherkin.pickles.PickleLocation; import io.cucumber.core.event.TestSourceRead; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.feature.CucumberFeature; @@ -140,11 +140,11 @@ public void snippets_are_generated_for_correct_locale() throws Exception { assertEquals("[ДопуÑтим ^Б$]", tracker.getSnippets().toString()); } - private List locations(int line) { - return asList(new PickleLocation(line, 0)); + private List locations(int line) { + return asList(new SnippetsSuggestedEvent.Location(line, 0)); } - private List locations() { + private List locations() { return Collections.emptyList(); } From 3dbcf12b5d05cd2fa53fd801cf3c6eee5298ea8d Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 29 Jun 2019 23:38:00 +0200 Subject: [PATCH 110/155] [Core] Replace FixJava.join and FixJava.map with streams api --- .../core/options/RuntimeOptionsParser.java | 40 ++++++++----------- .../cucumber/core/plugin/PrettyFormatter.java | 22 ++-------- .../java/io/cucumber/core/runner/Runner.java | 5 ++- .../runtime/FeaturePathFeatureSupplier.java | 7 ++-- .../java/io/cucumber/core/util/FixJava.java | 27 ------------- .../java/io/cucumber/core/util/Mapper.java | 5 --- 6 files changed, 27 insertions(+), 79 deletions(-) delete mode 100644 core/src/main/java/io/cucumber/core/util/Mapper.java diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java index bf31cc716b..c789df9feb 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java @@ -3,33 +3,34 @@ import gherkin.GherkinDialect; import gherkin.GherkinDialectProvider; import gherkin.IGherkinDialectProvider; -import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.logging.Logger; -import io.cucumber.core.logging.LoggerFactory; import io.cucumber.core.feature.FeaturePath; import io.cucumber.core.feature.FeatureWithLines; import io.cucumber.core.feature.GluePath; import io.cucumber.core.feature.RerunLoader; +import io.cucumber.core.logging.Logger; +import io.cucumber.core.logging.LoggerFactory; import io.cucumber.core.order.PickleOrder; import io.cucumber.core.order.StandardPickleOrders; +import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.util.FixJava; -import io.cucumber.core.util.Mapper; import io.cucumber.datatable.DataTable; import java.io.InputStreamReader; import java.io.Reader; import java.net.URI; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.ResourceBundle; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; -import static io.cucumber.core.util.FixJava.join; -import static io.cucumber.core.util.FixJava.map; +import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; +import static java.util.stream.Collectors.joining; final class RuntimeOptionsParser { private static final Logger log = LoggerFactory.getLogger(RuntimeOptionsParser.class); @@ -37,18 +38,6 @@ final class RuntimeOptionsParser { static final String VERSION = ResourceBundle.getBundle("io.cucumber.core.version").getString("cucumber-jvm.version"); private static final Pattern RANDOM_AND_SEED_PATTERN = Pattern.compile("random(?::(\\d+))?"); - private static final Mapper QUOTE_MAPPER = new Mapper() { - @Override - public String map(String o) { - return '"' + o + '"'; - } - }; - private static final Mapper CODE_KEYWORD_MAPPER = new Mapper() { - @Override - public String map(String keyword) { - return keyword.replaceAll("[\\s',!]", ""); - } - }; // IMPORTANT! Make sure USAGE.txt is always uptodate if this class changes. private static final String USAGE_RESOURCE = "/io/cucumber/core/options/USAGE.txt"; static String usageText; @@ -96,7 +85,7 @@ RuntimeOptionsBuilder parse(List args) { parsedOptions.setMonochrome(!arg.startsWith("--no-")); } else if (arg.equals("--snippets")) { String nextArg = args.remove(0); - if("underscore".equals(nextArg)){ + if ("underscore".equals(nextArg)) { parsedOptions.setSnippetType(SnippetType.UNDERSCORE); } else if ("camelcase".equals(nextArg)) { parsedOptions.setSnippetType(SnippetType.CAMELCASE); @@ -164,7 +153,7 @@ private static void printUsage() { static void loadUsageTextIfNeeded() { if (usageText == null) { try { - Reader reader = new InputStreamReader(FixJava.class.getResourceAsStream(USAGE_RESOURCE), "UTF-8"); + Reader reader = new InputStreamReader(FixJava.class.getResourceAsStream(USAGE_RESOURCE), UTF_8); usageText = FixJava.readReader(reader); } catch (Exception e) { usageText = "Could not load usage text: " + e.toString(); @@ -216,13 +205,16 @@ private static int printKeywordsFor(GherkinDialect dialect) { private static void addCodeKeywordRow(List> table, String key, List keywords) { List codeKeywordList = new ArrayList<>(keywords); codeKeywordList.remove("* "); - addKeywordRow(table, key + " (code)", map(codeKeywordList, CODE_KEYWORD_MAPPER)); + + List codeWords = codeKeywordList.stream() + .map(keyword -> keyword.replaceAll("[\\s',!]", "")) + .collect(Collectors.toList()); + + addKeywordRow(table, key + " (code)", codeWords); } private static void addKeywordRow(List> table, String key, List keywords) { - List cells = asList(key, join(map(keywords, QUOTE_MAPPER), ", ")); - table.add(cells); + table.add(asList(key, keywords.stream().map(o -> '"' + o + '"').collect(joining(", ")))); } - } diff --git a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java index 00beab2f21..0767375504 100644 --- a/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/PrettyFormatter.java @@ -13,8 +13,6 @@ import io.cucumber.core.event.TestStepFinished; import io.cucumber.core.event.TestStepStarted; import io.cucumber.core.event.WriteEvent; -import io.cucumber.core.util.FixJava; -import io.cucumber.core.util.Mapper; import gherkin.ast.Background; import gherkin.ast.Examples; import gherkin.ast.Feature; @@ -22,7 +20,6 @@ import gherkin.ast.ScenarioOutline; import gherkin.ast.Step; import gherkin.ast.Tag; -import gherkin.pickles.PickleTag; import java.io.PrintWriter; import java.io.StringWriter; @@ -30,6 +27,7 @@ import java.util.List; import static java.util.Locale.ROOT; +import static java.util.stream.Collectors.joining; public final class PrettyFormatter implements EventListener, ColorAware { private static final String SCENARIO_INDENT = " "; @@ -43,18 +41,6 @@ public final class PrettyFormatter implements EventListener, ColorAware { private ScenarioOutline currentScenarioOutline; private Examples currentExamples; private int locationIndentation; - private Mapper tagNameMapper = new Mapper() { - @Override - public String map(Tag tag) { - return tag.getName(); - } - }; - private Mapper pickleTagNameMapper = new Mapper() { - @Override - public String map(PickleTag pickleTag) { - return pickleTag.getName(); - } - }; private EventHandler testSourceReadHandler = new EventHandler() { @Override @@ -234,7 +220,7 @@ String formatStepText(String keyword, String stepText, Format textFormat, Format } } if (beginIndex != stepText.length()) { - String text = stepText.substring(beginIndex, stepText.length()); + String text = stepText.substring(beginIndex); result.append(textFormat.text(text)); } return result.toString(); @@ -292,13 +278,13 @@ private void printTags(List tags) { } private void printTags(List tags, String indent) { if (!tags.isEmpty()) { - out.println(indent + FixJava.join(FixJava.map(tags, tagNameMapper), " ")); + out.println(indent + tags.stream().map(Tag::getName).collect(joining(" "))); } } private void printPickleTags(List tags, String indent) { if (!tags.isEmpty()) { - out.println(indent + FixJava.join(tags, " ")); + out.println(indent + String.join(" ", tags)); } } diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index dbcd4e8f2d..79562fef48 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -13,7 +13,6 @@ import io.cucumber.core.logging.LoggerFactory; import io.cucumber.core.snippets.SnippetGenerator; import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.core.util.FixJava; import java.net.URI; import java.util.ArrayList; @@ -21,6 +20,8 @@ import java.util.List; import java.util.stream.Collectors; +import static java.util.stream.Collectors.joining; + public final class Runner { private static final Logger log = LoggerFactory.getLogger(Runner.class); @@ -43,7 +44,7 @@ public Runner(EventBus bus, Collection backends, ObjectFactor .collect(Collectors.toList()); this.objectFactory = objectFactory; List gluePaths = runnerOptions.getGlue(); - log.debug("Loading glue from " + FixJava.join(gluePaths, ", ")); + log.debug("Loading glue from " + gluePaths.stream().map(URI::toString).collect(joining(", "))); for (Backend backend : backends) { log.debug("Loading glue for backend " + backend.getClass().getName()); backend.loadGlue(this.glue, gluePaths); diff --git a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java index e925d234e6..cdab55f17d 100644 --- a/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/FeaturePathFeatureSupplier.java @@ -5,11 +5,12 @@ import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.feature.FeatureLoader; import io.cucumber.core.feature.Options; -import io.cucumber.core.util.FixJava; import java.net.URI; import java.util.List; +import static java.util.stream.Collectors.joining; + /** * Supplies a list of features found on the the feature path provided to RuntimeOptions. */ @@ -29,14 +30,14 @@ public FeaturePathFeatureSupplier(FeatureLoader featureLoader, Options featureOp public List get() { List featurePaths = featureOptions.getFeaturePaths(); - log.debug("Loading features from " + FixJava.join(featurePaths, ", ")); + log.debug("Loading features from " + featurePaths.stream().map(URI::toString).collect(joining(", "))); List cucumberFeatures = featureLoader.load(featurePaths); if (cucumberFeatures.isEmpty()) { if (featurePaths.isEmpty()) { log.warn("Got no path to feature directory or feature file"); } else { - log.warn("No features found at " + FixJava.join(featurePaths, ", ")); + log.warn("No features found at " + featurePaths.stream().map(URI::toString).collect(joining(", "))); } } diff --git a/core/src/main/java/io/cucumber/core/util/FixJava.java b/core/src/main/java/io/cucumber/core/util/FixJava.java index 7ab5567eb7..9f078af725 100644 --- a/core/src/main/java/io/cucumber/core/util/FixJava.java +++ b/core/src/main/java/io/cucumber/core/util/FixJava.java @@ -2,36 +2,9 @@ import java.io.IOException; import java.io.Reader; -import java.util.ArrayList; -import java.util.List; public class FixJava { - private FixJava() { - - } - - public static String join(List objects, String separator) { - //TODO: Java8 replace with StringJoiner. - StringBuilder sb = new StringBuilder(); - int i = 0; - for (Object s : objects) { - if (i != 0) sb.append(separator); - sb.append(s); - i++; - } - return sb.toString(); - } - - public static List map(List objects, Mapper mapper) { - //TODO: Java8 replace with lambda - List result = new ArrayList(objects.size()); - for (T o : objects) { - result.add(mapper.map(o)); - } - return result; - } - public static String readReader(Reader in) throws RuntimeException { try { StringBuilder buffer = new StringBuilder(); diff --git a/core/src/main/java/io/cucumber/core/util/Mapper.java b/core/src/main/java/io/cucumber/core/util/Mapper.java deleted file mode 100644 index 06b321ffb7..0000000000 --- a/core/src/main/java/io/cucumber/core/util/Mapper.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.cucumber.core.util; - -public interface Mapper { - R map(T o); -} From 945c82777847a996aea60428b9fa319903e8f0e4 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 29 Jun 2019 23:45:30 +0200 Subject: [PATCH 111/155] [Core] Move html plugin assets to io.cucumber.core.plugin.html --- .../java/io/cucumber/core/plugin/HTMLFormatter.java | 8 ++++---- .../plugin}/html/bubble_256x256.png | Bin .../{formatter => core/plugin}/html/formatter.js | 0 .../{formatter => core/plugin}/html/index.html | 0 .../plugin}/html/jquery-1.8.2.min.js | 0 .../{formatter => core/plugin}/html/report.js | 0 .../{formatter => core/plugin}/html/style.css | 0 .../{ => core}/stepexpression/TypeRegistryTest.java | 2 +- 8 files changed, 5 insertions(+), 5 deletions(-) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/html/bubble_256x256.png (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/html/formatter.js (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/html/index.html (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/html/jquery-1.8.2.min.js (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/html/report.js (100%) rename core/src/main/resources/io/cucumber/{formatter => core/plugin}/html/style.css (100%) rename core/src/test/java/io/cucumber/{ => core}/stepexpression/TypeRegistryTest.java (98%) diff --git a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index 454370319e..90eef92fe0 100644 --- a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -57,10 +57,10 @@ public final class HTMLFormatter implements EventListener { private static final String JS_FORMATTER_VAR = "formatter"; private static final String JS_REPORT_FILENAME = "report.js"; private static final String[] TEXT_ASSETS = new String[]{ - "/io/cucumber/formatter/html/formatter.js", - "/io/cucumber/formatter/html/index.html", - "/io/cucumber/formatter/html/jquery-1.8.2.min.js", - "/io/cucumber/formatter/html/style.css" + "/io/cucumber/core/plugin/html/formatter.js", + "/io/cucumber/core/plugin/html/index.html", + "/io/cucumber/core/plugin/html/jquery-1.8.2.min.js", + "/io/cucumber/core/plugin/html/style.css" }; private static final Map MIME_TYPES_EXTENSIONS = new HashMap() { { diff --git a/core/src/main/resources/io/cucumber/formatter/html/bubble_256x256.png b/core/src/main/resources/io/cucumber/core/plugin/html/bubble_256x256.png similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/html/bubble_256x256.png rename to core/src/main/resources/io/cucumber/core/plugin/html/bubble_256x256.png diff --git a/core/src/main/resources/io/cucumber/formatter/html/formatter.js b/core/src/main/resources/io/cucumber/core/plugin/html/formatter.js similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/html/formatter.js rename to core/src/main/resources/io/cucumber/core/plugin/html/formatter.js diff --git a/core/src/main/resources/io/cucumber/formatter/html/index.html b/core/src/main/resources/io/cucumber/core/plugin/html/index.html similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/html/index.html rename to core/src/main/resources/io/cucumber/core/plugin/html/index.html diff --git a/core/src/main/resources/io/cucumber/formatter/html/jquery-1.8.2.min.js b/core/src/main/resources/io/cucumber/core/plugin/html/jquery-1.8.2.min.js similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/html/jquery-1.8.2.min.js rename to core/src/main/resources/io/cucumber/core/plugin/html/jquery-1.8.2.min.js diff --git a/core/src/main/resources/io/cucumber/formatter/html/report.js b/core/src/main/resources/io/cucumber/core/plugin/html/report.js similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/html/report.js rename to core/src/main/resources/io/cucumber/core/plugin/html/report.js diff --git a/core/src/main/resources/io/cucumber/formatter/html/style.css b/core/src/main/resources/io/cucumber/core/plugin/html/style.css similarity index 100% rename from core/src/main/resources/io/cucumber/formatter/html/style.css rename to core/src/main/resources/io/cucumber/core/plugin/html/style.css diff --git a/core/src/test/java/io/cucumber/stepexpression/TypeRegistryTest.java b/core/src/test/java/io/cucumber/core/stepexpression/TypeRegistryTest.java similarity index 98% rename from core/src/test/java/io/cucumber/stepexpression/TypeRegistryTest.java rename to core/src/test/java/io/cucumber/core/stepexpression/TypeRegistryTest.java index 101cac15d1..6f081b95b0 100644 --- a/core/src/test/java/io/cucumber/stepexpression/TypeRegistryTest.java +++ b/core/src/test/java/io/cucumber/core/stepexpression/TypeRegistryTest.java @@ -1,4 +1,4 @@ -package io.cucumber.stepexpression; +package io.cucumber.core.stepexpression; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.cucumberexpressions.ParameterByTypeTransformer; From 9dbde174ee7501d28a16a201e12fccc9e938b048 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 29 Jun 2019 23:59:34 +0200 Subject: [PATCH 112/155] [Core] Clean up Snippet API --- .../io/cucumber/core/snippets/Snippet.java | 6 ++++- .../core/snippets/SnippetGenerator.java | 24 +++++++++---------- .../cucumber/core/snippets/SnippetType.java | 5 +++- .../cucumber/core/snippets/TestSnippet.java | 5 ++-- .../java/io/cucumber/java/JavaSnippet.java | 8 ++++--- .../java/io/cucumber/java8/Java8Snippet.java | 8 ++++--- .../junit/StubBackendProviderService.java | 5 ++-- .../testng/StubBackendProviderService.java | 8 +++---- 8 files changed, 39 insertions(+), 30 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/snippets/Snippet.java b/core/src/main/java/io/cucumber/core/snippets/Snippet.java index 2d76505d4f..47a70fb2b8 100644 --- a/core/src/main/java/io/cucumber/core/snippets/Snippet.java +++ b/core/src/main/java/io/cucumber/core/snippets/Snippet.java @@ -1,8 +1,12 @@ package io.cucumber.core.snippets; +import org.apiguardian.api.API; + import java.lang.reflect.Type; +import java.text.MessageFormat; import java.util.Map; +@API(status = API.Status.STABLE) public interface Snippet { /** * @return a {@link java.text.MessageFormat} template used to generate a snippet. The template can access the @@ -16,7 +20,7 @@ public interface Snippet { *
      • {5} : value of {@link #tableHint()} if the step has a table
      • * */ - String template(); + MessageFormat template(); /** * @return a hint about alternative ways to declare a table argument diff --git a/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java b/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java index 760ad090e0..f7edc0c6f9 100644 --- a/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java +++ b/core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java @@ -1,14 +1,14 @@ package io.cucumber.core.snippets; -import io.cucumber.cucumberexpressions.GeneratedExpression; -import io.cucumber.cucumberexpressions.ParameterType; -import io.cucumber.datatable.DataTable; import gherkin.pickles.Argument; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleString; import gherkin.pickles.PickleTable; import io.cucumber.cucumberexpressions.CucumberExpressionGenerator; +import io.cucumber.cucumberexpressions.GeneratedExpression; +import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.cucumberexpressions.ParameterTypeRegistry; +import io.cucumber.datatable.DataTable; import java.lang.reflect.Type; import java.util.ArrayList; @@ -17,8 +17,6 @@ import java.util.Map; import java.util.regex.Pattern; -import static java.text.MessageFormat.format; - public final class SnippetGenerator { @SuppressWarnings("RegExpRedundantEscape") // Android can't parse unescaped braces. private static final ArgumentPattern[] DEFAULT_ARGUMENT_PATTERNS = new ArgumentPattern[]{ @@ -40,14 +38,14 @@ public List getSnippet(PickleStep step, String keyword, SnippetType snip List snippets = new ArrayList<>(generatedExpressions.size()); FunctionNameGenerator functionNameGenerator = new FunctionNameGenerator(snippetType.joiner()); for (GeneratedExpression expression : generatedExpressions) { - snippets.add(format( - snippet.template(), - keyword, - snippet.escapePattern(expression.getSource()), - functionName(expression.getSource(), functionNameGenerator), - snippet.arguments(arguments(step, expression.getParameterNames(), expression.getParameterTypes())), - REGEXP_HINT, - !step.getArgument().isEmpty() && step.getArgument().get(0) instanceof PickleTable ? snippet.tableHint() : "" + snippets.add(snippet.template().format(new String[]{ + keyword, + snippet.escapePattern(expression.getSource()), + functionName(expression.getSource(), functionNameGenerator), + snippet.arguments(arguments(step, expression.getParameterNames(), expression.getParameterTypes())), + REGEXP_HINT, + !step.getArgument().isEmpty() && step.getArgument().get(0) instanceof PickleTable ? snippet.tableHint() : "" + } )); } diff --git a/core/src/main/java/io/cucumber/core/snippets/SnippetType.java b/core/src/main/java/io/cucumber/core/snippets/SnippetType.java index 65f432520c..5c4f7384bc 100644 --- a/core/src/main/java/io/cucumber/core/snippets/SnippetType.java +++ b/core/src/main/java/io/cucumber/core/snippets/SnippetType.java @@ -1,5 +1,8 @@ package io.cucumber.core.snippets; +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE) public enum SnippetType { UNDERSCORE(new UnderscoreJoiner()), CAMELCASE(new CamelCaseJoiner()); @@ -10,7 +13,7 @@ public enum SnippetType { this.joiner = joiner; } - public Joiner joiner() { + Joiner joiner() { return joiner; } } diff --git a/core/src/test/java/io/cucumber/core/snippets/TestSnippet.java b/core/src/test/java/io/cucumber/core/snippets/TestSnippet.java index f1a43dbbff..3596ddf0ef 100644 --- a/core/src/test/java/io/cucumber/core/snippets/TestSnippet.java +++ b/core/src/test/java/io/cucumber/core/snippets/TestSnippet.java @@ -1,12 +1,13 @@ package io.cucumber.core.snippets; import java.lang.reflect.Type; +import java.text.MessageFormat; import java.util.Map; public class TestSnippet implements Snippet { @Override - public String template() { - return ""; + public MessageFormat template() { + return new MessageFormat(""); } @Override diff --git a/java/src/main/java/io/cucumber/java/JavaSnippet.java b/java/src/main/java/io/cucumber/java/JavaSnippet.java index eaa1e3039b..db5a505f20 100644 --- a/java/src/main/java/io/cucumber/java/JavaSnippet.java +++ b/java/src/main/java/io/cucumber/java/JavaSnippet.java @@ -1,14 +1,16 @@ package io.cucumber.java; +import java.text.MessageFormat; + final class JavaSnippet extends AbstractJavaSnippet { @Override - public String template() { - return "" + + public MessageFormat template() { + return new MessageFormat("" + "@{0}(\"{1}\")\n" + "public void {2}({3}) '{'\n" + " // {4}\n" + "{5} throw new io.cucumber.java.PendingException();\n" + - "'}'\n"; + "'}'\n"); } } diff --git a/java8/src/main/java/io/cucumber/java8/Java8Snippet.java b/java8/src/main/java/io/cucumber/java8/Java8Snippet.java index 91c54dc47e..170729affc 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8Snippet.java +++ b/java8/src/main/java/io/cucumber/java8/Java8Snippet.java @@ -1,13 +1,15 @@ package io.cucumber.java8; +import java.text.MessageFormat; + final class Java8Snippet extends AbstractJavaSnippet { @Override - public String template() { - return "" + + public MessageFormat template() { + return new MessageFormat("" + "{0}(\"{1}\", ({3}) -> '{'\n" + " // {4}\n" + "{5} throw new io.cucumber.java8.PendingException();\n" + - "'}');\n"; + "'}');\n"); } } diff --git a/junit/src/test/java/io/cucumber/junit/StubBackendProviderService.java b/junit/src/test/java/io/cucumber/junit/StubBackendProviderService.java index 1194ae915a..17d6f5e50d 100644 --- a/junit/src/test/java/io/cucumber/junit/StubBackendProviderService.java +++ b/junit/src/test/java/io/cucumber/junit/StubBackendProviderService.java @@ -11,6 +11,7 @@ import java.lang.reflect.Type; import java.net.URI; +import java.text.MessageFormat; import java.util.List; import java.util.Map; @@ -45,8 +46,8 @@ public void disposeWorld() { public Snippet getSnippet() { return new Snippet() { @Override - public String template() { - return ""; + public MessageFormat template() { + return new MessageFormat(""); } @Override diff --git a/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java b/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java index 8186aac32d..2070dc0313 100644 --- a/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java +++ b/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java @@ -10,17 +10,15 @@ import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.snippets.Snippet; -import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.stepexpression.Argument; import java.lang.reflect.Type; import java.net.URI; +import java.text.MessageFormat; import java.util.Collections; import java.util.List; import java.util.Map; -import static java.util.Collections.singletonList; - public class StubBackendProviderService implements BackendProviderService { @Override @@ -95,8 +93,8 @@ public void disposeWorld() { public Snippet getSnippet() { return new Snippet() { @Override - public String template() { - return ""; + public MessageFormat template() { + return new MessageFormat(""); } @Override From 692b9f469ac8f5ffd50df90c8110e5bbc7ac9970 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 30 Jun 2019 00:08:04 +0200 Subject: [PATCH 113/155] [Core] Make ObjectFactoryLoader package private --- .../java/io/cucumber/core/options/RuntimeOptions.java | 10 ---------- .../core/{backend => runtime}/ObjectFactoryLoader.java | 8 +++++--- .../core/runtime/SingletonObjectFactorySupplier.java | 2 +- .../core/runtime/ThreadLocalObjectFactorySupplier.java | 5 ++--- .../{backend => runtime}/JavaObjectFactoryTest.java | 5 +++-- 5 files changed, 11 insertions(+), 19 deletions(-) rename core/src/main/java/io/cucumber/core/{backend => runtime}/ObjectFactoryLoader.java (95%) rename core/src/test/java/io/cucumber/core/{backend => runtime}/JavaObjectFactoryTest.java (83%) diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 1995e1653b..27d207a1c4 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -29,7 +29,6 @@ public final class RuntimeOptions implements private final Map> lineFilters = new HashMap<>(); private final SortedSet featurePaths = new TreeSet<>(); - private final List junitOptions = new ArrayList<>(); private boolean dryRun; private boolean strict = false; private boolean monochrome = false; @@ -122,11 +121,6 @@ void setGlue(List parsedGlue) { glue.addAll(parsedGlue); } - void setJunitOptions(List junitOptions) { - this.junitOptions.clear(); - this.junitOptions.addAll(junitOptions); - } - void setLineFilters(Map> lineFilters) { this.lineFilters.clear(); for (URI path : lineFilters.keySet()) { @@ -168,10 +162,6 @@ public SnippetType getSnippetType() { return snippetType; } - public List getJunitOptions() { - return unmodifiableList(junitOptions); - } - public int getThreads() { return threads; } diff --git a/core/src/main/java/io/cucumber/core/backend/ObjectFactoryLoader.java b/core/src/main/java/io/cucumber/core/runtime/ObjectFactoryLoader.java similarity index 95% rename from core/src/main/java/io/cucumber/core/backend/ObjectFactoryLoader.java rename to core/src/main/java/io/cucumber/core/runtime/ObjectFactoryLoader.java index 760cd8e276..d9147a81f0 100644 --- a/core/src/main/java/io/cucumber/core/backend/ObjectFactoryLoader.java +++ b/core/src/main/java/io/cucumber/core/runtime/ObjectFactoryLoader.java @@ -1,5 +1,6 @@ -package io.cucumber.core.backend; +package io.cucumber.core.runtime; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.exception.CucumberException; import java.lang.reflect.Constructor; @@ -8,7 +9,8 @@ import java.util.Map; import java.util.ServiceLoader; -public class ObjectFactoryLoader { +class ObjectFactoryLoader { + private ObjectFactoryLoader() { } @@ -26,7 +28,7 @@ private ObjectFactoryLoader() { * @param objectFactoryClassName optional object factory to use * @return an instance of {@link ObjectFactory} */ - public static ObjectFactory loadObjectFactory(String objectFactoryClassName) { + static ObjectFactory loadObjectFactory(String objectFactoryClassName) { final ServiceLoader loader = ServiceLoader.load(ObjectFactory.class); if (objectFactoryClassName == null) { return loadSingleObjectFactoryOrDefault(loader); diff --git a/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java index 745302b0ba..ccbb52100a 100644 --- a/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java @@ -5,7 +5,7 @@ import java.util.Map; -import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; +import static io.cucumber.core.runtime.ObjectFactoryLoader.loadObjectFactory; public class SingletonObjectFactorySupplier implements ObjectFactorySupplier { diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java index 189ca12132..85e9ebd408 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java @@ -6,12 +6,11 @@ import java.util.Map; -import static io.cucumber.core.backend.ObjectFactoryLoader.loadObjectFactory; +import static io.cucumber.core.runtime.ObjectFactoryLoader.loadObjectFactory; public class ThreadLocalObjectFactorySupplier implements ObjectFactorySupplier { - private final ThreadLocal runners = ThreadLocal.withInitial( - () -> { + private final ThreadLocal runners = ThreadLocal.withInitial(() -> { Map properties = CucumberProperties.create(); return loadObjectFactory(properties.get(ObjectFactory.class.getName())); } diff --git a/core/src/test/java/io/cucumber/core/backend/JavaObjectFactoryTest.java b/core/src/test/java/io/cucumber/core/runtime/JavaObjectFactoryTest.java similarity index 83% rename from core/src/test/java/io/cucumber/core/backend/JavaObjectFactoryTest.java rename to core/src/test/java/io/cucumber/core/runtime/JavaObjectFactoryTest.java index 1611cadff7..2ac3df1631 100644 --- a/core/src/test/java/io/cucumber/core/backend/JavaObjectFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/JavaObjectFactoryTest.java @@ -1,6 +1,7 @@ -package io.cucumber.core.backend; +package io.cucumber.core.runtime; -import io.cucumber.core.backend.ObjectFactoryLoader.DefaultJavaObjectFactory; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.runtime.ObjectFactoryLoader.DefaultJavaObjectFactory; import org.junit.Test; import static org.junit.Assert.assertNotNull; From 6bad8eeacc46153c9cef42b773bb14ba95a40fab Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 30 Jun 2019 00:57:15 +0200 Subject: [PATCH 114/155] [Core] Clean up FixJava.readReader --- .../io/cucumber/core/feature/Encoding.java | 16 +++-- .../io/cucumber/core/feature/RerunLoader.java | 7 +- .../core/options/RuntimeOptionsParser.java | 11 ++-- .../cucumber/core/plugin/URLOutputStream.java | 60 +++++++++++------ .../java/io/cucumber/core/util/FixJava.java | 23 ------- .../core/plugin/HTMLFormatterTest.java | 66 +++++++++++-------- .../core/plugin/URLOutputStreamTest.java | 19 ++++-- 7 files changed, 112 insertions(+), 90 deletions(-) delete mode 100644 core/src/main/java/io/cucumber/core/util/FixJava.java diff --git a/core/src/main/java/io/cucumber/core/feature/Encoding.java b/core/src/main/java/io/cucumber/core/feature/Encoding.java index fe855e5126..463fbfda99 100644 --- a/core/src/main/java/io/cucumber/core/feature/Encoding.java +++ b/core/src/main/java/io/cucumber/core/feature/Encoding.java @@ -1,13 +1,15 @@ package io.cucumber.core.feature; import io.cucumber.core.io.Resource; -import io.cucumber.core.util.FixJava; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; +import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Locale.ROOT; /** @@ -16,22 +18,28 @@ final class Encoding { private static final Pattern COMMENT_OR_EMPTY_LINE_PATTERN = Pattern.compile("^\\s*#|^\\s*$"); private static final Pattern ENCODING_PATTERN = Pattern.compile("^\\s*#\\s*encoding\\s*:\\s*([0-9a-zA-Z\\-]+)", Pattern.CASE_INSENSITIVE); - private static final String DEFAULT_ENCODING = "UTF-8"; + private static final String DEFAULT_ENCODING = UTF_8.name(); private static final String UTF_8_BOM = "\uFEFF"; static String readFile(Resource resource) throws RuntimeException, IOException { - String source = FixJava.readReader(new InputStreamReader(resource.getInputStream(), DEFAULT_ENCODING)); + String source = read(resource, DEFAULT_ENCODING); // Remove UTF8 BOM encoded in first bytes if (source.startsWith(UTF_8_BOM)) { source = source.replaceFirst(UTF_8_BOM, ""); } String enc = encoding(source); if (!enc.equals(DEFAULT_ENCODING)) { - source = FixJava.readReader(new InputStreamReader(resource.getInputStream(), enc)); + source = read(resource, enc); } return source; } + private static String read(Resource resource, String encoding) throws IOException { + try(BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream(), encoding))){ + return br.lines().collect(Collectors.joining(System.lineSeparator())); + } + } + private static String encoding(String source) { String encoding = DEFAULT_ENCODING; for (String line : source.split("\\n")) { diff --git a/core/src/main/java/io/cucumber/core/feature/RerunLoader.java b/core/src/main/java/io/cucumber/core/feature/RerunLoader.java index 1dc9152a4e..b0c00670ab 100644 --- a/core/src/main/java/io/cucumber/core/feature/RerunLoader.java +++ b/core/src/main/java/io/cucumber/core/feature/RerunLoader.java @@ -3,8 +3,8 @@ import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.util.FixJava; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; @@ -12,6 +12,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; public class RerunLoader { private static final Pattern RERUN_PATH_SPECIFICATION = Pattern.compile("(?m:^| |)(.*?\\.feature(?:(?::\\d+)*))"); @@ -43,8 +44,8 @@ public List load(URI rerunPath) { } private static String read(Resource resource) { - try { - return FixJava.readReader(new InputStreamReader(resource.getInputStream())); + try (BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream()))) { + return br.lines().collect(Collectors.joining(System.lineSeparator())); } catch (IOException e) { throw new CucumberException("Failed to read resource:" + resource.getPath(), e); } diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java index c789df9feb..fd65d0a451 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java @@ -13,13 +13,12 @@ import io.cucumber.core.order.PickleOrder; import io.cucumber.core.order.StandardPickleOrders; import io.cucumber.core.snippets.SnippetType; -import io.cucumber.core.util.FixJava; import io.cucumber.datatable.DataTable; +import java.io.BufferedReader; +import java.io.InputStream; import java.io.InputStreamReader; -import java.io.Reader; import java.net.URI; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -152,9 +151,9 @@ private static void printUsage() { static void loadUsageTextIfNeeded() { if (usageText == null) { - try { - Reader reader = new InputStreamReader(FixJava.class.getResourceAsStream(USAGE_RESOURCE), UTF_8); - usageText = FixJava.readReader(reader); + InputStream usageResourceStream = RuntimeOptionsParser.class.getResourceAsStream(USAGE_RESOURCE); + try (BufferedReader br = new BufferedReader(new InputStreamReader(usageResourceStream, UTF_8))){ + usageText = br.lines().collect(joining(System.lineSeparator())); } catch (Exception e) { usageText = "Could not load usage text: " + e.toString(); } diff --git a/core/src/main/java/io/cucumber/core/plugin/URLOutputStream.java b/core/src/main/java/io/cucumber/core/plugin/URLOutputStream.java index 100c914634..8d64b700da 100644 --- a/core/src/main/java/io/cucumber/core/plugin/URLOutputStream.java +++ b/core/src/main/java/io/cucumber/core/plugin/URLOutputStream.java @@ -1,13 +1,21 @@ package io.cucumber.core.plugin; import gherkin.deps.com.google.gson.Gson; -import io.cucumber.core.util.FixJava; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Collections; import java.util.Map; +import java.util.stream.Collectors; + +import static java.nio.charset.StandardCharsets.UTF_8; /** @@ -79,25 +87,24 @@ public void flush() throws IOException { @Override public void close() throws IOException { try { - if (urlConnection != null) { - int responseCode = urlConnection.getResponseCode(); - if (responseCode != expectedResponseCode) { - try { - urlConnection.getInputStream().close(); - throw new IOException(String.format("Expected response code: %d. Got: %d", expectedResponseCode, responseCode)); - } catch (IOException expected) { - InputStream errorStream = urlConnection.getErrorStream(); - if (errorStream != null) { - String responseBody = FixJava.readReader(new InputStreamReader(errorStream, "UTF-8")); - String contentType = urlConnection.getHeaderField("Content-Type"); - if (contentType == null) { - contentType = "text/plain"; - } - throw new ResponseException(responseBody, expected, responseCode, contentType); - } else { - throw expected; - } - } + if (urlConnection == null) { + return; + } + + int responseCode = urlConnection.getResponseCode(); + if (responseCode == expectedResponseCode) { + return; + } + + try { + urlConnection.getInputStream().close(); + throw new IOException(String.format("Expected response code: %d. Got: %d", expectedResponseCode, responseCode)); + } catch (IOException expected) { + InputStream errorStream = urlConnection.getErrorStream(); + if (errorStream != null) { + throw createResponseException(responseCode, expected, errorStream); + } else { + throw expected; } } } finally { @@ -105,6 +112,17 @@ public void close() throws IOException { } } + private ResponseException createResponseException(int responseCode, IOException expected, InputStream errorStream) throws IOException { + try (BufferedReader br = new BufferedReader(new InputStreamReader(errorStream, UTF_8))) { + String responseBody = br.lines().collect(Collectors.joining(System.lineSeparator())); + String contentType = urlConnection.getHeaderField("Content-Type"); + if (contentType == null) { + contentType = "text/plain"; + } + return new ResponseException(responseBody, expected, responseCode, contentType); + } + } + public class ResponseException extends IOException { private final Gson gson = new Gson(); private final int responseCode; diff --git a/core/src/main/java/io/cucumber/core/util/FixJava.java b/core/src/main/java/io/cucumber/core/util/FixJava.java deleted file mode 100644 index 9f078af725..0000000000 --- a/core/src/main/java/io/cucumber/core/util/FixJava.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.cucumber.core.util; - -import java.io.IOException; -import java.io.Reader; - -public class FixJava { - - public static String readReader(Reader in) throws RuntimeException { - try { - StringBuilder buffer = new StringBuilder(); - final char[] data = new char[0x10000]; - int read; - - while ((read = in.read(data, 0, data.length)) != -1) { - buffer.append(data, 0, read); - } - return buffer.toString(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java index cc0b624fad..d3d886a86b 100644 --- a/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java @@ -1,17 +1,19 @@ package io.cucumber.core.plugin; +import gherkin.deps.com.google.gson.JsonParser; import io.cucumber.core.event.Result; -import io.cucumber.core.runner.TestHelper; import io.cucumber.core.feature.CucumberFeature; -import io.cucumber.core.util.FixJava; -import gherkin.deps.com.google.gson.JsonParser; +import io.cucumber.core.runner.TestHelper; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.junit.Test; import org.mockito.stubbing.Answer; +import java.io.BufferedReader; import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.time.Duration; @@ -23,11 +25,14 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.cucumber.core.runner.TestHelper.createEmbedHookAction; import static io.cucumber.core.runner.TestHelper.createWriteHookAction; import static io.cucumber.core.runner.TestHelper.feature; import static io.cucumber.core.runner.TestHelper.result; +import static java.nio.charset.StandardCharsets.US_ASCII; +import static java.nio.charset.StandardCharsets.UTF_8; import static java.time.Duration.ofMillis; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; @@ -49,7 +54,7 @@ public class HTMLFormatterTest { private URL outputDir; - public void writeReport() throws Throwable { + private void writeReport() throws Throwable { outputDir = TempDir.createTempDirectory().toURI().toURL(); runFeaturesWithFormatter(outputDir); } @@ -58,7 +63,7 @@ public void writeReport() throws Throwable { public void writes_index_html() throws Throwable { writeReport(); URL indexHtml = new URL(outputDir, "index.html"); - Document document = Jsoup.parse(new File(indexHtml.getFile()), "UTF-8"); + Document document = Jsoup.parse(new File(indexHtml.getFile()), UTF_8.name()); Element reportElement = document.body().getElementsByClass("cucumber-report").first(); assertEquals("", reportElement.text()); } @@ -66,10 +71,9 @@ public void writes_index_html() throws Throwable { @Test public void writes_valid_report_js() throws Throwable { writeReport(); - String reportJs = FixJava.readReader(new InputStreamReader(new URL(outputDir, "report.js").openStream(), "UTF-8")); assertJsFunctionCallSequence(asList("" + "formatter.uri(\"file:some/path/some.feature\");\n", - "formatter.feature({\n" + + "formatter.feature({\n" + " \"name\": \"\",\n" + " \"description\": \"\",\n" + " \"keyword\": \"Feature\"\n" + @@ -97,26 +101,25 @@ public void writes_valid_report_js() throws Throwable { "formatter.after({\n" + " \"status\": \"passed\"\n" + "});\n"), - reportJs); + readReportJs()); } @Test public void includes_uri() throws Throwable { writeReport(); - String reportJs = FixJava.readReader(new InputStreamReader(new URL(outputDir, "report.js").openStream(), "UTF-8")); - assertContains("formatter.uri(\"file:some/path/some.feature\");", reportJs); + assertContains("formatter.uri(\"file:some/path/some.feature\");", readReportJs()); } @Test public void included_embedding() throws Throwable { writeReport(); - String reportJs = FixJava.readReader(new InputStreamReader(new URL(outputDir, "report.js").openStream(), "UTF-8")); + String reportJs = readReportJs(); assertContains("formatter.embedding(\"image/png\", \"embedded0.png\");", reportJs); assertContains("formatter.embedding(\"text/plain\", \"dodgy stack trace here\");", reportJs); } @Test - public void should_handle_a_single_scenario() throws Throwable { + public void should_handle_a_single_scenario() { CucumberFeature feature = feature("path/test.feature", "" + "Feature: feature name\n" + " Scenario: scenario name\n" + @@ -167,7 +170,7 @@ public void should_handle_a_single_scenario() throws Throwable { } @Test - public void should_handle_backgound() throws Throwable { + public void should_handle_backgound() { CucumberFeature feature = feature("path/test.feature", "" + "Feature: feature name\n" + " Background: background name\n" + @@ -252,7 +255,7 @@ public void should_handle_backgound() throws Throwable { } @Test - public void should_handle_scenario_outline() throws Throwable { + public void should_handle_scenario_outline() { CucumberFeature feature = feature("path/test.feature", "" + "Feature: feature name\n" + " Scenario Outline: outline name\n" + @@ -369,7 +372,7 @@ public void should_handle_scenario_outline() throws Throwable { } @Test - public void should_handle_before_hooks() throws Throwable { + public void should_handle_before_hooks() { CucumberFeature feature = feature("path/test.feature", "" + "Feature: feature name\n" + " Scenario: scenario name\n" + @@ -405,7 +408,7 @@ public void should_handle_before_hooks() throws Throwable { } @Test - public void should_handle_after_hooks() throws Throwable { + public void should_handle_after_hooks() { CucumberFeature feature = feature("path/test.feature", "" + "Feature: feature name\n" + " Scenario: scenario name\n" + @@ -441,7 +444,7 @@ public void should_handle_after_hooks() throws Throwable { } @Test - public void should_handle_after_step_hooks() throws Throwable { + public void should_handle_after_step_hooks() { CucumberFeature feature = feature("path/test.feature", "" + "Feature: feature name\n" + " Scenario: scenario name\n" + @@ -500,7 +503,7 @@ public void should_handle_after_step_hooks() throws Throwable { } @Test - public void should_handle_output_from_before_hooks() throws Throwable { + public void should_handle_output_from_before_hooks() { CucumberFeature feature = feature("path/test.feature", "" + "Feature: feature name\n" + " Scenario: scenario name\n" + @@ -538,7 +541,7 @@ public void should_handle_output_from_before_hooks() throws Throwable { } @Test - public void should_handle_output_from_after_hooks() throws Throwable { + public void should_handle_output_from_after_hooks() { CucumberFeature feature = feature("path/test.feature", "" + "Feature: feature name\n" + " Scenario: scenario name\n" + @@ -576,7 +579,7 @@ public void should_handle_output_from_after_hooks() throws Throwable { } @Test - public void should_handle_output_from_after_step_hooks() throws Throwable { + public void should_handle_output_from_after_step_hooks() { CucumberFeature feature = feature("path/test.feature", "" + "Feature: feature name\n" + " Scenario: scenario name\n" + @@ -631,7 +634,7 @@ public void should_handle_output_from_after_step_hooks() throws Throwable { } @Test - public void should_handle_text_embeddings_from_before_hooks() throws Throwable { + public void should_handle_text_embeddings_from_before_hooks() { CucumberFeature feature = feature("path/test.feature", "" + "Feature: feature name\n" + " Scenario: scenario name\n" + @@ -640,7 +643,7 @@ public void should_handle_text_embeddings_from_before_hooks() throws Throwable { stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); hooks.add(TestHelper.hookEntry("before", result("passed"))); - hookActions.add(createEmbedHookAction("embedded from hook".getBytes("US-ASCII"), "text/ascii")); + hookActions.add(createEmbedHookAction("embedded from hook".getBytes(US_ASCII), "text/ascii")); stepDuration = ofMillis(1L); String formatterOutput = runFeaturesWithFormatter(); @@ -668,6 +671,13 @@ public void should_handle_text_embeddings_from_before_hooks() throws Throwable { formatterOutput); } + private String readReportJs() throws IOException { + InputStream reportJsStream = new URL(outputDir, "report.js").openStream(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(reportJsStream, UTF_8))) { + return br.lines().collect(Collectors.joining(System.lineSeparator())); + } + } + private void assertJsFunctionCallSequence(List expectedList, String actual) { Iterator expectedIterator = expectedList.iterator(); String expected = expectedIterator.next(); @@ -727,19 +737,19 @@ private void assertContains(String substring, String string) { } } - private void runFeaturesWithFormatter(URL outputDir) throws Throwable { + private void runFeaturesWithFormatter(URL outputDir) { final HTMLFormatter f = new HTMLFormatter(outputDir); CucumberFeature feature = feature("some/path/some.feature", "" + - "Feature:\n" + - " Scenario: some cukes\n" + - " Given first step\n"); + "Feature:\n" + + " Scenario: some cukes\n" + + " Given first step\n"); features.add(feature); stepsToResult.put("first step", result("passed")); stepsToLocation.put("first step", "path/step_definitions.java:3"); hooks.add(TestHelper.hookEntry("after", result("passed"))); hooks.add(TestHelper.hookEntry("after", result("passed"))); - hookActions.add(createEmbedHookAction("fakedata".getBytes("US-ASCII"), "image/png")); - hookActions.add(createEmbedHookAction("dodgy stack trace here".getBytes("US-ASCII"), "text/plain")); + hookActions.add(createEmbedHookAction("fakedata".getBytes(US_ASCII), "image/png")); + hookActions.add(createEmbedHookAction("dodgy stack trace here".getBytes(US_ASCII), "text/plain")); stepDuration = ofMillis(1L); runFeaturesWithFormatter(f); diff --git a/core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java b/core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java index 2c13d3d217..b5bd2fbfb1 100644 --- a/core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/URLOutputStreamTest.java @@ -4,6 +4,7 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -17,6 +18,7 @@ import java.net.URISyntaxException; import java.net.URL; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -27,6 +29,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import org.junit.After; import org.junit.Before; @@ -41,8 +44,6 @@ import org.webbitserver.netty.NettyWebServer; import org.webbitserver.rest.Rest; -import io.cucumber.core.util.FixJava; - public class URLOutputStreamTest { private static final URL CUCUMBER_STEPDEFS = createUrl("http://localhost:9873/.cucumber/stepdefs.json"); @@ -85,7 +86,7 @@ public void write_to_file_without_existing_parent_directory() throws IOException w.close(); File testFile = new File(urlWithoutParentDirectory.toURI()); - assertEquals("Hellesøy", FixJava.readReader(openUTF8FileReader(testFile))); + assertEquals("Hellesøy", read(testFile)); } @Test @@ -94,7 +95,7 @@ public void can_write_to_file() throws IOException { Writer w = TestUTF8OutputStreamWriter.create(new URLOutputStream(tmp.toURI().toURL())); w.write("Hellesøy"); w.close(); - assertEquals("Hellesøy", FixJava.readReader(openUTF8FileReader(tmp))); + assertEquals("Hellesøy", read(tmp)); } @Test @@ -163,8 +164,16 @@ public void do_not_throw_ioe_if_parent_dir_created_by_another_thread() { assertTrue("Some thread get error during work. Error list:" + threadErrors.toString(), threadErrors.isEmpty()); } + private String read(File testFile) throws IOException { + String result; + try (BufferedReader br = new BufferedReader(openUTF8FileReader(testFile))) { + result = br.lines().collect(Collectors.joining(System.lineSeparator())); + } + return result; + } + private Reader openUTF8FileReader(final File file) throws IOException { - return new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8")); + return new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); } private List getThreadsWithLatchForFile(final CountDownLatch countDownLatch, int threadsCount) { From 988b1eb5d8dce37de0a0c74a8a2e2317d7b201f3 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 30 Jun 2019 12:52:51 +0200 Subject: [PATCH 115/155] [Core] Mark public API in step expression package --- .../core/stepexpression/Argument.java | 3 ++ .../core/stepexpression/ArgumentMatcher.java | 32 +++++++++++++++- .../ExpressionArgumentMatcher.java | 37 ------------------- .../core/stepexpression/StepExpression.java | 2 + .../stepexpression/StepExpressionFactory.java | 2 + .../core/stepexpression/TypeRegistry.java | 2 + .../core/stepexpression/TypeResolver.java | 3 ++ .../cucumber/core/runner/CachingGlueTest.java | 6 +-- .../core/runtime/StubStepDefinition.java | 6 +-- .../io/cucumber/java/JavaStepDefinition.java | 3 +- .../cucumber/java8/Java8StepDefinition.java | 10 ++--- 11 files changed, 52 insertions(+), 54 deletions(-) delete mode 100644 core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgumentMatcher.java diff --git a/core/src/main/java/io/cucumber/core/stepexpression/Argument.java b/core/src/main/java/io/cucumber/core/stepexpression/Argument.java index 745df56f01..cde30ddcc2 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/Argument.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/Argument.java @@ -1,5 +1,8 @@ package io.cucumber.core.stepexpression; +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE) public interface Argument { Object getValue(); diff --git a/core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java b/core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java index 41c7e29768..acd905ccc7 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java @@ -1,10 +1,38 @@ package io.cucumber.core.stepexpression; import gherkin.pickles.PickleStep; +import gherkin.pickles.PickleString; +import gherkin.pickles.PickleTable; +import org.apiguardian.api.API; import java.lang.reflect.Type; import java.util.List; -public interface ArgumentMatcher { - List argumentsFrom(PickleStep step, Type... types); +@API(status = API.Status.STABLE) +public final class ArgumentMatcher { + + private final StepExpression expression; + + public ArgumentMatcher(StepExpression expression) { + this.expression = expression; + } + + public List argumentsFrom(PickleStep step, Type... types) { + if (step.getArgument().isEmpty()) { + return expression.match(step.getText(), types); + } + + gherkin.pickles.Argument argument = step.getArgument().get(0); + + if (argument instanceof PickleString) { + return expression.match(step.getText(), ((PickleString) argument).getContent(), types); + } + + if (argument instanceof PickleTable) { + return expression.match(step.getText(), PickleTableConverter.toTable((PickleTable) argument), types); + } + + throw new IllegalStateException("Argument was neither PickleString nor PickleTable"); + } + } diff --git a/core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgumentMatcher.java b/core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgumentMatcher.java deleted file mode 100644 index 66fc07d6b5..0000000000 --- a/core/src/main/java/io/cucumber/core/stepexpression/ExpressionArgumentMatcher.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.cucumber.core.stepexpression; - -import gherkin.pickles.PickleStep; -import gherkin.pickles.PickleString; -import gherkin.pickles.PickleTable; - -import java.lang.reflect.Type; -import java.util.List; - -public class ExpressionArgumentMatcher implements ArgumentMatcher { - - private final StepExpression expression; - - public ExpressionArgumentMatcher(StepExpression expression) { - this.expression = expression; - } - - @Override - public List argumentsFrom(PickleStep step, Type... types) { - if (step.getArgument().isEmpty()) { - return expression.match(step.getText(), types); - } - - gherkin.pickles.Argument argument = step.getArgument().get(0); - - if (argument instanceof PickleString) { - return expression.match(step.getText(), ((PickleString) argument).getContent(), types); - } - - if (argument instanceof PickleTable) { - return expression.match(step.getText(), PickleTableConverter.toTable((PickleTable) argument), types); - } - - throw new IllegalStateException("Argument was neither PickleString nor PickleTable"); - } - -} diff --git a/core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java b/core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java index f49a45c37e..676e6f90bd 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java @@ -1,11 +1,13 @@ package io.cucumber.core.stepexpression; import io.cucumber.cucumberexpressions.Expression; +import org.apiguardian.api.API; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; +@API(status = API.Status.STABLE) public final class StepExpression { private final Expression expression; diff --git a/core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java b/core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java index 2311a6c29d..fa83533ebb 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java @@ -6,12 +6,14 @@ import io.cucumber.datatable.DataTable; import io.cucumber.cucumberexpressions.Expression; +import org.apiguardian.api.API; import java.lang.reflect.Type; import java.util.List; import static java.util.Collections.singletonList; +@API(status = API.Status.STABLE) public final class StepExpressionFactory { private final io.cucumber.cucumberexpressions.ExpressionFactory expressionFactory; diff --git a/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java b/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java index 4055fdc888..ce51905696 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java @@ -7,9 +7,11 @@ import io.cucumber.datatable.DataTableTypeRegistry; import io.cucumber.datatable.TableCellByTypeTransformer; import io.cucumber.datatable.TableEntryByTypeTransformer; +import org.apiguardian.api.API; import java.util.Locale; +@API(status = API.Status.STABLE) public final class TypeRegistry implements io.cucumber.core.api.TypeRegistry { private final ParameterTypeRegistry parameterTypeRegistry; diff --git a/core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java b/core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java index 0ae6777cb7..2240262a27 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java @@ -1,10 +1,13 @@ package io.cucumber.core.stepexpression; +import org.apiguardian.api.API; + import java.lang.reflect.Type; /** * Allows lazy resolution of the type of a data table or doc string. */ +@API(status = API.Status.STABLE) public interface TypeResolver { /** diff --git a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index 1535ede275..c94777fafa 100644 --- a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -12,10 +12,8 @@ import io.cucumber.core.backend.DuplicateStepDefinitionException; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.runtime.TimeServiceEventBus; import io.cucumber.core.stepexpression.ArgumentMatcher; -import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; import io.cucumber.core.stepexpression.StepExpression; import io.cucumber.core.stepexpression.StepExpressionFactory; import io.cucumber.core.stepexpression.TypeRegistry; @@ -278,7 +276,7 @@ private static class MockedScenarioScopedStepDefinition implements StepDefinitio @Override public List matchedArguments(PickleStep step) { StepExpression expression = new StepExpressionFactory(new TypeRegistry(ENGLISH)).createExpression(pattern); - final ArgumentMatcher argumentMatcher = new ExpressionArgumentMatcher(expression); + final ArgumentMatcher argumentMatcher = new ArgumentMatcher(expression); return argumentMatcher.argumentsFrom(step); } @@ -357,7 +355,7 @@ private static class MockedStepDefinition implements StepDefinition { @Override public List matchedArguments(PickleStep step) { StepExpression expression = new StepExpressionFactory(new TypeRegistry(ENGLISH)).createExpression(pattern); - final ArgumentMatcher argumentMatcher = new ExpressionArgumentMatcher(expression); + final ArgumentMatcher argumentMatcher = new ArgumentMatcher(expression); return argumentMatcher.argumentsFrom(step); } diff --git a/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java b/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java index aef325e37f..d5c5d02a14 100644 --- a/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java +++ b/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java @@ -5,7 +5,6 @@ import io.cucumber.core.stepexpression.Argument; import gherkin.pickles.PickleStep; import io.cucumber.core.stepexpression.ArgumentMatcher; -import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; import io.cucumber.core.stepexpression.StepExpression; import io.cucumber.core.stepexpression.StepExpressionFactory; @@ -16,8 +15,9 @@ import static org.junit.Assert.assertEquals; public class StubStepDefinition implements StepDefinition { + private final List parameters; private final StepExpression expression; - private List parameters; + private final ArgumentMatcher argumentMatcher; public StubStepDefinition(String pattern, TypeRegistry typeRegistry, Type... types) { this.parameters = Arrays.asList(types); @@ -27,11 +27,11 @@ public StubStepDefinition(String pattern, TypeRegistry typeRegistry, Type... typ Type lastParameter = parameters.get(parameters.size() - 1); this.expression = new StepExpressionFactory(typeRegistry).createExpression(pattern, lastParameter); } + this.argumentMatcher = new ArgumentMatcher(expression); } @Override public List matchedArguments(PickleStep step) { - ArgumentMatcher argumentMatcher = new ExpressionArgumentMatcher(expression); return argumentMatcher.argumentsFrom(step); } diff --git a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java index 88b8a4c2a3..7d8f6b3fc4 100644 --- a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java @@ -5,7 +5,6 @@ import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.ArgumentMatcher; -import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; import io.cucumber.core.reflection.MethodFormat; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.stepexpression.StepExpression; @@ -40,7 +39,7 @@ final class JavaStepDefinition implements StepDefinition { List parameterInfos = ParameterInfo.fromMethod(method); this.parameterTypes = getTypes(parameterInfos); this.expression = createExpression(parameterInfos, expression, typeRegistry); - this.argumentMatcher = new ExpressionArgumentMatcher(this.expression); + this.argumentMatcher = new ArgumentMatcher(this.expression); this.shortFormat = MethodFormat.SHORT.format(method); this.fullFormat = MethodFormat.FULL.format(method); } diff --git a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java index 977a563dbf..c877ec1cbe 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java @@ -7,7 +7,6 @@ import io.cucumber.core.runner.ScenarioScoped; import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.ArgumentMatcher; -import io.cucumber.core.stepexpression.ExpressionArgumentMatcher; import io.cucumber.core.stepexpression.StepExpression; import io.cucumber.core.stepexpression.StepExpressionFactory; import io.cucumber.core.stepexpression.TypeRegistry; @@ -38,12 +37,11 @@ public static StepDefinition create( private final long timeoutMillis; private StepdefBody body; - - private final StepExpression expression; private final StackTraceElement location; - - private final List parameterInfos; private final Method method; + private final List parameterInfos; + private final StepExpression expression; + private final ArgumentMatcher argumentMatcher; private Java8StepDefinition(String expression, long timeoutMillis, @@ -57,6 +55,7 @@ private Java8StepDefinition(String expression, this.method = getAcceptMethod(body.getClass()); this.parameterInfos = fromTypes(resolveRawArguments(bodyClass, body.getClass())); this.expression = createExpression(expression, typeRegistry); + this.argumentMatcher = new ArgumentMatcher(this.expression); } private StepExpression createExpression(String expression, TypeRegistry typeRegistry) { @@ -89,7 +88,6 @@ private CucumberException withLocation(CucumberException exception) { @Override public List matchedArguments(PickleStep step) { - ArgumentMatcher argumentMatcher = new ExpressionArgumentMatcher(expression); Type[] types = new Type[parameterInfos.size()]; for (int i = 0; i < types.length; i++) { types[i] = parameterInfos.get(i).getType(); From 0ee662018a78b9d4655cc19dcf7e75897e3cefb8 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Fri, 12 Jul 2019 22:55:25 +0200 Subject: [PATCH 116/155] [Java] Deprecate `timout` in favour of library based solutions ## Summary It is possible to provide a timeout to step definitions, however the semantics are unreliable ( #1506). ```java @Given(value = "^I have (\\d+) cukes in my belly$", timeout = 5000) public void I_have_cukes_in_my_belly(int cukes) throws Throwable { } ``` Fixes: #1694 ## Current Behavior When the step starts a long running task Cucumber will attempt to interrupt the step once the timeout period is exceeded. If the long running task ignores the interrupt Cucumber will however not stop the test. Depending on the context this behavior is either desired or undesirable. See #1506 for in detail discussion. Additionally the current implementation is complex and has been prone to failures (#1244, #1241, #811, #639, #540). ## Possible Solution While it is possible to implement different strategies to deal with timeouts; there is no perfect solution. And regardless of which solution we pick we would take on a significant amount of complexity. So I believe that for Cucumber there is no good solution. However this problem has been solved by various libraries: * [JUnit 5 `Assertions.assertTimeout*`](https://junit.org/junit5/docs/5.0.1/api/org/junit/jupiter/api/Assertions.html#assertTimeout-java.time.Duration-org.junit.jupiter.api.function.Executable-) * [Awaitility](https://github.com/awaitility/awaitility) * [Guava `TimeLimiter`](https://github.com/google/guava/blob/master/guava/src/com/google/common/util/concurrent/TimeLimiter.java) So rather then keeping a poor feature alive we should recommend users to migrate to third party solutions. ## Context & Motivation Remove the eldritch horror that is `Invoker/Timeout.timeout`. While this could have been done in v4.x, v5 will use Java 8 and most of the above libraries require Java 8. --- java/src/main/groovy/annotation.java.gsp | 3 +++ java8/src/main/groovy/lambda.java.gsp | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/java/src/main/groovy/annotation.java.gsp b/java/src/main/groovy/annotation.java.gsp index 92bbf24fd1..4802adf989 100644 --- a/java/src/main/groovy/annotation.java.gsp +++ b/java/src/main/groovy/annotation.java.gsp @@ -52,7 +52,10 @@ public @interface ${kw} { * cucumber will wait for the this hook to finish. * * @return timeout in milliseconds. 0 (default) means no restriction. + * @deprecated use a library based solution instead. E.g. Awaitility + * or JUnit 5s Assertions.assertTimeout. */ + @Deprecated long timeout() default 0; /** diff --git a/java8/src/main/groovy/lambda.java.gsp b/java8/src/main/groovy/lambda.java.gsp index d39d6e17d6..74c2997703 100644 --- a/java8/src/main/groovy/lambda.java.gsp +++ b/java8/src/main/groovy/lambda.java.gsp @@ -63,7 +63,10 @@ public interface ${className} extends LambdaGlue { * @param expression the cucumber expression * @param timeoutMillis timeout in milliseconds. 0 (default) means no restriction. * @param body a lambda expression with no parameters + * @deprecated use a library based solution instead. E.g. Awaitility + * or JUnit 5s Assertions.assertTimeout. */ + @Deprecated default void ${java.text.Normalizer.normalize(kw.replaceAll("[\\s',!]", ""), java.text.Normalizer.Form.NFC)}(String expression, long timeoutMillis, A0 body) { LambdaGlueRegistry.INSTANCE.get().addStepDefinition((typeRegistry) -> Java8StepDefinition.create(expression, timeoutMillis, A0.class, body, typeRegistry) @@ -101,7 +104,10 @@ public interface ${className} extends LambdaGlue { * @param body a lambda expression with ${arity} parameters * <% (1..arity).each { i -> %> * @param type of argument ${i} <% } %> + * @deprecated use a library based solution instead. E.g. Awaitility + * or JUnit 5s Assertions.assertTimeout. */ + @Deprecated default <${genericSignature}> void ${java.text.Normalizer.normalize(kw.replaceAll("[\\s',!]", ""), java.text.Normalizer.Form.NFC)}(String expression, long timeoutMillis, A${arity}<${genericSignature}> body) { LambdaGlueRegistry.INSTANCE.get().addStepDefinition((typeRegistry) -> Java8StepDefinition.create(expression, timeoutMillis, A${arity}.class, body, typeRegistry) From 9240c10004c97b2c385ad6cd18e429303375c4be Mon Sep 17 00:00:00 2001 From: Konrad M Date: Tue, 16 Jul 2019 17:29:10 +0200 Subject: [PATCH 117/155] [Core] Add name to embedding (#1698) --- .../java/io/cucumber/core/api/Scenario.java | 12 +++ .../io/cucumber/core/event/EmbedEvent.java | 13 ++++ .../cucumber/core/plugin/HTMLFormatter.java | 4 +- .../cucumber/core/plugin/JSONFormatter.java | 11 ++- .../io/cucumber/core/runner/Scenario.java | 13 ++-- .../io/cucumber/core/plugin/html/formatter.js | 14 +++- .../core/plugin/HTMLFormatterTest.java | 12 +-- .../core/plugin/JSONFormatterTest.java | 75 +++++++++++++++++++ .../io/cucumber/core/runner/TestHelper.java | 11 ++- 9 files changed, 141 insertions(+), 24 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/api/Scenario.java b/core/src/main/java/io/cucumber/core/api/Scenario.java index a20cea881b..01687bc75e 100644 --- a/core/src/main/java/io/cucumber/core/api/Scenario.java +++ b/core/src/main/java/io/cucumber/core/api/Scenario.java @@ -34,9 +34,21 @@ public interface Scenario { * * @param data what to embed, for example an image. * @param mimeType what is the data? + * + * @deprecated use {@link Scenario#embed(byte[], String, String)} instead. */ + @Deprecated void embed(byte[] data, String mimeType); + /** + * Like {@link Scenario#embed(byte[], String)}, but with name for the embedding. + * + * @param data what to embed, for example an image. + * @param mimeType what is the data? + * @param name embedding name + */ + void embed(byte[] data, String mimeType, String name); + /** * Outputs some text into the report. * diff --git a/core/src/main/java/io/cucumber/core/event/EmbedEvent.java b/core/src/main/java/io/cucumber/core/event/EmbedEvent.java index e3ee749e47..0dfd4e1d3d 100644 --- a/core/src/main/java/io/cucumber/core/event/EmbedEvent.java +++ b/core/src/main/java/io/cucumber/core/event/EmbedEvent.java @@ -9,11 +9,20 @@ public final class EmbedEvent extends TestCaseEvent { private final byte[] data; private final String mimeType; + public final String name; public EmbedEvent(Instant timeInstant, TestCase testCase, byte[] data, String mimeType) { super(timeInstant, testCase); this.data = Objects.requireNonNull(data); this.mimeType = Objects.requireNonNull(mimeType); + this.name = null; + } + + public EmbedEvent(Instant timeInstant, TestCase testCase, byte[] data, String mimeType, String name) { + super(timeInstant, testCase); + this.data = data; + this.mimeType = mimeType; + this.name = name; } public byte[] getData() { @@ -23,4 +32,8 @@ public byte[] getData() { public String getMimeType() { return mimeType; } + + public String getName() { + return name; + } } diff --git a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java index 90eef92fe0..8f7c599cc3 100644 --- a/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/HTMLFormatter.java @@ -212,14 +212,14 @@ private void handleEmbed(EmbedEvent event) { String mimeType = event.getMimeType(); if (mimeType.startsWith("text/")) { // just pass straight to the plugin to output in the html - jsFunctionCall("embedding", mimeType, new String(event.getData())); + jsFunctionCall("embedding", mimeType, new String(event.getData()), event.getName()); } else { // Creating a file instead of using data urls to not clutter the js file String extension = MIME_TYPES_EXTENSIONS.get(mimeType); if (extension != null) { StringBuilder fileName = new StringBuilder("embedded").append(embeddedIndex++).append(".").append(extension); writeBytesToURL(event.getData(), toUrl(fileName.toString())); - jsFunctionCall("embedding", mimeType, fileName); + jsFunctionCall("embedding", mimeType, fileName, event.getName()); } } } diff --git a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java index 1bcad06a24..da5eb2a4bf 100644 --- a/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java +++ b/core/src/main/java/io/cucumber/core/plugin/JSONFormatter.java @@ -165,7 +165,7 @@ private void handleWrite(WriteEvent event) { } private void handleEmbed(EmbedEvent event) { - addEmbeddingToHookMap(event.getData(), event.getMimeType()); + addEmbeddingToHookMap(event.getData(), event.getMimeType(), event.getName()); } private void handleTestStepFinished(TestStepFinished event) { @@ -339,18 +339,21 @@ private void addOutputToHookMap(String text) { ((List)currentStepOrHookMap.get("output")).add(text); } - private void addEmbeddingToHookMap(byte[] data, String mimeType) { + private void addEmbeddingToHookMap(byte[] data, String mimeType, String name) { if (!currentStepOrHookMap.containsKey("embeddings")) { currentStepOrHookMap.put("embeddings", new ArrayList>()); } - Map embedMap = createEmbeddingMap(data, mimeType); + Map embedMap = createEmbeddingMap(data, mimeType, name); ((List>)currentStepOrHookMap.get("embeddings")).add(embedMap); } - private Map createEmbeddingMap(byte[] data, String mimeType) { + private Map createEmbeddingMap(byte[] data, String mimeType, String name) { Map embedMap = new HashMap<>(); embedMap.put("mime_type", mimeType); embedMap.put("data", Base64.encodeBytes(data)); + if (name != null) { + embedMap.put("name", name); + } return embedMap; } diff --git a/core/src/main/java/io/cucumber/core/runner/Scenario.java b/core/src/main/java/io/cucumber/core/runner/Scenario.java index 706e332a48..22c7ea82eb 100644 --- a/core/src/main/java/io/cucumber/core/runner/Scenario.java +++ b/core/src/main/java/io/cucumber/core/runner/Scenario.java @@ -48,16 +48,17 @@ public boolean isFailed() { @Override public void embed(byte[] data, String mimeType) { - if (bus != null) { - bus.send(new EmbedEvent(bus.getInstant(), testCase, data, mimeType)); - } + bus.send(new EmbedEvent(bus.getInstant(), testCase, data, mimeType)); + } + + @Override + public void embed(byte[] data, String mimeType, String name) { + bus.send(new EmbedEvent(bus.getInstant(), testCase, data, mimeType, name)); } @Override public void write(String text) { - if (bus != null) { - bus.send(new WriteEvent(bus.getInstant(), testCase, text)); - } + bus.send(new WriteEvent(bus.getInstant(), testCase, text)); } @Override diff --git a/core/src/main/resources/io/cucumber/core/plugin/html/formatter.js b/core/src/main/resources/io/cucumber/core/plugin/html/formatter.js index 5cfeabd5de..17c4c24ed4 100644 --- a/core/src/main/resources/io/cucumber/core/plugin/html/formatter.js +++ b/core/src/main/resources/io/cucumber/core/plugin/html/formatter.js @@ -93,21 +93,27 @@ CucumberHTML.DOMFormatter = function(rootNode) { } }; - this.embedding = function(mimeType, data) { + this.embedding = function(mimeType, data, name) { + var nameHtml; + if (!name) { + nameHtml = ""; + } else { + nameHtml = "

        " + name + "

        "; + } if (currentStepIndex == 1) { this.dummyStep(); } if (mimeType.match(/^image\//)) { - currentStep.append(''); + currentStep.append(nameHtml + ''); } else if (mimeType.match(/^video\//)) { - currentStep.append(''); + currentStep.append(nameHtml + ''); } else if (mimeType.match(/^text\//)) { - this.write(data); + this.write(nameHtml + data); } }; diff --git a/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java index d3d886a86b..680348374d 100644 --- a/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/HTMLFormatterTest.java @@ -93,11 +93,11 @@ public void writes_valid_report_js() throws Throwable { "formatter.result({\n" + " \"status\": \"passed\"\n" + "});\n", - "formatter.embedding(\"image/png\", \"embedded0.png\");\n", + "formatter.embedding(\"image/png\", \"embedded0.png\", \"Fake image\");\n", "formatter.after({\n" + " \"status\": \"passed\"\n" + "});\n", - "formatter.embedding(\"text/plain\", \"dodgy stack trace here\");\n", + "formatter.embedding(\"text/plain\", \"dodgy stack trace here\", null);\n", "formatter.after({\n" + " \"status\": \"passed\"\n" + "});\n"), @@ -114,8 +114,8 @@ public void includes_uri() throws Throwable { public void included_embedding() throws Throwable { writeReport(); String reportJs = readReportJs(); - assertContains("formatter.embedding(\"image/png\", \"embedded0.png\");", reportJs); - assertContains("formatter.embedding(\"text/plain\", \"dodgy stack trace here\");", reportJs); + assertContains("formatter.embedding(\"image/png\", \"embedded0.png\", \"Fake image\");", reportJs); + assertContains("formatter.embedding(\"text/plain\", \"dodgy stack trace here\", null);", reportJs); } @Test @@ -654,7 +654,7 @@ public void should_handle_text_embeddings_from_before_hooks() { " \"keyword\": \"Scenario\",\n" + " \"name\": \"scenario name\"\n" + "});\n", "" + - "formatter.embedding(\"text/ascii\", \"embedded from hook\");\n", "" + + "formatter.embedding(\"text/ascii\", \"embedded from hook\", null);\n", "" + "formatter.before({\n" + " \"status\": \"passed\"\n" + "});\n", "" + @@ -748,7 +748,7 @@ private void runFeaturesWithFormatter(URL outputDir) { stepsToLocation.put("first step", "path/step_definitions.java:3"); hooks.add(TestHelper.hookEntry("after", result("passed"))); hooks.add(TestHelper.hookEntry("after", result("passed"))); - hookActions.add(createEmbedHookAction("fakedata".getBytes(US_ASCII), "image/png")); + hookActions.add(createEmbedHookAction("fakedata".getBytes(US_ASCII), "image/png", "Fake image")); hookActions.add(createEmbedHookAction("dodgy stack trace here".getBytes(US_ASCII), "text/plain")); stepDuration = ofMillis(1L); diff --git a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java index c37915d7b0..fd905b7192 100755 --- a/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java +++ b/core/src/test/java/io/cucumber/core/plugin/JSONFormatterTest.java @@ -857,6 +857,81 @@ public void should_handle_embed_from_a_hook() { assertThat(formatterOutput, sameJSONAs(expected)); } + @Test + public void should_handle_embed_with_name_from_a_hook() { + CucumberFeature feature = TestHelper.feature("path/test.feature", "" + + "Feature: Banana party\n" + + "\n" + + " Scenario: Monkey eats bananas\n" + + " Given there are bananas\n"); + features.add(feature); + stepsToResult.put("there are bananas", result("passed")); + stepsToLocation.put("there are bananas", "StepDefs.there_are_bananas()"); + hooks.add(TestHelper.hookEntry("before", result("passed"))); + hookLocations.add("Hooks.before_hook_1()"); + hookActions.add(createEmbedHookAction(new byte[]{1, 2, 3}, "mime-type;base64", "someEmbedding")); + stepDuration = ofMillis(1L); + + String formatterOutput = runFeaturesWithFormatter(); + + String expected = "" + + "[\n" + + " {\n" + + " \"id\": \"banana-party\",\n" + + " \"uri\": \"file:path/test.feature\",\n" + + " \"keyword\": \"Feature\",\n" + + " \"name\": \"Banana party\",\n" + + " \"line\": 1,\n" + + " \"description\": \"\",\n" + + " \"elements\": [\n" + + " {\n" + + " \"id\": \"banana-party;monkey-eats-bananas\",\n" + + " \"keyword\": \"Scenario\",\n" + + " \"start_timestamp\": \"1970-01-01T00:00:00.000Z\",\n" + + " \"name\": \"Monkey eats bananas\",\n" + + " \"line\": 3,\n" + + " \"description\": \"\",\n" + + " \"type\": \"scenario\",\n" + + " \"before\": [\n" + + " {\n" + + " \"match\": {\n" + + " \"location\": \"Hooks.before_hook_1()\"\n" + + " },\n" + + " \"embeddings\": [\n" + + " {\n" + + " \"mime_type\": \"mime-type;base64\",\n" + + " \"data\": \"AQID\",\n" + + " \"name\": \"someEmbedding\"\n" + + " }\n" + + " ],\n" + + " \"result\": {\n" + + " \"status\": \"passed\",\n" + + " \"duration\": 1000000\n" + + " }\n" + + " }\n" + + " ],\n" + + " \"steps\": [\n" + + " {\n" + + " \"keyword\": \"Given \",\n" + + " \"name\": \"there are bananas\",\n" + + " \"line\": 4,\n" + + " \"match\": {\n" + + " \"location\": \"StepDefs.there_are_bananas()\"\n" + + " },\n" + + " \"result\": {\n" + + " \"status\": \"passed\",\n" + + " \"duration\": 1000000\n" + + " }\n" + + " }\n" + + " ]\n" + + " }\n" + + " ],\n" + + " \"tags\": []\n" + + " }\n" + + "]"; + assertThat(formatterOutput, sameJSONAs(expected)); + } + @Test public void should_format_scenario_with_a_step_with_a_doc_string() { CucumberFeature feature = TestHelper.feature("path/test.feature", "" + diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index 2ee8ce7e85..15e8656f6b 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -497,17 +497,24 @@ public Object answer(InvocationOnMock invocation) { } public static Answer createEmbedHookAction(final byte[] data, final String mimeType) { + return createEmbedHookAction(data, mimeType, null); + } + + public static Answer createEmbedHookAction(final byte[] data, final String mimeType, final String name) { return new Answer() { @Override public Object answer(InvocationOnMock invocation) { Scenario scenario = (Scenario) invocation.getArguments()[0]; - scenario.embed(data, mimeType); + if (name != null) { + scenario.embed(data, mimeType, name); + } else { + scenario.embed(data, mimeType); + } return null; } }; } - private static AssertionFailedError mockAssertionFailedError() { AssertionFailedError error = mock(AssertionFailedError.class); Answer printStackTraceHandler = new Answer() { From 0ae4fcfdab702f1720f5254218d9dc57efb3b7b9 Mon Sep 17 00:00:00 2001 From: Konrad M Date: Tue, 16 Jul 2019 17:29:39 +0200 Subject: [PATCH 118/155] [Core] Add name to embedding (#1698) From b854f557c9df3aa94ae557e1091cacc8b05bf216 Mon Sep 17 00:00:00 2001 From: Konrad M Date: Tue, 16 Jul 2019 17:30:39 +0200 Subject: [PATCH 119/155] [Core] Add name to embedding (#1698) From 80f2605338403412838d1f9aec5e975e309c9a17 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 16 Jul 2019 18:32:44 +0200 Subject: [PATCH 120/155] [Core] Add property to select io.cucumber.core.backend.ObjectFactory Reimplementation of #1700 for `develop-v5` --- .../options/CucumberPropertiesParser.java | 39 +++++++++++++++---- .../cucumber/core/options/RuntimeOptions.java | 11 ++++++ .../core/options/RuntimeOptionsBuilder.java | 10 +++++ .../java/io/cucumber/core/runner/Options.java | 3 ++ .../core/runtime/ObjectFactoryLoader.java | 14 +++---- .../io/cucumber/core/runtime/Runtime.java | 4 +- .../SingletonObjectFactorySupplier.java | 9 ++++- .../ThreadLocalObjectFactorySupplier.java | 19 +++++---- .../runtime/BackendServiceLoaderTest.java | 6 +-- .../runtime/SingletonRunnerSupplierTest.java | 6 +-- .../ThreadLocalRunnerSupplierTest.java | 3 +- .../main/java/io/cucumber/junit/Cucumber.java | 2 +- .../io/cucumber/junit/FeatureRunnerTest.java | 2 +- .../cucumber/testng/TestNGCucumberRunner.java | 2 +- 14 files changed, 93 insertions(+), 37 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java b/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java index 93a2ae7149..b126c2a58e 100644 --- a/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java +++ b/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java @@ -1,5 +1,7 @@ package io.cucumber.core.options; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.feature.RerunLoader; @@ -19,16 +21,39 @@ public CucumberPropertiesParser() { this(new MultiLoader(CucumberPropertiesParser.class.getClassLoader())); } - public RuntimeOptionsBuilder parse(Map properties){ + public RuntimeOptionsBuilder parse(Map properties) { + final RuntimeOptionsBuilder builder; String cucumberOptions = properties.get("cucumber.options"); - if (cucumberOptions == null) { - return new RuntimeOptionsBuilder(); + if (cucumberOptions != null) { + RerunLoader rerunLoader = new RerunLoader(resourceLoader); + RuntimeOptionsParser parser = new RuntimeOptionsParser(rerunLoader); + List args = ShellWords.parse(cucumberOptions); + builder = parser.parse(args); + } else { + builder = new RuntimeOptionsBuilder(); } - RerunLoader rerunLoader = new RerunLoader(resourceLoader); - RuntimeOptionsParser parser = new RuntimeOptionsParser(rerunLoader); - List args = ShellWords.parse(cucumberOptions); - return parser.parse(args); + String cucumberObjectFactory = properties.get("cucumber.object-factory"); + if (cucumberObjectFactory != null) { + Class objectFactoryClass = parse(cucumberObjectFactory); + builder.setObjectFactoryClass(objectFactoryClass); + } + + return builder; + } + + @SuppressWarnings("unchecked") + private Class parse(String cucumberObjectFactory) { + Class objectFactoryClass; + try { + objectFactoryClass = Class.forName(cucumberObjectFactory); + } catch (ClassNotFoundException e) { + throw new CucumberException("Could not load object factory class for " + cucumberObjectFactory, e); + } + if (!objectFactoryClass.isAssignableFrom(ObjectFactory.class)) { + throw new CucumberException("Object factory class " + objectFactoryClass + " was not a subclass of " + ObjectFactory.class); + } + return (Class) objectFactoryClass; } } diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 27d207a1c4..247cc4179c 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -1,5 +1,6 @@ package io.cucumber.core.options; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.order.PickleOrder; import io.cucumber.core.order.StandardPickleOrders; @@ -40,6 +41,7 @@ public final class RuntimeOptions implements private final List formatters = new ArrayList<>(); private final List summaryPrinters = new ArrayList<>(); + private Class objectFactoryClass; private RuntimeOptions() { @@ -162,6 +164,11 @@ public SnippetType getSnippetType() { return snippetType; } + @Override + public Class getObjectFactoryClass() { + return objectFactoryClass; + } + public int getThreads() { return threads; } @@ -193,4 +200,8 @@ void setThreads(int threads) { void setWip(boolean wip) { this.wip = wip; } + + void setObjectFactoryClass(Class objectFactoryClass) { + this.objectFactoryClass = objectFactoryClass; + } } diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsBuilder.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsBuilder.java index 05b0b7634e..d5f152b4ca 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsBuilder.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsBuilder.java @@ -1,5 +1,6 @@ package io.cucumber.core.options; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.feature.FeatureWithLines; @@ -32,6 +33,7 @@ public final class RuntimeOptionsBuilder { private Boolean parsedWip = null; private PickleOrder parsedPickleOrder = null; private Integer parsedCount = null; + private Class parsedObjectFactoryClass = null; public RuntimeOptionsBuilder addFeature(FeatureWithLines featureWithLines) { parsedFeaturePaths.add(featureWithLines.uri()); @@ -130,6 +132,10 @@ public RuntimeOptions build(RuntimeOptions runtimeOptions) { this.parsedPluginData.updateFormatters(runtimeOptions.getFormatters()); this.parsedPluginData.updateSummaryPrinters(runtimeOptions.getSummaryPrinter()); + if (parsedObjectFactoryClass != null) { + runtimeOptions.setObjectFactoryClass(parsedObjectFactoryClass); + } + return runtimeOptions; } @@ -199,6 +205,10 @@ public RuntimeOptionsBuilder addDefaultFormatterIfNotPresent() { return this; } + public void setObjectFactoryClass(Class objectFactoryClass) { + this.parsedObjectFactoryClass = objectFactoryClass; + } + static final class ParsedPluginData { private ParsedPlugins formatters = new ParsedPlugins(); private ParsedPlugins summaryPrinters = new ParsedPlugins(); diff --git a/core/src/main/java/io/cucumber/core/runner/Options.java b/core/src/main/java/io/cucumber/core/runner/Options.java index a859229b77..83db587b25 100644 --- a/core/src/main/java/io/cucumber/core/runner/Options.java +++ b/core/src/main/java/io/cucumber/core/runner/Options.java @@ -1,5 +1,6 @@ package io.cucumber.core.runner; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.snippets.SnippetType; import java.net.URI; @@ -11,4 +12,6 @@ public interface Options { boolean isDryRun(); SnippetType getSnippetType(); + + Class getObjectFactoryClass(); } diff --git a/core/src/main/java/io/cucumber/core/runtime/ObjectFactoryLoader.java b/core/src/main/java/io/cucumber/core/runtime/ObjectFactoryLoader.java index d9147a81f0..c351188f2d 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ObjectFactoryLoader.java +++ b/core/src/main/java/io/cucumber/core/runtime/ObjectFactoryLoader.java @@ -25,27 +25,27 @@ private ObjectFactoryLoader() { * Otherwise a default object factory with no Dependency Injection capabilities * will be used. * - * @param objectFactoryClassName optional object factory to use + * @param objectFactoryClass optional object factory to use * @return an instance of {@link ObjectFactory} */ - static ObjectFactory loadObjectFactory(String objectFactoryClassName) { + static ObjectFactory loadObjectFactory(Class objectFactoryClass) { final ServiceLoader loader = ServiceLoader.load(ObjectFactory.class); - if (objectFactoryClassName == null) { + if (objectFactoryClass == null) { return loadSingleObjectFactoryOrDefault(loader); } - return loadSelectedObjectFactory(loader, objectFactoryClassName); + return loadSelectedObjectFactory(loader, objectFactoryClass); } - private static ObjectFactory loadSelectedObjectFactory(ServiceLoader loader, String objectFactoryClassName) { + private static ObjectFactory loadSelectedObjectFactory(ServiceLoader loader, Class objectFactoryClass) { for (ObjectFactory objectFactory : loader) { - if (objectFactoryClassName.equals(objectFactory.getClass().getName())) { + if (objectFactoryClass.equals(objectFactory.getClass())) { return objectFactory; } } - throw new CucumberException("Could not find object factory " + objectFactoryClassName); + throw new CucumberException("Could not find object factory " + objectFactoryClass); } private static ObjectFactory loadSingleObjectFactoryOrDefault(ServiceLoader loader) { diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 46ea84f20d..8ace57d5e5 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -195,8 +195,8 @@ public Runtime build() { final ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, this.classLoader); final ObjectFactorySupplier objectFactorySupplier = runtimeOptions.isMultiThreaded() - ? new ThreadLocalObjectFactorySupplier() - : new SingletonObjectFactorySupplier(); + ? new ThreadLocalObjectFactorySupplier(runtimeOptions) + : new SingletonObjectFactorySupplier(runtimeOptions); final BackendSupplier backendSupplier = this.backendSupplier != null ? this.backendSupplier diff --git a/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java index ccbb52100a..1e120d7300 100644 --- a/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java @@ -2,6 +2,7 @@ import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.options.CucumberProperties; +import io.cucumber.core.runner.Options; import java.util.Map; @@ -9,13 +10,17 @@ public class SingletonObjectFactorySupplier implements ObjectFactorySupplier { + private final Options options; private ObjectFactory objectFactory; + public SingletonObjectFactorySupplier(Options options) { + this.options = options; + } + @Override public ObjectFactory get() { if(objectFactory == null){ - Map properties = CucumberProperties.create(); - objectFactory = loadObjectFactory(properties.get(ObjectFactory.class.getName())); + objectFactory = loadObjectFactory(options.getObjectFactoryClass()); } return objectFactory; } diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java index 85e9ebd408..9293fca1c2 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java @@ -2,19 +2,24 @@ import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.options.CucumberProperties; +import io.cucumber.core.runner.Options; -import java.util.Map; +import java.util.function.Supplier; import static io.cucumber.core.runtime.ObjectFactoryLoader.loadObjectFactory; public class ThreadLocalObjectFactorySupplier implements ObjectFactorySupplier { - private final ThreadLocal runners = ThreadLocal.withInitial(() -> { - Map properties = CucumberProperties.create(); - return loadObjectFactory(properties.get(ObjectFactory.class.getName())); - } - ); + private final Options options; + private final ThreadLocal runners = ThreadLocal.withInitial(objectFactorySupplier()); + + private Supplier objectFactorySupplier() { + return () -> loadObjectFactory(options.getObjectFactoryClass()); + } + + public ThreadLocalObjectFactorySupplier(Options options) { + this.options = options; + } @Override public ObjectFactory get() { diff --git a/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java b/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java index 9c21a39bc0..ce94dd9c6f 100644 --- a/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java @@ -25,8 +25,7 @@ public void should_create_a_backend() { ClassLoader classLoader = getClass().getClassLoader(); RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); ResourceLoader resourceLoader = new MultiLoader(classLoader); - ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(runtimeOptions); BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); assertThat(backendSupplier.get().iterator().next(), is(notNullValue())); } @@ -36,8 +35,7 @@ public void should_throw_an_exception_when_no_backend_could_be_found() { ClassLoader classLoader = getClass().getClassLoader(); RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); ResourceLoader resourceLoader = new MultiLoader(classLoader); - ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); - ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(runtimeOptions); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); expectedException.expect(CucumberException.class); diff --git a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java index 92f4cd2ddc..52ecdec2b6 100644 --- a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java @@ -10,13 +10,13 @@ import org.junit.Before; import org.junit.Test; +import java.time.Clock; + import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThat; -import java.time.Clock; - public class SingletonRunnerSupplierTest { @@ -28,7 +28,7 @@ public void before() { ResourceLoader resourceLoader = new MultiLoader(classLoader); RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(runtimeOptions); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); EventBus eventBus = new TimeServiceEventBus(Clock.systemUTC()); TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 7ea0beb2b8..398b36d618 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -13,7 +13,6 @@ import io.cucumber.core.runner.Runner; import org.junit.Before; import org.junit.Test; -import org.mockito.Mockito; import java.time.Clock; @@ -38,7 +37,7 @@ public void before() { RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(runtimeOptions); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); eventBus = new TimeServiceEventBus(Clock.systemUTC()); TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); diff --git a/junit/src/main/java/io/cucumber/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java index 970dd8fbbb..04ef65405d 100644 --- a/junit/src/main/java/io/cucumber/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java @@ -138,7 +138,7 @@ public Cucumber(Class clazz) throws InitializationError { this.plugins = new Plugins(new PluginFactory(), runtimeOptions); this.bus = new TimeServiceEventBus(Clock.systemUTC()); - ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(); + ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(runtimeOptions); BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, objectFactorySupplier); TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier, typeRegistrySupplier); diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index 0d5912bb0f..9117f5c8db 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -150,7 +150,7 @@ private RunNotifier runFeatureWithNotifier(CucumberFeature cucumberFeature, JUni } private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, JUnitOptions junitOption) throws InitializationError { - ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(RuntimeOptions.defaultOptions()); final RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); final Clock clockStub = new Clock() { diff --git a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java index 9d1e847eb5..5d5ecbcf2a 100644 --- a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java @@ -86,7 +86,7 @@ public TestNGCucumberRunner(Class clazz) { this.bus = new TimeServiceEventBus(Clock.systemUTC()); this.plugins = new Plugins(new PluginFactory(), runtimeOptions); - ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(); + ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(runtimeOptions); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactorySupplier); this.filters = new Filters(runtimeOptions); TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); From 4d4d72a9d4b06baff5b81f6fbd3847fa2f9b9cbf Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 20 Jul 2019 12:08:17 +0200 Subject: [PATCH 121/155] [Core] Fix parsing of `cucumber.object-factory` property - Reads `cucumber.properties` from the resource root - Correctly checks if the provided class is assignable to ObjectFactory --- .../main/java/io/cucumber/core/cli/Main.java | 12 ++-- .../io/cucumber/core/options/Constants.java | 27 +++++++++ .../core/options/CucumberProperties.java | 14 +++-- .../options/CucumberPropertiesParser.java | 9 ++- .../options/CucumberPropertiesParserTest.java | 57 +++++++++++++++++++ .../cucumber/core/options/RerunFileTest.java | 3 +- .../core/options/RuntimeOptionsTest.java | 45 ++++++++------- .../java/io/cucumber/guice/package-info.java | 7 ++- .../main/java/io/cucumber/junit/Cucumber.java | 12 ++-- .../cucumber/testng/TestNGCucumberRunner.java | 26 +++++---- 10 files changed, 158 insertions(+), 54 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/options/Constants.java create mode 100644 core/src/test/java/io/cucumber/core/options/CucumberPropertiesParserTest.java diff --git a/core/src/main/java/io/cucumber/core/cli/Main.java b/core/src/main/java/io/cucumber/core/cli/Main.java index 454ecfef78..c03b3a9985 100644 --- a/core/src/main/java/io/cucumber/core/cli/Main.java +++ b/core/src/main/java/io/cucumber/core/cli/Main.java @@ -2,7 +2,11 @@ import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.options.*; +import io.cucumber.core.options.CommandlineOptionsParser; +import io.cucumber.core.options.Constants; +import io.cucumber.core.options.CucumberProperties; +import io.cucumber.core.options.CucumberPropertiesParser; +import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.Runtime; import org.apiguardian.api.API; @@ -12,9 +16,9 @@ * Options can be provided in order of precedence through: *
          *
        1. command line arguments
        2. - *
        3. {@code cucumber.options} property in {@link System#getProperties()} ()}
        4. - *
        5. {@code cucumber.options} property in {@link System#getenv()}
        6. - *
        7. {@code cucumber.options} property in {@code cucumber.properties}
        8. + *
        9. {@value Constants#CUCUMBER_OPTIONS_PROPERTY_NAME} property in {@link System#getProperties()}
        10. + *
        11. {@value Constants#CUCUMBER_OPTIONS_PROPERTY_NAME} property in {@link System#getenv()}
        12. + *
        13. {@value Constants#CUCUMBER_OPTIONS_PROPERTY_NAME} property in {@value Constants#CUCUMBER_PROPERTIES_FILE_NAME}
        14. *
        */ @API(status = API.Status.STABLE) diff --git a/core/src/main/java/io/cucumber/core/options/Constants.java b/core/src/main/java/io/cucumber/core/options/Constants.java new file mode 100644 index 0000000000..aaeb716e83 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/options/Constants.java @@ -0,0 +1,27 @@ +package io.cucumber.core.options; + +public final class Constants { + + /** + * File name of cucumber properties file: {@value} + */ + public static final String CUCUMBER_PROPERTIES_FILE_NAME = "cucumber.properties"; + + /** + * Property name used to pass command line options: {@value} + *

        + * When available it is recommended to use a property based alternative. + * + * @see RuntimeOptionsParser + */ + public static final String CUCUMBER_OPTIONS_PROPERTY_NAME = "cucumber.options"; + /** + * Property name used to select a specific object factory implementation: {@value} + */ + public static final String CUCUMBER_OBJECT_FACTORY_PROPERTY_NAME = "cucumber.object-factory"; + + + private Constants() { + + } +} diff --git a/core/src/main/java/io/cucumber/core/options/CucumberProperties.java b/core/src/main/java/io/cucumber/core/options/CucumberProperties.java index 0d502d8ac5..587539c15c 100644 --- a/core/src/main/java/io/cucumber/core/options/CucumberProperties.java +++ b/core/src/main/java/io/cucumber/core/options/CucumberProperties.java @@ -7,6 +7,8 @@ import java.io.InputStream; import java.util.*; +import static io.cucumber.core.options.Constants.CUCUMBER_PROPERTIES_FILE_NAME; + public final class CucumberProperties { private static final Logger log = LoggerFactory.getLogger(CucumberProperties.class); @@ -22,18 +24,18 @@ public static Map create() { } public static Map fromPropertiesFile() { - InputStream resourceAsStream = CucumberProperties.class.getResourceAsStream("cucumber.properties"); + InputStream resourceAsStream = CucumberProperties.class.getResourceAsStream("/" + CUCUMBER_PROPERTIES_FILE_NAME); if (resourceAsStream == null) { - log.debug("cucumber.properties file did not exist"); + log.debug(CUCUMBER_PROPERTIES_FILE_NAME + " file did not exist"); return Collections.emptyMap(); } try { - Properties properties1 = new Properties(); - properties1.load(resourceAsStream); - return CucumberPropertiesMap.create(properties1); + Properties properties = new Properties(); + properties.load(resourceAsStream); + return CucumberPropertiesMap.create(properties); } catch (IOException e) { - log.error("cucumber.properties could not be loaded", e); + log.error(CUCUMBER_PROPERTIES_FILE_NAME + " could not be loaded", e); throw new RuntimeException(e); } } diff --git a/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java b/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java index b126c2a58e..93aa7b928f 100644 --- a/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java +++ b/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java @@ -9,6 +9,9 @@ import java.util.List; import java.util.Map; +import static io.cucumber.core.options.Constants.CUCUMBER_OBJECT_FACTORY_PROPERTY_NAME; +import static io.cucumber.core.options.Constants.CUCUMBER_OPTIONS_PROPERTY_NAME; + public final class CucumberPropertiesParser { private final ResourceLoader resourceLoader; @@ -23,7 +26,7 @@ public CucumberPropertiesParser() { public RuntimeOptionsBuilder parse(Map properties) { final RuntimeOptionsBuilder builder; - String cucumberOptions = properties.get("cucumber.options"); + String cucumberOptions = properties.get(CUCUMBER_OPTIONS_PROPERTY_NAME); if (cucumberOptions != null) { RerunLoader rerunLoader = new RerunLoader(resourceLoader); RuntimeOptionsParser parser = new RuntimeOptionsParser(rerunLoader); @@ -33,7 +36,7 @@ public RuntimeOptionsBuilder parse(Map properties) { builder = new RuntimeOptionsBuilder(); } - String cucumberObjectFactory = properties.get("cucumber.object-factory"); + String cucumberObjectFactory = properties.get(CUCUMBER_OBJECT_FACTORY_PROPERTY_NAME); if (cucumberObjectFactory != null) { Class objectFactoryClass = parse(cucumberObjectFactory); builder.setObjectFactoryClass(objectFactoryClass); @@ -50,7 +53,7 @@ private Class parse(String cucumberObjectFactory) { } catch (ClassNotFoundException e) { throw new CucumberException("Could not load object factory class for " + cucumberObjectFactory, e); } - if (!objectFactoryClass.isAssignableFrom(ObjectFactory.class)) { + if (!ObjectFactory.class.isAssignableFrom(objectFactoryClass)) { throw new CucumberException("Object factory class " + objectFactoryClass + " was not a subclass of " + ObjectFactory.class); } return (Class) objectFactoryClass; diff --git a/core/src/test/java/io/cucumber/core/options/CucumberPropertiesParserTest.java b/core/src/test/java/io/cucumber/core/options/CucumberPropertiesParserTest.java new file mode 100644 index 0000000000..c016283a02 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/options/CucumberPropertiesParserTest.java @@ -0,0 +1,57 @@ +package io.cucumber.core.options; + +import io.cucumber.core.backend.ObjectFactory; +import org.junit.Test; + +import java.net.URI; +import java.util.HashMap; +import java.util.Map; + +import static java.util.Collections.singletonList; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +public class CucumberPropertiesParserTest { + + private final CucumberPropertiesParser cucumberPropertiesParser = new CucumberPropertiesParser(); + private final Map properties = new HashMap<>(); + + @Test + public void should_parse_cucumber_options(){ + properties.put(Constants.CUCUMBER_OPTIONS_PROPERTY_NAME, "--glue com.example"); + RuntimeOptions options = cucumberPropertiesParser.parse(properties).build(); + assertThat(options.getGlue(), equalTo(singletonList(URI.create("classpath:com/example")))); + } + + + @Test + public void should_parse_cucumber_object_factory(){ + properties.put(Constants.CUCUMBER_OBJECT_FACTORY_PROPERTY_NAME, CustomObjectFactory.class.getName()); + RuntimeOptions options = cucumberPropertiesParser.parse(properties).build(); + assertThat(options.getObjectFactoryClass(), equalTo(CustomObjectFactory.class)); + } + + private static final class CustomObjectFactory implements ObjectFactory { + + @Override + public boolean addClass(Class glueClass) { + return false; + } + + @Override + public T getInstance(Class glueClass) { + return null; + } + + @Override + public void start() { + + } + + @Override + public void stop() { + + } + } + +} \ No newline at end of file diff --git a/core/src/test/java/io/cucumber/core/options/RerunFileTest.java b/core/src/test/java/io/cucumber/core/options/RerunFileTest.java index 879183ba3f..175fe90630 100644 --- a/core/src/test/java/io/cucumber/core/options/RerunFileTest.java +++ b/core/src/test/java/io/cucumber/core/options/RerunFileTest.java @@ -11,6 +11,7 @@ import java.util.HashMap; import java.util.Map; +import static io.cucumber.core.options.Constants.CUCUMBER_OPTIONS_PROPERTY_NAME; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Collections.*; import static org.hamcrest.CoreMatchers.equalTo; @@ -180,7 +181,7 @@ public void clobbers_tag_and_name_filters_from_cli_if_rerun_file_specified_in_cu ); Map properties = new HashMap<>(); - properties.put("cucumber.options", "@file:path/rerun.txt"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "@file:path/rerun.txt"); RuntimeOptions options = new CommandlineOptionsParser(resourceLoader) .parse("--tags", "@should_be_clobbered", "--name", "should_be_clobbered") diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java index 7487e6be74..5f8af94739 100644 --- a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsTest.java @@ -31,6 +31,7 @@ import java.util.*; import java.util.regex.Pattern; +import static io.cucumber.core.options.Constants.CUCUMBER_OPTIONS_PROPERTY_NAME; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; import static java.util.Collections.singleton; @@ -280,7 +281,7 @@ public void name_with_spaces_is_preserved() { @Test public void ensure_name_with_spaces_works_with_cucumber_options() { - properties.put("cucumber.options", "--name 'some Name'"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--name 'some Name'"); RuntimeOptions options = new CucumberPropertiesParser() .parse(properties) .build(); @@ -295,7 +296,7 @@ public void ensure_name_with_spaces_works_with_args() { @Test public void overrides_options_with_system_properties_without_clobbering_non_overridden_ones() { - properties.put("cucumber.options", "--glue lookatme this_clobbers_feature_paths"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--glue lookatme this_clobbers_feature_paths"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--strict", "--glue", "somewhere", "somewhere_else") .build(); @@ -310,7 +311,7 @@ public void overrides_options_with_system_properties_without_clobbering_non_over @Test public void ensure_cli_glue_is_preserved_when_cucumber_options_property_defined() { - properties.put("cucumber.options", "--tags @foo"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--tags @foo"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(asList("--glue", "somewhere")) .build(); @@ -322,7 +323,7 @@ public void ensure_cli_glue_is_preserved_when_cucumber_options_property_defined( @Test public void clobbers_filters_from_cli_if_filters_specified_in_cucumber_options_property() { - properties.put("cucumber.options", "--tags @clobber_with_this"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--tags @clobber_with_this"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(asList("--tags", "@should_be_clobbered")) .build(); @@ -334,7 +335,7 @@ public void clobbers_filters_from_cli_if_filters_specified_in_cucumber_options_p @Test public void clobbers_tag_and_name_filters_from_cli_if_line_filters_specified_in_cucumber_options_property() { - properties.put("cucumber.options", "path/file.feature:3"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "path/file.feature:3"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--tags", "@should_be_clobbered", "--name", "should_be_clobbered") .build(); @@ -347,7 +348,7 @@ public void clobbers_tag_and_name_filters_from_cli_if_line_filters_specified_in_ @Test public void clobbers_tag_and_name_filters_from_cli_if_rerun_file_specified_in_cucumber_options_property() { - properties.put("cucumber.options", "@src/test/resources/io/cucumber/core/options/runtime-options-rerun.txt"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "@src/test/resources/io/cucumber/core/options/runtime-options-rerun.txt"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--tags", "@should_be_clobbered", "--name", "should_be_clobbered") .build(); @@ -362,7 +363,7 @@ public void clobbers_tag_and_name_filters_from_cli_if_rerun_file_specified_in_cu @Test public void preserves_filters_from_cli_if_filters_not_specified_in_cucumber_options_property() { - properties.put("cucumber.options", "--strict"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--strict"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(asList("--tags", "@keep_this")) .build(); @@ -374,7 +375,7 @@ public void preserves_filters_from_cli_if_filters_not_specified_in_cucumber_opti @Test public void clobbers_features_from_cli_if_features_specified_in_cucumber_options_property() { - properties.put("cucumber.options", "new newer"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "new newer"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(asList("old", "older")) .build(); @@ -386,7 +387,7 @@ public void clobbers_features_from_cli_if_features_specified_in_cucumber_options @Test public void strips_lines_from_features_from_cli_if_filters_are_specified_in_cucumber_options_property() { - properties.put("cucumber.options", "--tags @Tag"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--tags @Tag"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("path/file.feature:3") .build(); @@ -399,7 +400,7 @@ public void strips_lines_from_features_from_cli_if_filters_are_specified_in_cucu @Test public void strips_lines_from_rerun_file_from_cli_if_filters_are_specified_in_cucumber_options_property() throws IOException { - properties.put("cucumber.options", "--tags @Tag"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--tags @Tag"); String rerunPath = "file:path/rerun.txt"; String rerunFile = "file:path/file.feature:3\n"; mockFileResource(resourceLoader, rerunPath, rerunFile); @@ -411,7 +412,7 @@ public void strips_lines_from_rerun_file_from_cli_if_filters_are_specified_in_cu @Test public void preserves_features_from_cli_if_features_not_specified_in_cucumber_options_property() { - properties.put("cucumber.options", "--plugin pretty"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--plugin pretty"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(asList("old", "older")) .build(); @@ -424,7 +425,7 @@ public void preserves_features_from_cli_if_features_not_specified_in_cucumber_op @Test public void clobbers_line_filters_from_cli_if_features_specified_in_cucumber_options_property() { - properties.put("cucumber.options", "new newer"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "new newer"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(asList("--tags", "@keep_this", "path/file1.feature:1")) .build(); @@ -437,7 +438,7 @@ public void clobbers_line_filters_from_cli_if_features_specified_in_cucumber_opt @Test public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucumber_options_property() { - properties.put("cucumber.options", "--plugin pretty"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--plugin pretty"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--plugin", "html:target/some/dir", "--glue", "somewhere") @@ -456,7 +457,7 @@ public void clobbers_formatter_plugins_from_cli_if_formatters_specified_in_cucum @Test public void adds_to_formatter_plugins_with_add_plugin_option() { - properties.put("cucumber.options", "--add-plugin pretty"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--add-plugin pretty"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--plugin", "html:target/some/dir", "--glue", "somewhere") @@ -475,7 +476,7 @@ public void adds_to_formatter_plugins_with_add_plugin_option() { @Test public void clobbers_summary_plugins_from_cli_if_summary_printer_specified_in_cucumber_options_property() { - properties.put("cucumber.options", "--plugin default_summary"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--plugin default_summary"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--plugin", "null_summary", "--glue", "somewhere") .build(); @@ -492,7 +493,7 @@ public void clobbers_summary_plugins_from_cli_if_summary_printer_specified_in_cu @Test public void adds_to_summary_plugins_with_add_plugin_option() { - properties.put("cucumber.options", "--add-plugin default_summary"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--add-plugin default_summary"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--plugin", "null_summary", "--glue", "somewhere") .build(); @@ -509,7 +510,7 @@ public void adds_to_summary_plugins_with_add_plugin_option() { @Test public void does_not_clobber_plugins_of_different_type_when_specifying_plugins_in_cucumber_options_property() { - properties.put("cucumber.options", "--plugin default_summary"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--plugin default_summary"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--plugin", "pretty", "--glue", "somewhere") @@ -528,7 +529,7 @@ public void does_not_clobber_plugins_of_different_type_when_specifying_plugins_i @Test public void allows_removal_of_strict_in_cucumber_options_property() { - properties.put("cucumber.options", "--no-strict"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--no-strict"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse("--strict") .build(); @@ -609,7 +610,7 @@ public void ensure_default_snippet_type_is_underscore() { @Test public void set_snippet_type() { - properties.put("cucumber.options", "--snippets camelcase"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "--snippets camelcase"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(Collections.emptyList()) .build(); @@ -705,7 +706,7 @@ public void loads_features_specified_in_rerun_file() throws Exception { @Test public void loads_features_specified_in_rerun_file_with_empty_cucumber_options() throws Exception { - properties.put("cucumber.options", ""); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, ""); String rerunPath = "file:path/rerun.txt"; String rerunFile = "file:path/bar.feature:2\n"; mockFileResource(resourceLoader, rerunPath, rerunFile); @@ -719,7 +720,7 @@ public void loads_features_specified_in_rerun_file_with_empty_cucumber_options() @Test public void clobbers_features_from_rerun_file_specified_in_cli_if_features_specified_in_cucumber_options_property() throws Exception { - properties.put("cucumber.options", "file:path/foo.feature"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "file:path/foo.feature"); String rerunPath = "file:path/rerun.txt"; String rerunFile = "file:path/bar.feature:2\n"; mockFileResource(resourceLoader, rerunPath, rerunFile); @@ -752,7 +753,7 @@ public void loads_no_features_when_rerun_file_is_empty() throws Exception { @Test public void loads_no_features_when_rerun_file_specified_in_cucumber_options_property_is_empty() { - properties.put("cucumber.options", "@src/test/resources/io/cucumber/core/options/runtime-options-empty-rerun.txt"); + properties.put(CUCUMBER_OPTIONS_PROPERTY_NAME, "@src/test/resources/io/cucumber/core/options/runtime-options-empty-rerun.txt"); RuntimeOptions runtimeOptions = new CommandlineOptionsParser() .parse(singletonList("src/test/resources/cucumber/runtime/formatter")) .build(); diff --git a/guice/src/main/java/io/cucumber/guice/package-info.java b/guice/src/main/java/io/cucumber/guice/package-info.java index dd1fec21e8..6b218582d2 100644 --- a/guice/src/main/java/io/cucumber/guice/package-info.java +++ b/guice/src/main/java/io/cucumber/guice/package-info.java @@ -144,9 +144,10 @@ * *

        * Cucumber needs to know where to find the io.cucumber.guice.api.InjectorSource that it will use. - * You should create a properties file called cucumber.properties and place it in the root of the - * classpath. The file should contain a single property key called guice.injector-source with a value - * equal to the fully qualified name of the io.cucumber.guice.api.InjectorSource. For example: + * You should create a properties file called {@value io.cucumber.core.options.Constants#CUCUMBER_PROPERTIES_FILE_NAME} + * and place it in the root of the classpath. The file should contain a single property key called + * guice.injector-source with a value equal to the fully qualified name of the + * io.cucumber.guice.api.InjectorSource. For example: *

        *
          * guice.injector-source=com.company.YourInjectorSource
        diff --git a/junit/src/main/java/io/cucumber/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java
        index 04ef65405d..e7b6acf391 100644
        --- a/junit/src/main/java/io/cucumber/junit/Cucumber.java
        +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java
        @@ -3,7 +3,11 @@
         import io.cucumber.core.event.TestSourceRead;
         import io.cucumber.core.event.TestRunFinished;
         import io.cucumber.core.event.TestRunStarted;
        -import io.cucumber.core.options.*;
        +import io.cucumber.core.options.Constants;
        +import io.cucumber.core.options.CucumberOptionsAnnotationParser;
        +import io.cucumber.core.options.CucumberProperties;
        +import io.cucumber.core.options.CucumberPropertiesParser;
        +import io.cucumber.core.options.RuntimeOptions;
         import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier;
         import io.cucumber.core.runtime.ObjectFactorySupplier;
         import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier;
        @@ -57,10 +61,10 @@
          * 

        * Options can be provided in by (order of precedence): *

          - *
        1. Setting {@code cucumber.options} property in {@link System#getProperties()} ()}
        2. - *
        3. Setting {@code cucumber.options} property in {@link System#getenv()}
        4. + *
        5. Setting {@value Constants#CUCUMBER_OPTIONS_PROPERTY_NAME} property in {@link System#getProperties()} ()}
        6. + *
        7. Setting {@value Constants#CUCUMBER_OPTIONS_PROPERTY_NAME} property in {@link System#getenv()}
        8. *
        9. Annotating the runner class with {@link CucumberOptions}
        10. - *
        11. {Setting @code cucumber.options} property in {@code cucumber.properties}
        12. + *
        13. Setting {@value Constants#CUCUMBER_OPTIONS_PROPERTY_NAME} property in {@code cucumber.properties}
        14. *
        *

        * Cucumber also supports JUnits {@link ClassRule}, {@link BeforeClass} and {@link AfterClass} annotations. diff --git a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java index 5d5ecbcf2a..23b8bb0432 100644 --- a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java @@ -4,26 +4,30 @@ import io.cucumber.core.event.TestRunFinished; import io.cucumber.core.event.TestRunStarted; import io.cucumber.core.event.TestSourceRead; -import io.cucumber.core.options.*; -import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; -import io.cucumber.core.runtime.ObjectFactorySupplier; -import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.feature.CucumberFeature; +import io.cucumber.core.feature.FeatureLoader; import io.cucumber.core.filter.Filters; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.feature.CucumberFeature; -import io.cucumber.core.feature.FeatureLoader; +import io.cucumber.core.options.Constants; +import io.cucumber.core.options.CucumberOptionsAnnotationParser; +import io.cucumber.core.options.CucumberProperties; +import io.cucumber.core.options.CucumberPropertiesParser; +import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.plugin.Plugins; import io.cucumber.core.runner.Runner; -import io.cucumber.core.runtime.TimeServiceEventBus; import io.cucumber.core.runtime.BackendServiceLoader; +import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; import io.cucumber.core.runtime.FeaturePathFeatureSupplier; +import io.cucumber.core.runtime.ObjectFactorySupplier; +import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; +import io.cucumber.core.runtime.TimeServiceEventBus; import io.cucumber.core.runtime.TypeRegistrySupplier; import org.apiguardian.api.API; @@ -36,10 +40,10 @@ *

        * Options can be provided in order of precedence by: *

          - *
        1. Setting {@code cucumber.options} property in {@link System#getProperties()} ()}
        2. - *
        3. Setting {@code cucumber.options} property in {@link System#getenv()}
        4. + *
        5. Setting {@value Constants#CUCUMBER_OPTIONS_PROPERTY_NAME} property in {@link System#getProperties()} ()}
        6. + *
        7. Setting {@value Constants#CUCUMBER_OPTIONS_PROPERTY_NAME} property in {@link System#getenv()}
        8. *
        9. Annotating the runner class with {@link CucumberOptions}
        10. - *
        11. {Setting @code cucumber.options} property in {@code cucumber.properties}
        12. + *
        13. Setting {@value Constants#CUCUMBER_OPTIONS_PROPERTY_NAME} property in {@value Constants#CUCUMBER_PROPERTIES_FILE_NAME}
        14. *
        */ @API(status = API.Status.STABLE) @@ -115,7 +119,7 @@ public void finish() { */ public Object[][] provideScenarios() { try { - List scenarios = new ArrayList(); + List scenarios = new ArrayList<>(); List features = getFeatures(); for (CucumberFeature feature : features) { for (PickleEvent pickle : feature.getPickles()) { From 85209932560acd4bab1619ca827c9303586d9382 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 20 Jul 2019 12:08:17 +0200 Subject: [PATCH 122/155] [Core] Split loading ObjectFactory from provisioning ObjectFactories --- .../ObjectFactoryServiceLoader.java} | 30 +++++++++++-------- .../io/cucumber/core/backend/Options.java | 6 ++++ .../io/cucumber/core/options/Constants.java | 2 ++ .../cucumber/core/options/RuntimeOptions.java | 5 ++-- .../ConfiguringTypeRegistrySupplier.java | 2 +- .../io/cucumber/core/runtime/Runtime.java | 7 +++-- .../SingletonObjectFactorySupplier.java | 19 +++++------- .../ThreadLocalObjectFactorySupplier.java | 20 +++++-------- .../JavaObjectFactoryTest.java | 5 ++-- .../runtime/BackendServiceLoaderTest.java | 9 +++--- .../runtime/SingletonRunnerSupplierTest.java | 4 ++- .../ThreadLocalRunnerSupplierTest.java | 4 ++- .../main/java/io/cucumber/junit/Cucumber.java | 4 ++- .../io/cucumber/junit/FeatureRunnerTest.java | 4 ++- .../cucumber/testng/TestNGCucumberRunner.java | 4 ++- 15 files changed, 70 insertions(+), 55 deletions(-) rename core/src/main/java/io/cucumber/core/{runtime/ObjectFactoryLoader.java => backend/ObjectFactoryServiceLoader.java} (81%) create mode 100644 core/src/main/java/io/cucumber/core/backend/Options.java rename core/src/test/java/io/cucumber/core/{runtime => backend}/JavaObjectFactoryTest.java (82%) diff --git a/core/src/main/java/io/cucumber/core/runtime/ObjectFactoryLoader.java b/core/src/main/java/io/cucumber/core/backend/ObjectFactoryServiceLoader.java similarity index 81% rename from core/src/main/java/io/cucumber/core/runtime/ObjectFactoryLoader.java rename to core/src/main/java/io/cucumber/core/backend/ObjectFactoryServiceLoader.java index c351188f2d..aaa8259d75 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ObjectFactoryLoader.java +++ b/core/src/main/java/io/cucumber/core/backend/ObjectFactoryServiceLoader.java @@ -1,6 +1,5 @@ -package io.cucumber.core.runtime; +package io.cucumber.core.backend; -import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.exception.CucumberException; import java.lang.reflect.Constructor; @@ -9,26 +8,31 @@ import java.util.Map; import java.util.ServiceLoader; -class ObjectFactoryLoader { +import static java.util.Objects.requireNonNull; - private ObjectFactoryLoader() { +public final class ObjectFactoryServiceLoader { + + private final Options options; + + public ObjectFactoryServiceLoader(Options options) { + this.options = requireNonNull(options); } /** - * Loads an instance of {@link ObjectFactory} using the {@link ServiceLoader}. - * When objectFactoryClassName is provided that object factory - * will be used if present. + * Loads an instance of {@link ObjectFactory} using the {@link ServiceLoader} mechanism. *

        - * If objectFactoryClassName is not provided and there exactly one - * instance present that instance will be used. + * Will load an instance of the class provided by {@link Options#getObjectFactoryClass()}. *

        - * Otherwise a default object factory with no Dependency Injection capabilities - * will be used. + * If {@link Options#getObjectFactoryClass()} does not provide a class and there is exactly + * one {@code ObjectFactory} instance available that instance will be used. + *

        + * Otherwise a default object factory with no dependency injection capabilities will be used. * - * @param objectFactoryClass optional object factory to use * @return an instance of {@link ObjectFactory} */ - static ObjectFactory loadObjectFactory(Class objectFactoryClass) { + public ObjectFactory loadObjectFactory() { + Class objectFactoryClass = this.options.getObjectFactoryClass(); + final ServiceLoader loader = ServiceLoader.load(ObjectFactory.class); if (objectFactoryClass == null) { return loadSingleObjectFactoryOrDefault(loader); diff --git a/core/src/main/java/io/cucumber/core/backend/Options.java b/core/src/main/java/io/cucumber/core/backend/Options.java new file mode 100644 index 0000000000..159d60a833 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/Options.java @@ -0,0 +1,6 @@ +package io.cucumber.core.backend; + +public interface Options { + + Class getObjectFactoryClass(); +} diff --git a/core/src/main/java/io/cucumber/core/options/Constants.java b/core/src/main/java/io/cucumber/core/options/Constants.java index aaeb716e83..7928e99aae 100644 --- a/core/src/main/java/io/cucumber/core/options/Constants.java +++ b/core/src/main/java/io/cucumber/core/options/Constants.java @@ -17,6 +17,8 @@ public final class Constants { public static final String CUCUMBER_OPTIONS_PROPERTY_NAME = "cucumber.options"; /** * Property name used to select a specific object factory implementation: {@value} + * + * @see io.cucumber.core.backend.ObjectFactoryServiceLoader */ public static final String CUCUMBER_OBJECT_FACTORY_PROPERTY_NAME = "cucumber.object-factory"; diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java index 247cc4179c..04d131cb25 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptions.java @@ -1,9 +1,9 @@ package io.cucumber.core.options; import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.snippets.SnippetType; import io.cucumber.core.order.PickleOrder; import io.cucumber.core.order.StandardPickleOrders; +import io.cucumber.core.snippets.SnippetType; import java.net.URI; import java.util.ArrayList; @@ -22,7 +22,8 @@ public final class RuntimeOptions implements io.cucumber.core.feature.Options, io.cucumber.core.runner.Options, io.cucumber.core.plugin.Options, - io.cucumber.core.filter.Options { + io.cucumber.core.filter.Options, + io.cucumber.core.backend.Options { private final List glue = new ArrayList<>(); private final List tagExpressions = new ArrayList<>(); diff --git a/core/src/main/java/io/cucumber/core/runtime/ConfiguringTypeRegistrySupplier.java b/core/src/main/java/io/cucumber/core/runtime/ConfiguringTypeRegistrySupplier.java index db7339469f..ac96061be8 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ConfiguringTypeRegistrySupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ConfiguringTypeRegistrySupplier.java @@ -8,7 +8,7 @@ import java.util.Locale; -public class ConfiguringTypeRegistrySupplier implements TypeRegistrySupplier { +public final class ConfiguringTypeRegistrySupplier implements TypeRegistrySupplier { private final ClassFinder classFinder; private final Options options; diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 8ace57d5e5..984c4ee791 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -1,6 +1,7 @@ package io.cucumber.core.runtime; import gherkin.events.PickleEvent; +import io.cucumber.core.backend.ObjectFactoryServiceLoader; import io.cucumber.core.event.EventHandler; import io.cucumber.core.event.EventPublisher; import io.cucumber.core.event.Result; @@ -194,9 +195,11 @@ public Runtime build() { final ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, this.classLoader); + final ObjectFactoryServiceLoader objectFactoryServiceLoader = new ObjectFactoryServiceLoader(runtimeOptions); + final ObjectFactorySupplier objectFactorySupplier = runtimeOptions.isMultiThreaded() - ? new ThreadLocalObjectFactorySupplier(runtimeOptions) - : new SingletonObjectFactorySupplier(runtimeOptions); + ? new ThreadLocalObjectFactorySupplier(objectFactoryServiceLoader) + : new SingletonObjectFactorySupplier(objectFactoryServiceLoader); final BackendSupplier backendSupplier = this.backendSupplier != null ? this.backendSupplier diff --git a/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java index 1e120d7300..f970341e82 100644 --- a/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonObjectFactorySupplier.java @@ -1,26 +1,21 @@ package io.cucumber.core.runtime; import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.options.CucumberProperties; -import io.cucumber.core.runner.Options; +import io.cucumber.core.backend.ObjectFactoryServiceLoader; -import java.util.Map; +public final class SingletonObjectFactorySupplier implements ObjectFactorySupplier { -import static io.cucumber.core.runtime.ObjectFactoryLoader.loadObjectFactory; - -public class SingletonObjectFactorySupplier implements ObjectFactorySupplier { - - private final Options options; + private final ObjectFactoryServiceLoader objectFactoryServiceLoader; private ObjectFactory objectFactory; - public SingletonObjectFactorySupplier(Options options) { - this.options = options; + public SingletonObjectFactorySupplier(ObjectFactoryServiceLoader objectFactoryServiceLoader) { + this.objectFactoryServiceLoader = objectFactoryServiceLoader; } @Override public ObjectFactory get() { - if(objectFactory == null){ - objectFactory = loadObjectFactory(options.getObjectFactoryClass()); + if (objectFactory == null) { + objectFactory = objectFactoryServiceLoader.loadObjectFactory(); } return objectFactory; } diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java index 9293fca1c2..9ae6eff736 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalObjectFactorySupplier.java @@ -2,23 +2,17 @@ import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.runner.Options; +import io.cucumber.core.backend.ObjectFactoryServiceLoader; -import java.util.function.Supplier; +import static java.lang.ThreadLocal.withInitial; +import static java.util.Objects.requireNonNull; -import static io.cucumber.core.runtime.ObjectFactoryLoader.loadObjectFactory; +public final class ThreadLocalObjectFactorySupplier implements ObjectFactorySupplier { -public class ThreadLocalObjectFactorySupplier implements ObjectFactorySupplier { + private final ThreadLocal runners; - private final Options options; - private final ThreadLocal runners = ThreadLocal.withInitial(objectFactorySupplier()); - - private Supplier objectFactorySupplier() { - return () -> loadObjectFactory(options.getObjectFactoryClass()); - } - - public ThreadLocalObjectFactorySupplier(Options options) { - this.options = options; + public ThreadLocalObjectFactorySupplier(ObjectFactoryServiceLoader objectFactoryServiceLoader) { + this.runners = withInitial(requireNonNull(objectFactoryServiceLoader)::loadObjectFactory); } @Override diff --git a/core/src/test/java/io/cucumber/core/runtime/JavaObjectFactoryTest.java b/core/src/test/java/io/cucumber/core/backend/JavaObjectFactoryTest.java similarity index 82% rename from core/src/test/java/io/cucumber/core/runtime/JavaObjectFactoryTest.java rename to core/src/test/java/io/cucumber/core/backend/JavaObjectFactoryTest.java index 2ac3df1631..67be0c3a40 100644 --- a/core/src/test/java/io/cucumber/core/runtime/JavaObjectFactoryTest.java +++ b/core/src/test/java/io/cucumber/core/backend/JavaObjectFactoryTest.java @@ -1,7 +1,6 @@ -package io.cucumber.core.runtime; +package io.cucumber.core.backend; -import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.runtime.ObjectFactoryLoader.DefaultJavaObjectFactory; +import io.cucumber.core.backend.ObjectFactoryServiceLoader.DefaultJavaObjectFactory; import org.junit.Test; import static org.junit.Assert.assertNotNull; diff --git a/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java b/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java index ce94dd9c6f..80fecdd582 100644 --- a/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/BackendServiceLoaderTest.java @@ -1,10 +1,9 @@ package io.cucumber.core.runtime; +import io.cucumber.core.backend.ObjectFactoryServiceLoader; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.io.ResourceLoaderClassFinder; import io.cucumber.core.options.RuntimeOptions; import org.junit.Rule; import org.junit.Test; @@ -25,7 +24,8 @@ public void should_create_a_backend() { ClassLoader classLoader = getClass().getClassLoader(); RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); ResourceLoader resourceLoader = new MultiLoader(classLoader); - ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(runtimeOptions); + ObjectFactoryServiceLoader objectFactoryServiceLoader = new ObjectFactoryServiceLoader(runtimeOptions); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(objectFactoryServiceLoader); BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); assertThat(backendSupplier.get().iterator().next(), is(notNullValue())); } @@ -35,7 +35,8 @@ public void should_throw_an_exception_when_no_backend_could_be_found() { ClassLoader classLoader = getClass().getClassLoader(); RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); ResourceLoader resourceLoader = new MultiLoader(classLoader); - ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(runtimeOptions); + ObjectFactoryServiceLoader objectFactoryServiceLoader = new ObjectFactoryServiceLoader(runtimeOptions); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(objectFactoryServiceLoader); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); expectedException.expect(CucumberException.class); diff --git a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java index 52ecdec2b6..990ec3a6e0 100644 --- a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java @@ -1,6 +1,7 @@ package io.cucumber.core.runtime; +import io.cucumber.core.backend.ObjectFactoryServiceLoader; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; @@ -28,7 +29,8 @@ public void before() { ResourceLoader resourceLoader = new MultiLoader(classLoader); RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(runtimeOptions); + ObjectFactoryServiceLoader objectFactoryServiceLoader = new ObjectFactoryServiceLoader(runtimeOptions); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(objectFactoryServiceLoader); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); EventBus eventBus = new TimeServiceEventBus(Clock.systemUTC()); TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 398b36d618..6ddc73ea15 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -1,6 +1,7 @@ package io.cucumber.core.runtime; +import io.cucumber.core.backend.ObjectFactoryServiceLoader; import io.cucumber.core.event.EventHandler; import io.cucumber.core.event.TestCase; import io.cucumber.core.event.TestCaseStarted; @@ -37,7 +38,8 @@ public void before() { RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(runtimeOptions); + ObjectFactoryServiceLoader objectFactoryServiceLoader = new ObjectFactoryServiceLoader(runtimeOptions); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(objectFactoryServiceLoader); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); eventBus = new TimeServiceEventBus(Clock.systemUTC()); TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); diff --git a/junit/src/main/java/io/cucumber/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java index e7b6acf391..b8e64438f4 100644 --- a/junit/src/main/java/io/cucumber/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java @@ -1,5 +1,6 @@ package io.cucumber.junit; +import io.cucumber.core.backend.ObjectFactoryServiceLoader; import io.cucumber.core.event.TestSourceRead; import io.cucumber.core.event.TestRunFinished; import io.cucumber.core.event.TestRunStarted; @@ -142,7 +143,8 @@ public Cucumber(Class clazz) throws InitializationError { this.plugins = new Plugins(new PluginFactory(), runtimeOptions); this.bus = new TimeServiceEventBus(Clock.systemUTC()); - ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(runtimeOptions); + ObjectFactoryServiceLoader objectFactoryServiceLoader = new ObjectFactoryServiceLoader(runtimeOptions); + ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(objectFactoryServiceLoader); BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, objectFactorySupplier); TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier, typeRegistrySupplier); diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index 9117f5c8db..71d9d92317 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -1,5 +1,6 @@ package io.cucumber.junit; +import io.cucumber.core.backend.ObjectFactoryServiceLoader; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; @@ -150,7 +151,8 @@ private RunNotifier runFeatureWithNotifier(CucumberFeature cucumberFeature, JUni } private FeatureRunner createFeatureRunner(CucumberFeature cucumberFeature, JUnitOptions junitOption) throws InitializationError { - ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(RuntimeOptions.defaultOptions()); + ObjectFactoryServiceLoader objectFactoryServiceLoader = new ObjectFactoryServiceLoader(RuntimeOptions.defaultOptions()); + ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(objectFactoryServiceLoader); final RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); final Clock clockStub = new Clock() { diff --git a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java index 23b8bb0432..43092f2bdd 100644 --- a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java @@ -1,6 +1,7 @@ package io.cucumber.testng; import gherkin.events.PickleEvent; +import io.cucumber.core.backend.ObjectFactoryServiceLoader; import io.cucumber.core.event.TestRunFinished; import io.cucumber.core.event.TestRunStarted; import io.cucumber.core.event.TestSourceRead; @@ -90,7 +91,8 @@ public TestNGCucumberRunner(Class clazz) { this.bus = new TimeServiceEventBus(Clock.systemUTC()); this.plugins = new Plugins(new PluginFactory(), runtimeOptions); - ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(runtimeOptions); + ObjectFactoryServiceLoader objectFactoryServiceLoader = new ObjectFactoryServiceLoader(runtimeOptions); + ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(objectFactoryServiceLoader); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactorySupplier); this.filters = new Filters(runtimeOptions); TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); From f2eeac155f0893001bda9bf3a0161d151e2eff38 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 20 Jul 2019 20:50:40 +0200 Subject: [PATCH 123/155] [Core] Extract CoreStepDefinitions from Java and Java8 implementation Removes the `CucumberExpression` creation from the backend modules and will allow a type registry to be created for each pickle. --- .../java/io/cucumber/core/backend/Glue.java | 5 +- .../cucumber/core/backend/ParameterInfo.java | 12 ++ .../cucumber/core/backend/StepDefinition.java | 21 +-- .../cucumber/core/backend/TypeResolver.java | 22 +++ .../io/cucumber/core/runner/CachingGlue.java | 35 ++-- .../core/runner/CoreStepDefinition.java | 88 ++++++++++ .../FailedPickleStepInstantiationMatch.java | 5 +- .../core/runner/NoStepDefinition.java | 18 +- .../runner/PickleStepDefinitionMatch.java | 7 +- .../core/runner/PickleStepTestStep.java | 2 +- .../core/stepexpression/Argument.java | 3 - .../core/stepexpression/ArgumentMatcher.java | 2 - .../core/stepexpression/StepExpression.java | 2 - .../core/stepexpression/TypeRegistry.java | 2 - .../core/stepexpression/TypeResolver.java | 3 - .../cucumber/core/runner/CachingGlueTest.java | 137 ++++++--------- .../core/runner/CoreStepDefinitionTest.java | 158 ++++++++++++++++++ .../cucumber/core/runner/HookOrderTest.java | 13 +- .../io/cucumber/core/runner/RunnerTest.java | 70 ++++---- .../core/runner/StepDefinitionMatchTest.java | 48 +++--- .../core/runner/StubStepDefinition.java | 86 ++++++++++ .../io/cucumber/core/runner/TestHelper.java | 4 +- .../io/cucumber/core/runtime/RuntimeTest.java | 47 +++--- .../core/runtime/StubStepDefinition.java | 75 +++++---- .../java/io/cucumber/java/JavaBackend.java | 3 +- .../io/cucumber/java/JavaParameterInfo.java | 58 +++++++ .../io/cucumber/java/JavaStepDefinition.java | 102 ++--------- .../io/cucumber/java/JavaBackendTest.java | 6 +- .../java/JavaStepDefinitionTransposeTest.java | 122 +------------- java8/src/main/groovy/lambda.java.gsp | 16 +- .../java/io/cucumber/java8/Java8Backend.java | 4 +- .../io/cucumber/java8/Java8ParameterInfo.java | 35 ++++ .../cucumber/java8/Java8StepDefinition.java | 134 +++------------ .../io/cucumber/java8/LambdaGlueRegistry.java | 5 +- .../io/cucumber/java8/LambdaTypeResolver.java | 51 ++++++ .../java8/AnonInnerClassStepdefs.java | 29 ++-- ...Java8AnonInnerClassStepDefinitionTest.java | 16 +- ...efinitionMarksCorrectStackElementTest.java | 10 +- .../java8/Java8LambdaStepDefinitionTest.java | 69 +++----- .../testng/StubBackendProviderService.java | 33 ++-- 40 files changed, 840 insertions(+), 718 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/backend/ParameterInfo.java create mode 100644 core/src/main/java/io/cucumber/core/backend/TypeResolver.java create mode 100644 core/src/main/java/io/cucumber/core/runner/CoreStepDefinition.java create mode 100644 core/src/test/java/io/cucumber/core/runner/CoreStepDefinitionTest.java create mode 100644 core/src/test/java/io/cucumber/core/runner/StubStepDefinition.java create mode 100644 java/src/main/java/io/cucumber/java/JavaParameterInfo.java create mode 100644 java8/src/main/java/io/cucumber/java8/Java8ParameterInfo.java create mode 100644 java8/src/main/java/io/cucumber/java8/LambdaTypeResolver.java diff --git a/core/src/main/java/io/cucumber/core/backend/Glue.java b/core/src/main/java/io/cucumber/core/backend/Glue.java index 14f5889bbb..b47cafd635 100644 --- a/core/src/main/java/io/cucumber/core/backend/Glue.java +++ b/core/src/main/java/io/cucumber/core/backend/Glue.java @@ -1,14 +1,11 @@ package io.cucumber.core.backend; -import io.cucumber.core.stepexpression.TypeRegistry; import org.apiguardian.api.API; -import java.util.function.Function; - @API(status = API.Status.STABLE) public interface Glue { - void addStepDefinition(Function stepDefinition) throws DuplicateStepDefinitionException; + void addStepDefinition(StepDefinition stepDefinition) throws DuplicateStepDefinitionException; void addBeforeHook(HookDefinition hookDefinition); diff --git a/core/src/main/java/io/cucumber/core/backend/ParameterInfo.java b/core/src/main/java/io/cucumber/core/backend/ParameterInfo.java new file mode 100644 index 0000000000..99c734edf6 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/ParameterInfo.java @@ -0,0 +1,12 @@ +package io.cucumber.core.backend; + +import java.lang.reflect.Type; + +public interface ParameterInfo { + + Type getType(); + + boolean isTransposed(); + + TypeResolver getTypeResolver(); +} diff --git a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java index 0ee182fdab..bbeac8cba0 100644 --- a/core/src/main/java/io/cucumber/core/backend/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/StepDefinition.java @@ -1,27 +1,15 @@ package io.cucumber.core.backend; -import io.cucumber.core.stepexpression.Argument; -import gherkin.pickles.PickleStep; import org.apiguardian.api.API; import java.util.List; @API(status = API.Status.STABLE) public interface StepDefinition extends io.cucumber.core.event.StepDefinition { - /** - * Returns a list of arguments. Return null if the step definition - * doesn't match at all. Return an empty List if it matches with 0 arguments - * and bigger sizes if it matches several. - * - * @param step The step to match arguments for - * @return The arguments in a list when the step matches, null otherwise. - */ - List matchedArguments(PickleStep step); - /** * Invokes the step definition. The method should raise a Throwable * if the invocation fails, which will cause the step to fail. - * + * * @param args The arguments for the step * @throws Throwable in case of step failure. */ @@ -30,12 +18,13 @@ public interface StepDefinition extends io.cucumber.core.event.StepDefinition { /** * @param stackTraceElement The location of the step. * @return Return true if this matches the location. This is used to filter - * stack traces. + * stack traces. */ boolean isDefinedAt(StackTraceElement stackTraceElement); /** - * @return How many declared parameters this step definition has. Returns null if unknown. + * @return parameter information or null when the language does not provide parameter information */ - Integer getParameterCount(); + List parameterInfos(); + } diff --git a/core/src/main/java/io/cucumber/core/backend/TypeResolver.java b/core/src/main/java/io/cucumber/core/backend/TypeResolver.java new file mode 100644 index 0000000000..5e3199a6eb --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/TypeResolver.java @@ -0,0 +1,22 @@ +package io.cucumber.core.backend; + +import org.apiguardian.api.API; + +import java.lang.reflect.Type; + +/** + * Allows lazy resolution of the type of a data table or doc string. + */ +@API(status = API.Status.STABLE) +public interface TypeResolver { + + /** + * A type to data convert the table or doc string to. May not return null. + *

        + * When the {@link Object} type is returned no transform will be applied. + * + * @return a type + */ + Type resolve(); + +} diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index b6b26dd7c0..0ccdc284a0 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -1,13 +1,13 @@ package io.cucumber.core.runner; -import io.cucumber.core.event.StepDefinedEvent; +import gherkin.pickles.PickleStep; import io.cucumber.core.backend.DuplicateStepDefinitionException; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.event.StepDefinedEvent; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.stepexpression.Argument; -import gherkin.pickles.PickleStep; import io.cucumber.core.stepexpression.TypeRegistry; import java.util.ArrayList; @@ -16,13 +16,12 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; -import java.util.function.Function; final class CachingGlue implements Glue { private static final HookComparator ASCENDING = new HookComparator(true); private static final HookComparator DESCENDING = new HookComparator(false); - final Map stepDefinitionsByPattern = new TreeMap<>(); - final Map stepDefinitionsByStepText = new HashMap<>(); + final Map stepDefinitionsByPattern = new TreeMap<>(); + final Map stepDefinitionsByStepText = new HashMap<>(); final List beforeHooks = new ArrayList<>(); final List beforeStepHooks = new ArrayList<>(); final List afterHooks = new ArrayList<>(); @@ -37,13 +36,13 @@ final class CachingGlue implements Glue { } @Override - public void addStepDefinition(Function stepDefinitionFunction) { - StepDefinition stepDefinition = stepDefinitionFunction.apply(typeRegistry); - StepDefinition previous = stepDefinitionsByPattern.get(stepDefinition.getPattern()); + public void addStepDefinition(StepDefinition stepDefinition) { + CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stepDefinition, typeRegistry); + CoreStepDefinition previous = stepDefinitionsByPattern.get(coreStepDefinition.getPattern()); if (previous != null) { - throw new DuplicateStepDefinitionException(previous, stepDefinition); + throw new DuplicateStepDefinitionException(previous.getStepDefinition(), stepDefinition); } - stepDefinitionsByPattern.put(stepDefinition.getPattern(), stepDefinition); + stepDefinitionsByPattern.put(stepDefinition.getPattern(), coreStepDefinition); bus.send(new StepDefinedEvent(bus.getInstant(), stepDefinition)); } @@ -58,6 +57,7 @@ public void addBeforeStepHook(HookDefinition hookDefinition) { beforeStepHooks.add(hookDefinition); beforeStepHooks.sort(ASCENDING); } + @Override public void addAfterHook(HookDefinition hookDefinition) { afterHooks.add(hookDefinition); @@ -89,7 +89,7 @@ List getAfterStepHooks() { PickleStepDefinitionMatch stepDefinitionMatch(String featurePath, PickleStep step) { String stepText = step.getText(); - StepDefinition stepDefinition = stepDefinitionsByStepText.get(stepText); + CoreStepDefinition stepDefinition = stepDefinitionsByStepText.get(stepText); if (stepDefinition != null) { // Step definition arguments consists of parameters included in the step text and // gherkin step arguments (doc string and data table) which are not included in @@ -109,14 +109,14 @@ PickleStepDefinitionMatch stepDefinitionMatch(String featurePath, PickleStep ste PickleStepDefinitionMatch match = matches.get(0); - stepDefinitionsByStepText.put(stepText, match.getStepDefinition()); + stepDefinitionsByStepText.put(stepText, (CoreStepDefinition) match.getStepDefinition()); return match; } private List stepDefinitionMatches(String featurePath, PickleStep step) { List result = new ArrayList(); - for (StepDefinition stepDefinition : stepDefinitionsByPattern.values()) { + for (CoreStepDefinition stepDefinition : stepDefinitionsByPattern.values()) { List arguments = stepDefinition.matchedArguments(step); if (arguments != null) { result.add(new PickleStepDefinitionMatch(arguments, stepDefinition, featurePath, step)); @@ -146,10 +146,11 @@ private void removeScenarioScopedHooks(List beforeHooks) { } } - private void removeScenariosScopedStepDefinitions(Map stepDefinitions) { - Iterator> stepDefinitionIterator = stepDefinitions.entrySet().iterator(); - while(stepDefinitionIterator.hasNext()){ - StepDefinition stepDefinition = stepDefinitionIterator.next().getValue(); + private void removeScenariosScopedStepDefinitions(Map stepDefinitions) { + Iterator> stepDefinitionIterator = stepDefinitions.entrySet().iterator(); + while (stepDefinitionIterator.hasNext()) { + CoreStepDefinition coreStepDefinition = stepDefinitionIterator.next().getValue(); + StepDefinition stepDefinition = coreStepDefinition.getStepDefinition(); if (stepDefinition instanceof ScenarioScoped) { ScenarioScoped scenarioScopedStepDefinition = (ScenarioScoped) stepDefinition; scenarioScopedStepDefinition.disposeScenarioScope(); diff --git a/core/src/main/java/io/cucumber/core/runner/CoreStepDefinition.java b/core/src/main/java/io/cucumber/core/runner/CoreStepDefinition.java new file mode 100644 index 0000000000..ca5fc5bb93 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runner/CoreStepDefinition.java @@ -0,0 +1,88 @@ +package io.cucumber.core.runner; + +import gherkin.pickles.PickleStep; +import io.cucumber.core.backend.ParameterInfo; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.ArgumentMatcher; +import io.cucumber.core.stepexpression.StepExpression; +import io.cucumber.core.stepexpression.StepExpressionFactory; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.core.stepexpression.TypeResolver; + +import java.lang.reflect.Type; +import java.util.List; + +import static java.util.Objects.requireNonNull; + +class CoreStepDefinition implements StepDefinition { + + private final StepExpression expression; + private final ArgumentMatcher argumentMatcher; + private final StepDefinition stepDefinition; + private final Type[] types; + + CoreStepDefinition(StepDefinition stepDefinition, TypeRegistry typeRegistry) { + this.stepDefinition = requireNonNull(stepDefinition); + List parameterInfos = stepDefinition.parameterInfos(); + this.expression = createExpression(parameterInfos, stepDefinition.getPattern(), typeRegistry); + this.argumentMatcher = new ArgumentMatcher(this.expression); + this.types = getTypes(parameterInfos); + } + + private StepExpression createExpression(List parameterInfos, String expression, TypeRegistry typeRegistry) { + if (parameterInfos == null || parameterInfos.isEmpty()) { + return new StepExpressionFactory(typeRegistry).createExpression(expression); + } else { + ParameterInfo parameterInfo = parameterInfos.get(parameterInfos.size() - 1); + TypeResolver typeResolver = parameterInfo.getTypeResolver()::resolve; + boolean transposed = parameterInfo.isTransposed(); + return new StepExpressionFactory(typeRegistry).createExpression(expression, typeResolver, transposed); + } + } + + @Override + public void execute(Object[] args) throws Throwable { + stepDefinition.execute(args); + } + + @Override + public boolean isDefinedAt(StackTraceElement stackTraceElement) { + return stepDefinition.isDefinedAt(stackTraceElement); + } + + @Override + public List parameterInfos() { + return stepDefinition.parameterInfos(); + } + + @Override + public String getLocation(boolean detail) { + return stepDefinition.getLocation(detail); + } + + public String getPattern() { + return expression.getSource(); + } + + public StepDefinition getStepDefinition() { + return stepDefinition; + } + + List matchedArguments(PickleStep step) { + return argumentMatcher.argumentsFrom(step, types); + } + + private static Type[] getTypes(List parameterInfos) { + if (parameterInfos == null) { + return new Type[0]; + } + + Type[] types = new Type[parameterInfos.size()]; + for (int i = 0; i < types.length; i++) { + types[i] = parameterInfos.get(i).getType(); + } + return types; + } + +} diff --git a/core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java b/core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java index 4b0263367b..06d39572da 100644 --- a/core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/FailedPickleStepInstantiationMatch.java @@ -1,8 +1,7 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.Scenario; import gherkin.pickles.PickleStep; -import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.api.Scenario; import java.util.Collections; @@ -10,7 +9,7 @@ final class FailedPickleStepInstantiationMatch extends PickleStepDefinitionMatch private final Throwable throwable; FailedPickleStepInstantiationMatch(String uri, PickleStep step, Throwable throwable) { - super(Collections.emptyList(), new NoStepDefinition(), uri, step); + super(Collections.emptyList(), new NoStepDefinition(), uri, step); this.throwable = removeFrameworkFramesAndAppendStepLocation(throwable, getStepLocation()); } diff --git a/core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java b/core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java index 04ab50ca11..f085a076dc 100644 --- a/core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java +++ b/core/src/main/java/io/cucumber/core/runner/NoStepDefinition.java @@ -1,28 +1,17 @@ package io.cucumber.core.runner; +import io.cucumber.core.backend.ParameterInfo; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.stepexpression.Argument; -import gherkin.pickles.PickleStep; import java.util.List; final class NoStepDefinition implements StepDefinition { - @Override - public List matchedArguments(PickleStep step) { - return null; - } - @Override public String getLocation(boolean detail) { return null; } - @Override - public Integer getParameterCount() { - return 0; - } - @Override public void execute(Object[] args) { } @@ -32,6 +21,11 @@ public boolean isDefinedAt(StackTraceElement stackTraceElement) { return false; } + @Override + public List parameterInfos() { + return null; + } + @Override public String getPattern() { return null; diff --git a/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java b/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java index 991f0f3127..8a7a7a1da3 100644 --- a/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepDefinitionMatch.java @@ -1,6 +1,7 @@ package io.cucumber.core.runner; import io.cucumber.core.api.Scenario; +import io.cucumber.core.backend.ParameterInfo; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.exception.CucumberException; import gherkin.pickles.PickleStep; @@ -30,9 +31,9 @@ class PickleStepDefinitionMatch extends Match implements StepDefinitionMatch { public void runStep(Scenario scenario) throws Throwable { int argumentCount = getArguments().size(); - Integer parameterCount = stepDefinition.getParameterCount(); - if (parameterCount != null && argumentCount != parameterCount) { - throw arityMismatch(parameterCount); + List parameterInfos = stepDefinition.parameterInfos(); + if (parameterInfos != null && argumentCount != parameterInfos.size()) { + throw arityMismatch(parameterInfos.size()); } List result = new ArrayList<>(); try { diff --git a/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java index 84b95e8106..dc5e9bb357 100644 --- a/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java +++ b/core/src/main/java/io/cucumber/core/runner/PickleStepTestStep.java @@ -65,7 +65,7 @@ public PickleStep getPickleStep() { @Override public String getStepLocation() { - return uri + ":" + Integer.toString(getStepLine()); + return uri + ":" + getStepLine(); } @Override diff --git a/core/src/main/java/io/cucumber/core/stepexpression/Argument.java b/core/src/main/java/io/cucumber/core/stepexpression/Argument.java index cde30ddcc2..745df56f01 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/Argument.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/Argument.java @@ -1,8 +1,5 @@ package io.cucumber.core.stepexpression; -import org.apiguardian.api.API; - -@API(status = API.Status.STABLE) public interface Argument { Object getValue(); diff --git a/core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java b/core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java index acd905ccc7..bd67411c52 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/ArgumentMatcher.java @@ -3,12 +3,10 @@ import gherkin.pickles.PickleStep; import gherkin.pickles.PickleString; import gherkin.pickles.PickleTable; -import org.apiguardian.api.API; import java.lang.reflect.Type; import java.util.List; -@API(status = API.Status.STABLE) public final class ArgumentMatcher { private final StepExpression expression; diff --git a/core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java b/core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java index 676e6f90bd..f49a45c37e 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/StepExpression.java @@ -1,13 +1,11 @@ package io.cucumber.core.stepexpression; import io.cucumber.cucumberexpressions.Expression; -import org.apiguardian.api.API; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; -@API(status = API.Status.STABLE) public final class StepExpression { private final Expression expression; diff --git a/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java b/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java index ce51905696..4055fdc888 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/TypeRegistry.java @@ -7,11 +7,9 @@ import io.cucumber.datatable.DataTableTypeRegistry; import io.cucumber.datatable.TableCellByTypeTransformer; import io.cucumber.datatable.TableEntryByTypeTransformer; -import org.apiguardian.api.API; import java.util.Locale; -@API(status = API.Status.STABLE) public final class TypeRegistry implements io.cucumber.core.api.TypeRegistry { private final ParameterTypeRegistry parameterTypeRegistry; diff --git a/core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java b/core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java index 2240262a27..0ae6777cb7 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/TypeResolver.java @@ -1,13 +1,10 @@ package io.cucumber.core.stepexpression; -import org.apiguardian.api.API; - import java.lang.reflect.Type; /** * Allows lazy resolution of the type of a data table or doc string. */ -@API(status = API.Status.STABLE) public interface TypeResolver { /** diff --git a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index c94777fafa..dcd9fbed84 100644 --- a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -11,11 +11,9 @@ import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.DuplicateStepDefinitionException; import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.ParameterInfo; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.runtime.TimeServiceEventBus; -import io.cucumber.core.stepexpression.ArgumentMatcher; -import io.cucumber.core.stepexpression.StepExpression; -import io.cucumber.core.stepexpression.StepExpressionFactory; import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.datatable.DataTable; import org.junit.Test; @@ -31,11 +29,8 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class CachingGlueTest { @@ -48,13 +43,13 @@ public void throws_duplicate_error_on_dupe_stepdefs() { StepDefinition a = mock(StepDefinition.class); when(a.getPattern()).thenReturn("hello"); when(a.getLocation(true)).thenReturn("foo.bf:10"); - glue.addStepDefinition(typeRegistry -> a); + glue.addStepDefinition(a); StepDefinition b = mock(StepDefinition.class); when(b.getPattern()).thenReturn("hello"); when(b.getLocation(true)).thenReturn("bar.bf:90"); try { - glue.addStepDefinition(typeRegistry -> b); + glue.addStepDefinition(b); fail("should have failed"); } catch (DuplicateStepDefinitionException expected) { assertEquals("Duplicate step definitions in foo.bf:10 and bar.bf:90", expected.getMessage()); @@ -69,7 +64,7 @@ public void removes_glue_that_is_scenario_scoped() { StepDefinition sd = spy(new MockedScenarioScopedStepDefinition()); when(sd.getPattern()).thenReturn("pattern"); - glue.addStepDefinition(typeRegistry -> sd); + glue.addStepDefinition(sd); HookDefinition bh = spy(new MockedScenarioScopedHookDefinition()); glue.addBeforeHook(bh); @@ -91,12 +86,14 @@ public void removes_glue_that_is_scenario_scoped() { @Test public void removes_scenario_scoped_cache_entries() { StepDefinition sd = new MockedScenarioScopedStepDefinition("pattern"); - glue.addStepDefinition(typeRegistry -> sd); + glue.addStepDefinition(sd); String featurePath = "someFeature.feature"; String stepText = "pattern"; PickleStep pickleStep1 = getPickleStep(stepText); - assertEquals(sd, glue.stepDefinitionMatch(featurePath, pickleStep1).getStepDefinition()); + PickleStepDefinitionMatch pickleStepDefinitionMatch = glue.stepDefinitionMatch(featurePath, pickleStep1); + CoreStepDefinition coreStepDefinition = (CoreStepDefinition) pickleStepDefinitionMatch.getStepDefinition(); + assertEquals(sd, coreStepDefinition.getStepDefinition()); assertEquals(1, glue.stepDefinitionsByStepText.size()); @@ -108,101 +105,88 @@ public void removes_scenario_scoped_cache_entries() { @Test public void returns_null_if_no_matching_steps_found() { StepDefinition stepDefinition = spy(new MockedStepDefinition("pattern1")); - glue.addStepDefinition(typeRegistry -> stepDefinition); + glue.addStepDefinition(stepDefinition); String featurePath = "someFeature.feature"; PickleStep pickleStep = getPickleStep("pattern"); assertNull(glue.stepDefinitionMatch(featurePath, pickleStep)); - verify(stepDefinition).matchedArguments(pickleStep); } @Test public void returns_match_from_cache_if_single_found() { StepDefinition stepDefinition1 = spy(new MockedStepDefinition("^pattern1")); StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); - glue.addStepDefinition(typeRegistry -> stepDefinition1); - glue.addStepDefinition(typeRegistry -> stepDefinition2); + glue.addStepDefinition(stepDefinition1); + glue.addStepDefinition(stepDefinition2); String featurePath = "someFeature.feature"; String stepText = "pattern1"; PickleStep pickleStep1 = getPickleStep(stepText); - assertEquals(stepDefinition1, glue.stepDefinitionMatch(featurePath, pickleStep1).getStepDefinition()); - //verify if all defs are checked - verify(stepDefinition1).matchedArguments(pickleStep1); - verify(stepDefinition2).matchedArguments(pickleStep1); + + PickleStepDefinitionMatch pickleStepDefinitionMatch = glue.stepDefinitionMatch(featurePath, pickleStep1); + CoreStepDefinition coreStepDefinition = (CoreStepDefinition) pickleStepDefinitionMatch.getStepDefinition(); + assertEquals(stepDefinition1, coreStepDefinition.getStepDefinition()); + //check cache - StepDefinition entry = glue.stepDefinitionsByStepText.get(stepText); - assertEquals(stepDefinition1,entry); + CoreStepDefinition entry = glue.stepDefinitionsByStepText.get(stepText); + assertEquals(stepDefinition1, entry.getStepDefinition()); PickleStep pickleStep2 = getPickleStep(stepText); - assertEquals(stepDefinition1, glue.stepDefinitionMatch(featurePath, pickleStep2).getStepDefinition()); - //verify that only cached step definition has called matchedArguments again - verify(stepDefinition1,times(2)).matchedArguments(any(PickleStep.class)); - verify(stepDefinition2).matchedArguments(any(PickleStep.class)); - + PickleStepDefinitionMatch pickleStepDefinitionMatch2 = glue.stepDefinitionMatch(featurePath, pickleStep2); + CoreStepDefinition coreStepDefinition2 = (CoreStepDefinition) pickleStepDefinitionMatch2.getStepDefinition(); + assertEquals(stepDefinition1, coreStepDefinition2.getStepDefinition()); } @Test public void returns_match_from_cache_for_step_with_table() { StepDefinition stepDefinition1 = spy(new MockedStepDefinition("^pattern1")); StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); - glue.addStepDefinition(typeRegistry -> stepDefinition1); - glue.addStepDefinition(typeRegistry -> stepDefinition2); + glue.addStepDefinition(stepDefinition1); + glue.addStepDefinition(stepDefinition2); String featurePath = "someFeature.feature"; String stepText = "pattern1"; PickleStep pickleStep1 = getPickleStepWithSingleCellTable(stepText, "cell 1"); - PickleStepDefinitionMatch match1 = glue.stepDefinitionMatch(featurePath, pickleStep1); + CoreStepDefinition coreStepDefinition = (CoreStepDefinition) match1.getStepDefinition(); - assertEquals(stepDefinition1, match1.getStepDefinition()); - //verify if all defs are checked - verify(stepDefinition1).matchedArguments(pickleStep1); - verify(stepDefinition2).matchedArguments(pickleStep1); + assertEquals(stepDefinition1, coreStepDefinition.getStepDefinition()); //check cache - StepDefinition entry = glue.stepDefinitionsByStepText.get(stepText); - assertEquals(stepDefinition1,entry); + CoreStepDefinition entry = glue.stepDefinitionsByStepText.get(stepText); + assertEquals(stepDefinition1, entry.getStepDefinition()); //check arguments - assertEquals("cell 1", ((DataTable) match1.getArguments().get(0).getValue()).cell(0,0)); + assertEquals("cell 1", ((DataTable) match1.getArguments().get(0).getValue()).cell(0, 0)); //check second match PickleStep pickleStep2 = getPickleStepWithSingleCellTable(stepText, "cell 2"); PickleStepDefinitionMatch match2 = glue.stepDefinitionMatch(featurePath, pickleStep2); - //verify that only cached step definition has called matchedArguments again - verify(stepDefinition1,times(2)).matchedArguments(any(PickleStep.class)); - verify(stepDefinition2).matchedArguments(any(PickleStep.class)); - //check arguments - assertEquals("cell 2",((DataTable) match2.getArguments().get(0).getValue()).cell(0,0)); - - + assertEquals("cell 2", ((DataTable) match2.getArguments().get(0).getValue()).cell(0, 0)); } @Test public void returns_match_from_cache_for_ste_with_doc_string() { StepDefinition stepDefinition1 = spy(new MockedStepDefinition("^pattern1")); StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); - glue.addStepDefinition(typeRegistry -> stepDefinition1); - glue.addStepDefinition(typeRegistry -> stepDefinition2); + glue.addStepDefinition(stepDefinition1); + glue.addStepDefinition(stepDefinition2); String featurePath = "someFeature.feature"; String stepText = "pattern1"; PickleStep pickleStep1 = getPickleStepWithDocString(stepText, "doc string 1"); PickleStepDefinitionMatch match1 = glue.stepDefinitionMatch(featurePath, pickleStep1); + CoreStepDefinition coreStepDefinition = (CoreStepDefinition) match1.getStepDefinition(); - assertEquals(stepDefinition1, match1.getStepDefinition()); - //verify if all defs are checked - verify(stepDefinition1).matchedArguments(pickleStep1); - verify(stepDefinition2).matchedArguments(pickleStep1); + assertEquals(stepDefinition1, coreStepDefinition.getStepDefinition()); //check cache - StepDefinition entry = glue.stepDefinitionsByStepText.get(stepText); - assertEquals(stepDefinition1,entry); + CoreStepDefinition entry = glue.stepDefinitionsByStepText.get(stepText); + assertEquals(stepDefinition1, entry.getStepDefinition()); //check arguments assertEquals("doc string 1", match1.getArguments().get(0).getValue()); @@ -210,13 +194,8 @@ public void returns_match_from_cache_for_ste_with_doc_string() { //check second match PickleStep pickleStep2 = getPickleStepWithDocString(stepText, "doc string 2"); PickleStepDefinitionMatch match2 = glue.stepDefinitionMatch(featurePath, pickleStep2); - - //verify that only cached step definition has called matchedArguments again - verify(stepDefinition1,times(2)).matchedArguments(any(PickleStep.class)); - verify(stepDefinition2).matchedArguments(any(PickleStep.class)); - //check arguments - assertEquals("doc string 2",match2.getArguments().get(0).getValue()); + assertEquals("doc string 2", match2.getArguments().get(0).getValue()); } @@ -227,7 +206,7 @@ private static PickleStep getPickleStepWithSingleCellTable(String stepText, Stri } private static PickleStep getPickleStepWithDocString(String stepText, String doc) { - return new PickleStep(stepText, Collections.singletonList(new PickleString(mock(PickleLocation.class),doc)), Collections.emptyList()); + return new PickleStep(stepText, Collections.singletonList(new PickleString(mock(PickleLocation.class), doc)), Collections.emptyList()); } @Test @@ -235,9 +214,9 @@ public void throws_ambiguous_steps_def_exception_when_many_patterns_match() { StepDefinition stepDefinition1 = new MockedStepDefinition("pattern1"); StepDefinition stepDefinition2 = new MockedStepDefinition("^pattern2"); StepDefinition stepDefinition3 = new MockedStepDefinition("^pattern[1,3]"); - glue.addStepDefinition(typeRegistry -> stepDefinition1); - glue.addStepDefinition(typeRegistry -> stepDefinition2); - glue.addStepDefinition(typeRegistry -> stepDefinition3); + glue.addStepDefinition(stepDefinition1); + glue.addStepDefinition(stepDefinition2); + glue.addStepDefinition(stepDefinition3); String featurePath = "someFeature.feature"; checkAmbiguousCalled(featurePath); @@ -251,7 +230,7 @@ private void checkAmbiguousCalled(String featurePath) { glue.stepDefinitionMatch(featurePath, getPickleStep("pattern1")); } catch (AmbiguousStepDefinitionsException e) { - assertEquals(2,e.getMatches().size()); + assertEquals(2, e.getMatches().size()); ambiguousCalled = true; } assertTrue(ambiguousCalled); @@ -273,13 +252,6 @@ private static class MockedScenarioScopedStepDefinition implements StepDefinitio this("mocked scenario scoped step definition"); } - @Override - public List matchedArguments(PickleStep step) { - StepExpression expression = new StepExpressionFactory(new TypeRegistry(ENGLISH)).createExpression(pattern); - final ArgumentMatcher argumentMatcher = new ArgumentMatcher(expression); - return argumentMatcher.argumentsFrom(step); - } - boolean disposed; @Override @@ -292,11 +264,6 @@ public String getLocation(boolean detail) { return "mocked scenario scoped step definition"; } - @Override - public Integer getParameterCount() { - return 0; - } - @Override public void execute(Object[] args) { @@ -307,6 +274,11 @@ public boolean isDefinedAt(StackTraceElement stackTraceElement) { return false; } + @Override + public List parameterInfos() { + return null; + } + @Override public String getPattern() { return pattern; @@ -352,23 +324,11 @@ private static class MockedStepDefinition implements StepDefinition { this.pattern = pattern; } - @Override - public List matchedArguments(PickleStep step) { - StepExpression expression = new StepExpressionFactory(new TypeRegistry(ENGLISH)).createExpression(pattern); - final ArgumentMatcher argumentMatcher = new ArgumentMatcher(expression); - return argumentMatcher.argumentsFrom(step); - } - @Override public String getLocation(boolean detail) { return "mocked step location"; } - @Override - public Integer getParameterCount() { - return 0; - } - @Override public void execute(Object[] args) { @@ -379,6 +339,11 @@ public boolean isDefinedAt(StackTraceElement stackTraceElement) { return false; } + @Override + public List parameterInfos() { + return null; + } + @Override public String getPattern() { return pattern; diff --git a/core/src/test/java/io/cucumber/core/runner/CoreStepDefinitionTest.java b/core/src/test/java/io/cucumber/core/runner/CoreStepDefinitionTest.java new file mode 100644 index 0000000000..1d846bebe3 --- /dev/null +++ b/core/src/test/java/io/cucumber/core/runner/CoreStepDefinitionTest.java @@ -0,0 +1,158 @@ +package io.cucumber.core.runner; + +import gherkin.pickles.PickleCell; +import gherkin.pickles.PickleLocation; +import gherkin.pickles.PickleRow; +import gherkin.pickles.PickleStep; +import gherkin.pickles.PickleString; +import gherkin.pickles.PickleTable; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.datatable.DataTable; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; +import static org.hamcrest.collection.IsMapContaining.hasEntry; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; + +public class CoreStepDefinitionTest { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + private final TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); + + @Test + public void should_apply_identity_transform_to_doc_string_when_target_type_is_object() { + StubStepDefinition stub = new StubStepDefinition("I have some step", Object.class); + CoreStepDefinition stepDefinition = new CoreStepDefinition(stub, typeRegistry); + + PickleString pickleString = new PickleString(null, "content", "text"); + List arguments = stepDefinition.matchedArguments(new PickleStep("I have some step", singletonList(pickleString), emptyList())); + assertEquals("content", arguments.get(0).getValue()); + } + + @Test + public void should_apply_identity_transform_to_data_table_when_target_type_is_object() { + StubStepDefinition stub = new StubStepDefinition("I have some step", Object.class); + CoreStepDefinition stepDefinition = new CoreStepDefinition(stub, typeRegistry); + + PickleTable table = new PickleTable(singletonList(new PickleRow(singletonList(new PickleCell(null, "content"))))); + List arguments = stepDefinition.matchedArguments(new PickleStep("I have some step", singletonList(table), emptyList())); + assertEquals(DataTable.create(singletonList(singletonList("content"))), arguments.get(0).getValue()); + } + + + public static class StepDefs { + public void listOfListOfDoubles(List> listOfListOfDoubles) { + } + + public void plainDataTable(DataTable dataTable) { + } + + public void mapOfDoubleToDouble(Map mapOfDoubleToDouble) { + } + + public void transposedMapOfDoubleToListOfDouble(Map> mapOfDoubleToListOfDouble) { + } + + } + + @Test + public void transforms_to_map_of_double_to_double() throws Throwable { + Method m = StepDefs.class.getMethod("mapOfDoubleToDouble", Map.class); + Map stepDefs = runStepDef(m, false, new PickleTable(listOfDoublesWithoutHeader())); + + assertThat(stepDefs, hasEntry(1000.0, 999.0)); + assertThat(stepDefs, hasEntry(0.5, -0.5)); + assertThat(stepDefs, hasEntry(100.5, 99.5)); + } + + @Test + public void transforms_transposed_to_map_of_double_to_double() throws Throwable { + Method m = StepDefs.class.getMethod("transposedMapOfDoubleToListOfDouble", Map.class); + Map> stepDefs = runStepDef(m, true, new PickleTable(listOfDoublesWithoutHeader())); + assertThat(stepDefs, hasEntry(100.5, asList(0.5, 1000.0))); + } + + @Test + public void transforms_to_list_of_single_values() throws Throwable { + Method m = StepDefs.class.getMethod("listOfListOfDoubles", List.class); + List> stepDefs = runStepDef(m, false, new PickleTable(listOfDoublesWithoutHeader())); + assertEquals("[[100.5, 99.5], [0.5, -0.5], [1000.0, 999.0]]", stepDefs.toString()); + } + + @Test + public void transforms_to_list_of_single_values_transposed() throws Throwable { + Method m = StepDefs.class.getMethod("listOfListOfDoubles", List.class); + List> stepDefs = runStepDef(m, true, new PickleTable(transposedListOfDoublesWithoutHeader())); + assertEquals("[[100.5, 99.5], [0.5, -0.5], [1000.0, 999.0]]", stepDefs.toString()); + } + + @Test + public void passes_plain_data_table() throws Throwable { + Method m = StepDefs.class.getMethod("plainDataTable", DataTable.class); + DataTable stepDefs = runStepDef(m, false, new PickleTable(listOfDatesWithHeader())); + assertEquals("Birth Date", stepDefs.cell(0, 0)); + assertEquals("1957-05-10", stepDefs.cell(1, 0)); + } + + @Test + public void passes_transposed_data_table() throws Throwable { + Method m = StepDefs.class.getMethod("plainDataTable", DataTable.class); + DataTable stepDefs = runStepDef(m, true, new PickleTable(listOfDatesWithHeader())); + assertEquals("Birth Date", stepDefs.cell(0, 0)); + assertEquals("1957-05-10", stepDefs.cell(0, 1)); + } + + private T runStepDef(Method method, boolean transposed, PickleTable table) throws Throwable { + StubStepDefinition stub = new StubStepDefinition("some text", transposed, method.getGenericParameterTypes()); + CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stub, typeRegistry); + + PickleStep stepWithTable = new PickleStep("some text", asList((gherkin.pickles.Argument) table), asList(mock(PickleLocation.class))); + List arguments = coreStepDefinition.matchedArguments(stepWithTable); + + List result = new ArrayList<>(); + for (Argument argument : arguments) { + result.add(argument.getValue()); + } + coreStepDefinition.execute(result.toArray(new Object[0])); + + return (T) stub.getArgs().get(0); + } + + private List listOfDatesWithHeader() { + List rows = new ArrayList<>(); + rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "Birth Date")))); + rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "1957-05-10")))); + return rows; + } + + private List listOfDoublesWithoutHeader() { + List rows = new ArrayList<>(); + rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "100.5"), new PickleCell(mock(PickleLocation.class), "99.5")))); + rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "0.5"), new PickleCell(mock(PickleLocation.class), "-0.5")))); + rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "1000"), new PickleCell(mock(PickleLocation.class), "999")))); + return rows; + } + + private List transposedListOfDoublesWithoutHeader() { + List rows = new ArrayList<>(); + rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "100.5"), new PickleCell(mock(PickleLocation.class), "0.5"), new PickleCell(mock(PickleLocation.class), "1000")))); + rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "99.5"), new PickleCell(mock(PickleLocation.class), "-0.5"), new PickleCell(mock(PickleLocation.class), "999")))); + return rows; + } + +} \ No newline at end of file diff --git a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java index 08053a352b..3b75640470 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java @@ -28,7 +28,6 @@ import static java.util.Collections.singletonList; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class HookOrderTest { @@ -38,7 +37,7 @@ public class HookOrderTest { private final EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); private final TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); - private final StubStepDefinition stepDefinition = new StubStepDefinition("pattern1", new TypeRegistry(Locale.ENGLISH)); + private final StubStepDefinition stepDefinition = new StubStepDefinition("pattern1"); private final PickleStep pickleStep = new PickleStep("pattern1", Collections.emptyList(), singletonList(new PickleLocation(2,2))); private final PickleEvent pickleEvent = new PickleEvent("uri", new Pickle("scenario1", ENGLISH, singletonList(pickleStep), Collections.emptyList(), singletonList(new PickleLocation(1,1)))); @@ -50,7 +49,7 @@ public void before_hooks_execute_in_order() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(typeRegistry -> new StubStepDefinition("pattern1", typeRegistry)); + glue.addStepDefinition(new StubStepDefinition("pattern1")); for (HookDefinition hook : hooks) { glue.addBeforeHook(hook); } @@ -77,7 +76,7 @@ public void before_step_hooks_execute_in_order() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(typeRegistry -> stepDefinition); + glue.addStepDefinition(stepDefinition); for (HookDefinition hook : hooks) { glue.addBeforeStepHook(hook); } @@ -104,7 +103,7 @@ public void after_hooks_execute_in_reverse_order() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(typeRegistry -> stepDefinition); + glue.addStepDefinition(stepDefinition); for (HookDefinition hook : hooks) { glue.addAfterHook(hook); } @@ -131,7 +130,7 @@ public void after_step_hooks_execute_in_reverse_order() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(typeRegistry -> stepDefinition); + glue.addStepDefinition(stepDefinition); for (HookDefinition hook : hooks) { glue.addAfterStepHook(hook); } @@ -160,7 +159,7 @@ public void hooks_order_across_many_backends() throws Throwable { TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(typeRegistry -> stepDefinition); + glue.addStepDefinition(stepDefinition); for (HookDefinition hook : backend1Hooks) { glue.addBeforeHook(hook); diff --git a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java index f8e675e8bf..bdb98a1bc4 100644 --- a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -10,13 +10,11 @@ import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.options.RuntimeOptionsBuilder; import io.cucumber.core.runtime.TimeServiceEventBus; import io.cucumber.core.snippets.TestSnippet; -import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Test; import org.mockito.ArgumentMatchers; @@ -26,19 +24,22 @@ import java.net.URI; import java.time.Clock; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -86,8 +87,8 @@ public Object answer(InvocationOnMock invocation) { @Test public void steps_are_skipped_after_failure() throws Throwable { - final StepDefinition stepDefinition = mock(StepDefinition.class); - PickleEvent pickleEventMatchingStepDefinitions = createPickleEventMatchingStepDefinitions(asList(stepDefinition)); + StubStepDefinition stepDefinition = spy(new StubStepDefinition("some step")); + PickleEvent pickleEventMatchingStepDefinitions = createPickleEventMatchingStepDefinitions(stepDefinition); final HookDefinition failingBeforeHook = addBeforeHook(); doThrow(RuntimeException.class).when(failingBeforeHook).execute(ArgumentMatchers.any()); @@ -95,7 +96,7 @@ public void steps_are_skipped_after_failure() throws Throwable { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addBeforeHook(failingBeforeHook); - glue.addStepDefinition(typeRegistry -> stepDefinition); + glue.addStepDefinition(stepDefinition); } }; @@ -108,9 +109,15 @@ public void loadGlue(Glue glue, List gluePaths) { @Test public void aftersteps_are_executed_after_failed_step() throws Throwable { - final StepDefinition stepDefinition = mock(StepDefinition.class); - doThrow(RuntimeException.class).when(stepDefinition).execute(ArgumentMatchers.any()); - PickleEvent pickleEventMatchingStepDefinitions = createPickleEventMatchingStepDefinitions(asList(stepDefinition)); + StubStepDefinition stepDefinition = spy(new StubStepDefinition("some step") { + + @Override + public void execute(Object[] args) throws Throwable { + throw new RuntimeException(); + } + }); + + PickleEvent pickleEventMatchingStepDefinitions = createPickleEventMatchingStepDefinitions(stepDefinition); final HookDefinition afteStepHook = addAfterStepHook(); @@ -118,7 +125,7 @@ public void aftersteps_are_executed_after_failed_step() throws Throwable { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addAfterHook(afteStepHook); - glue.addStepDefinition(typeRegistry -> stepDefinition); + glue.addStepDefinition(stepDefinition); } }; @@ -131,18 +138,18 @@ public void loadGlue(Glue glue, List gluePaths) { @Test public void aftersteps_executed_for_passed_step() throws Throwable { - final StepDefinition stepDefinition = mock(StepDefinition.class); - PickleEvent pickleEvent = createPickleEventMatchingStepDefinitions(asList(stepDefinition)); + StubStepDefinition stepDefinition = spy(new StubStepDefinition("some step")); + PickleEvent pickleEvent = createPickleEventMatchingStepDefinitions(stepDefinition); - final HookDefinition afteStepHook1 = addAfterStepHook(); - final HookDefinition afteStepHook2 = addAfterStepHook(); + HookDefinition afteStepHook1 = addAfterStepHook(); + HookDefinition afteStepHook2 = addAfterStepHook(); TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addAfterHook(afteStepHook1); glue.addAfterHook(afteStepHook2); - glue.addStepDefinition(typeRegistry -> stepDefinition); + glue.addStepDefinition(stepDefinition); } }; @@ -182,32 +189,32 @@ public void loadGlue(Glue glue, List gluePaths) { @Test public void steps_are_executed() throws Throwable { - final StepDefinition stepDefinition = mock(StepDefinition.class); - PickleEvent pickleEventMatchingStepDefinitions = createPickleEventMatchingStepDefinitions(asList(stepDefinition)); + StubStepDefinition stepDefinition = new StubStepDefinition("some step"); + PickleEvent pickleEventMatchingStepDefinitions = createPickleEventMatchingStepDefinitions(stepDefinition); TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(typeRegistry -> stepDefinition); + glue.addStepDefinition(stepDefinition); } }; runnerSupplier.get().runPickle(pickleEventMatchingStepDefinitions); - verify(stepDefinition).execute(any(Object[].class)); + assertEquals(emptyList(), stepDefinition.getArgs()); } @Test - public void steps_are_not_executed_on_dry_run() throws Throwable { - final StepDefinition stepDefinition = mock(StepDefinition.class); - final PickleEvent pickleEvent = createPickleEventMatchingStepDefinitions(asList(stepDefinition)); + public void steps_are_not_executed_on_dry_run() { + StubStepDefinition stepDefinition = new StubStepDefinition("some step"); + PickleEvent pickleEvent = createPickleEventMatchingStepDefinitions(stepDefinition); RuntimeOptions runtimeOptions = new RuntimeOptionsBuilder().setDryRun().build(); TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(typeRegistry -> stepDefinition); + glue.addStepDefinition(stepDefinition); } }; runnerSupplier.get().runPickle(pickleEvent); - verify(stepDefinition, never()).execute(any(Object[].class)); + assertNull(stepDefinition.getArgs()); } @Test @@ -294,16 +301,11 @@ private PickleEvent createEmptyPickleEvent() { return new PickleEvent("uri", new Pickle(NAME, ENGLISH, NO_STEPS, NO_TAGS, MOCK_LOCATIONS)); } - private PickleEvent createPickleEventMatchingStepDefinitions(List stepDefinitions) { - List steps = new ArrayList<>(stepDefinitions.size()); - int i = 0; - for (StepDefinition stepDefinition : stepDefinitions) { - PickleStep step = mock(PickleStep.class); - steps.add(step); - when(stepDefinition.matchedArguments(step)).thenReturn(Collections.emptyList()); - when(stepDefinition.getPattern()).thenReturn("pattern" + Integer.toString(++i)); - } - return new PickleEvent("uri", new Pickle(NAME, ENGLISH, steps, NO_TAGS, MOCK_LOCATIONS)); + private PickleEvent createPickleEventMatchingStepDefinitions(StubStepDefinition stepDefinition) { + PickleStep step = mock(PickleStep.class); + String pattern = stepDefinition.getPattern(); + when(step.getText()).thenReturn(pattern); + return new PickleEvent("uri", new Pickle(NAME, ENGLISH, singletonList(step), NO_TAGS, MOCK_LOCATIONS)); } private PickleEvent createPickleEventWithSteps(List steps) { diff --git a/core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java b/core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java index a930bf2819..07c89e8e4d 100644 --- a/core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java +++ b/core/src/test/java/io/cucumber/core/runner/StepDefinitionMatchTest.java @@ -1,18 +1,18 @@ package io.cucumber.core.runner; -import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.runtime.StubStepDefinition; -import io.cucumber.core.stepexpression.TypeRegistry; import gherkin.pickles.PickleCell; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleRow; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTable; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.runtime.StubStepDefinition; +import io.cucumber.core.stepexpression.Argument; +import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.cucumberexpressions.Transformer; import io.cucumber.datatable.DataTableType; import io.cucumber.datatable.TableCellTransformer; -import io.cucumber.core.stepexpression.Argument; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -35,8 +35,9 @@ public class StepDefinitionMatchTest { public void executes_a_step() throws Throwable { PickleStep step = new PickleStep("I have 4 cukes in my belly", Collections.emptyList(), asList(mock(PickleLocation.class))); - StepDefinition stepDefinition = new StubStepDefinition("I have {int} cukes in my belly", typeRegistry, Integer.class); - List arguments = stepDefinition.matchedArguments(step); + StepDefinition stepDefinition = new StubStepDefinition("I have {int} cukes in my belly", Integer.class); + CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stepDefinition, typeRegistry); + List arguments = coreStepDefinition.matchedArguments(step); StepDefinitionMatch stepDefinitionMatch = new PickleStepDefinitionMatch(arguments, stepDefinition, null, step); stepDefinitionMatch.runStep(null); } @@ -45,8 +46,9 @@ public void executes_a_step() throws Throwable { public void throws_arity_mismatch_exception_when_there_are_fewer_parameters_than_arguments() throws Throwable { PickleStep step = new PickleStep("I have 4 cukes in my belly", Collections.emptyList(), asList(mock(PickleLocation.class))); - StepDefinition stepDefinition = new StubStepDefinition("I have {int} cukes in my belly", typeRegistry); - List arguments = stepDefinition.matchedArguments(step); + StepDefinition stepDefinition = new StubStepDefinition("I have {int} cukes in my belly"); + CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stepDefinition, typeRegistry); + List arguments = coreStepDefinition.matchedArguments(step); StepDefinitionMatch stepDefinitionMatch = new PickleStepDefinitionMatch(arguments, stepDefinition, null, step); @@ -70,8 +72,9 @@ public void throws_arity_mismatch_exception_when_there_are_fewer_parameters_than PickleStep step = new PickleStep("I have 4 cukes in my belly", asList((gherkin.pickles.Argument) table), asList(mock(PickleLocation.class))); - StepDefinition stepDefinition = new StubStepDefinition("I have {int} cukes in my belly", typeRegistry); - List arguments = stepDefinition.matchedArguments(step); + StepDefinition stepDefinition = new StubStepDefinition("I have {int} cukes in my belly"); + CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stepDefinition, typeRegistry); + List arguments = coreStepDefinition.matchedArguments(step); PickleStepDefinitionMatch stepDefinitionMatch = new PickleStepDefinitionMatch(arguments, stepDefinition, null, step); expectedException.expectMessage( @@ -90,8 +93,9 @@ public void throws_arity_mismatch_exception_when_there_are_fewer_parameters_than @Test public void throws_arity_mismatch_exception_when_there_are_more_parameters_than_arguments() throws Throwable { PickleStep step = new PickleStep("I have 4 cukes in my belly", asList((gherkin.pickles.Argument) mock(PickleTable.class)), asList(mock(PickleLocation.class))); - StepDefinition stepDefinition = new StubStepDefinition("I have {int} cukes in my belly", typeRegistry, Integer.TYPE, Short.TYPE, List.class); - List arguments = stepDefinition.matchedArguments(step); + StepDefinition stepDefinition = new StubStepDefinition("I have {int} cukes in my belly", Integer.TYPE, Short.TYPE, List.class); + CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stepDefinition, typeRegistry); + List arguments = coreStepDefinition.matchedArguments(step); PickleStepDefinitionMatch stepDefinitionMatch = new PickleStepDefinitionMatch(arguments, stepDefinition, null, step); expectedException.expectMessage("" + "Step [I have {int} cukes in my belly] is defined with 3 parameters at '{stubbed location with details}'.\n" + @@ -107,8 +111,9 @@ public void throws_arity_mismatch_exception_when_there_are_more_parameters_than_ @Test public void throws_arity_mismatch_exception_when_there_are_more_parameters_and_no_arguments() throws Throwable { PickleStep step = new PickleStep("I have cukes in my belly", Collections.emptyList(), asList(mock(PickleLocation.class))); - StepDefinition stepDefinition = new StubStepDefinition("I have cukes in my belly", typeRegistry, Integer.TYPE, Short.TYPE, List.class); - List arguments = stepDefinition.matchedArguments(step); + StepDefinition stepDefinition = new StubStepDefinition("I have cukes in my belly", Integer.TYPE, Short.TYPE, List.class); + CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stepDefinition, typeRegistry); + List arguments = coreStepDefinition.matchedArguments(step); StepDefinitionMatch stepDefinitionMatch = new PickleStepDefinitionMatch(arguments, stepDefinition, null, step); expectedException.expectMessage("" + "Step [I have cukes in my belly] is defined with 3 parameters at '{stubbed location with details}'.\n" + @@ -123,8 +128,9 @@ public void throws_register_type_in_configuration_exception_when_there_is_no_dat PickleTable table = new PickleTable(singletonList(new PickleRow(singletonList(new PickleCell(mock(PickleLocation.class), "A"))))); PickleStep step = new PickleStep("I have a datatable", asList((gherkin.pickles.Argument) table), asList(mock(PickleLocation.class))); - StepDefinition stepDefinition = new StubStepDefinition("I have a datatable", typeRegistry, UndefinedDataTableType.class); - List arguments = stepDefinition.matchedArguments(step); + StepDefinition stepDefinition = new StubStepDefinition("I have a datatable", UndefinedDataTableType.class); + CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stepDefinition, typeRegistry); + List arguments = coreStepDefinition.matchedArguments(step); StepDefinitionMatch stepDefinitionMatch = new PickleStepDefinitionMatch(arguments, stepDefinition, null, step); expectedException.expectMessage("" + @@ -148,8 +154,9 @@ public ItemQuantity transform(String s) throws Throwable { })); PickleStep step = new PickleStep("I have some cukes in my belly", Collections.emptyList(), asList(mock(PickleLocation.class))); - StepDefinition stepDefinition = new StubStepDefinition("I have {itemQuantity} in my belly", typeRegistry, ItemQuantity.class); - List arguments = stepDefinition.matchedArguments(step); + StepDefinition stepDefinition = new StubStepDefinition("I have {itemQuantity} in my belly", ItemQuantity.class); + CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stepDefinition, typeRegistry); + List arguments = coreStepDefinition.matchedArguments(step); StepDefinitionMatch stepDefinitionMatch = new PickleStepDefinitionMatch(arguments, stepDefinition, null, step); expectedException.expectMessage("" + @@ -181,8 +188,9 @@ public ItemQuantity transform(String s) { )); PickleStep step = new PickleStep("I have some cukes in my belly", singletonList((gherkin.pickles.Argument) table), asList(mock(PickleLocation.class))); - StepDefinition stepDefinition = new StubStepDefinition("I have some cukes in my belly", typeRegistry, ItemQuantity.class); - List arguments = stepDefinition.matchedArguments(step); + StepDefinition stepDefinition = new StubStepDefinition("I have some cukes in my belly", ItemQuantity.class); + CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stepDefinition, typeRegistry); + List arguments = coreStepDefinition.matchedArguments(step); StepDefinitionMatch stepDefinitionMatch = new PickleStepDefinitionMatch(arguments, stepDefinition, null, step); expectedException.expectMessage("" + diff --git a/core/src/test/java/io/cucumber/core/runner/StubStepDefinition.java b/core/src/test/java/io/cucumber/core/runner/StubStepDefinition.java new file mode 100644 index 0000000000..5b9e204a6f --- /dev/null +++ b/core/src/test/java/io/cucumber/core/runner/StubStepDefinition.java @@ -0,0 +1,86 @@ +package io.cucumber.core.runner; + +import io.cucumber.core.backend.ParameterInfo; +import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.backend.TypeResolver; + +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.Assert.assertEquals; + +class StubStepDefinition implements StepDefinition { + private final List parameterInfos; + private final String expression; + private final boolean transposed; + + private List args; + + StubStepDefinition(String pattern, Type... types) { + this(pattern, false, types); + } + + StubStepDefinition(String pattern, boolean transposed, Type... types) { + this.parameterInfos = Stream.of(types).map(StubParameterInfo::new).collect(Collectors.toList()); + this.expression = pattern; + this.transposed = transposed; + } + + @Override + public String getLocation(boolean detail) { + return "{stubbed location" + (detail ? " with details" : "") + "}"; + } + + @Override + public void execute(Object[] args) throws Throwable { + assertEquals(parameterInfos.size(), args.length); + this.args = Arrays.asList(args); + } + + public List getArgs() { + return args; + } + + @Override + public boolean isDefinedAt(StackTraceElement stackTraceElement) { + return false; + } + + @Override + public List parameterInfos() { + return parameterInfos; + } + + @Override + public String getPattern() { + return expression; + } + + private final class StubParameterInfo implements ParameterInfo { + + private final Type type; + + private StubParameterInfo(Type type) { + this.type = type; + } + + @Override + public Type getType() { + return type; + } + + @Override + public boolean isTransposed() { + return transposed; + } + + @Override + public TypeResolver getTypeResolver() { + return () -> type; + } + } + +} diff --git a/core/src/test/java/io/cucumber/core/runner/TestHelper.java b/core/src/test/java/io/cucumber/core/runner/TestHelper.java index 15e8656f6b..3ecc2baf18 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestHelper.java +++ b/core/src/test/java/io/cucumber/core/runner/TestHelper.java @@ -161,7 +161,7 @@ private static void mockSteps(Glue glue, List features, } Type[] types = mapArgumentToTypes(step); - StepDefinition stepDefinition = new StubStepDefinition(step.getText(), typeRegistry, types) { + StepDefinition stepDefinition = new StubStepDefinition(step.getText(), types) { @Override public void execute(Object[] args) throws Throwable { @@ -183,7 +183,7 @@ public String getLocation(boolean detail) { } }; - glue.addStepDefinition(t -> stepDefinition); + glue.addStepDefinition(stepDefinition); } } diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index f25ff87f9e..9369ffff38 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -2,33 +2,33 @@ import gherkin.ast.ScenarioDefinition; import gherkin.ast.Step; -import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; -import io.cucumber.core.event.Result; -import io.cucumber.core.event.Status; -import io.cucumber.core.plugin.ConcurrentEventListener; +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.ParameterInfo; import io.cucumber.core.event.EventHandler; -import io.cucumber.core.plugin.EventListener; import io.cucumber.core.event.EventPublisher; import io.cucumber.core.event.HookType; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.Status; import io.cucumber.core.event.StepDefinedEvent; +import io.cucumber.core.event.StepDefinition; import io.cucumber.core.event.TestCase; import io.cucumber.core.event.TestCaseFinished; import io.cucumber.core.event.TestStepFinished; -import io.cucumber.core.plugin.Plugin; -import io.cucumber.core.backend.Glue; -import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.event.StepDefinition; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.exception.CompositeCucumberException; +import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.io.Resource; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.TestClasspathResourceLoader; -import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.options.CommandlineOptionsParser; +import io.cucumber.core.plugin.ConcurrentEventListener; +import io.cucumber.core.plugin.EventListener; import io.cucumber.core.plugin.FormatterBuilder; import io.cucumber.core.plugin.FormatterSpy; +import io.cucumber.core.plugin.Plugin; import io.cucumber.core.runner.ScenarioScoped; import io.cucumber.core.runner.StepDurationTimeService; import io.cucumber.core.runner.TestBackendSupplier; @@ -56,6 +56,7 @@ import static io.cucumber.core.runner.TestHelper.feature; import static io.cucumber.core.runner.TestHelper.result; import static java.time.Duration.ZERO; +import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static java.util.concurrent.TimeUnit.HOURS; import static java.util.concurrent.TimeUnit.SECONDS; @@ -583,14 +584,14 @@ public void loadGlue(Glue glue, List gluePaths) { this.glue = glue; final io.cucumber.core.backend.StepDefinition mockedStepDefinition = new MockedStepDefinition(); definedStepDefinitions.add(mockedStepDefinition); - glue.addStepDefinition(typeRegistry -> mockedStepDefinition); + glue.addStepDefinition(mockedStepDefinition); } @Override public void buildWorld() { final io.cucumber.core.backend.StepDefinition mockedScenarioScopedStepDefinition = new MockedScenarioScopedStepDefinition(); definedStepDefinitions.add(mockedScenarioScopedStepDefinition); - glue.addStepDefinition(typeRegistry -> mockedScenarioScopedStepDefinition); + glue.addStepDefinition(mockedScenarioScopedStepDefinition); } }; @@ -717,8 +718,8 @@ public List get() { } private void mockMatch(Glue glue, String text) { - io.cucumber.core.backend.StepDefinition stepDefinition = new StubStepDefinition(text, TYPE_REGISTRY); - glue.addStepDefinition(typeRegistry -> stepDefinition); + io.cucumber.core.backend.StepDefinition stepDefinition = new StubStepDefinition(text); + glue.addStepDefinition(stepDefinition); } private void mockHook(Glue glue, HookDefinition hook, HookType hookType) { @@ -746,19 +747,14 @@ private TestCaseFinished testCaseFinishedWithStatus(Status resultStatus) { private static final class MockedStepDefinition implements io.cucumber.core.backend.StepDefinition { - @Override - public List matchedArguments(PickleStep step) { - return step.getText().equals(getPattern()) ? new ArrayList<>() : null; - } - @Override public String getLocation(boolean detail) { return "mocked step definition"; } @Override - public Integer getParameterCount() { - return 0; + public List parameterInfos() { + return emptyList(); } @Override @@ -787,19 +783,14 @@ public void disposeScenarioScope() { this.disposed = true; } - @Override - public List matchedArguments(PickleStep step) { - return step.getText().equals(getPattern()) ? new ArrayList<>() : null; - } - @Override public String getLocation(boolean detail) { return "mocked scenario scoped step definition"; } @Override - public Integer getParameterCount() { - return 0; + public List parameterInfos() { + return emptyList(); } @Override diff --git a/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java b/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java index d5c5d02a14..0704144230 100644 --- a/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java +++ b/core/src/test/java/io/cucumber/core/runtime/StubStepDefinition.java @@ -1,38 +1,23 @@ package io.cucumber.core.runtime; +import io.cucumber.core.backend.ParameterInfo; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.core.stepexpression.Argument; -import gherkin.pickles.PickleStep; -import io.cucumber.core.stepexpression.ArgumentMatcher; -import io.cucumber.core.stepexpression.StepExpression; -import io.cucumber.core.stepexpression.StepExpressionFactory; +import io.cucumber.core.backend.TypeResolver; import java.lang.reflect.Type; -import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.junit.Assert.assertEquals; public class StubStepDefinition implements StepDefinition { - private final List parameters; - private final StepExpression expression; - private final ArgumentMatcher argumentMatcher; - - public StubStepDefinition(String pattern, TypeRegistry typeRegistry, Type... types) { - this.parameters = Arrays.asList(types); - if (parameters.isEmpty()) { - this.expression = new StepExpressionFactory(typeRegistry).createExpression(pattern); - } else { - Type lastParameter = parameters.get(parameters.size() - 1); - this.expression = new StepExpressionFactory(typeRegistry).createExpression(pattern, lastParameter); - } - this.argumentMatcher = new ArgumentMatcher(expression); - } + private final List parameterInfos; + private final String expression; - @Override - public List matchedArguments(PickleStep step) { - return argumentMatcher.argumentsFrom(step); + public StubStepDefinition(String pattern, Type... types) { + this.parameterInfos = Stream.of(types).map(StubParameterInfo::new).collect(Collectors.toList()); + this.expression = pattern; } @Override @@ -41,15 +26,10 @@ public String getLocation(boolean detail) { } @Override - public Integer getParameterCount() { - return parameters.size(); - } - - @Override - public void execute(Object[] args) throws Throwable { - assertEquals(parameters.size(), args.length); + public void execute(Object[] args) { + assertEquals(parameterInfos.size(), args.length); for (int i = 0; i < args.length; i++) { - assertEquals(parameters.get(i), args[i].getClass()); + assertEquals(parameterInfos.get(i).getType(), args[i].getClass()); } } @@ -58,9 +38,38 @@ public boolean isDefinedAt(StackTraceElement stackTraceElement) { return false; } + @Override + public List parameterInfos() { + return parameterInfos; + } + @Override public String getPattern() { - return expression.getSource(); + return expression; + } + + private final class StubParameterInfo implements ParameterInfo { + + private final Type type; + + private StubParameterInfo(Type type) { + this.type = type; + } + + @Override + public Type getType() { + return type; + } + + @Override + public boolean isTransposed() { + return false; + } + + @Override + public TypeResolver getTypeResolver() { + return () -> type; + } } } diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 299e7f08c2..b32204d823 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -62,8 +62,7 @@ void addStepDefinition(Annotation annotation, Method method) { String expression = expression(annotation); long timeoutMillis = timeoutMillis(annotation); container.addClass(method.getDeclaringClass()); - glue.addStepDefinition(typeRegistry -> - new JavaStepDefinition(method, expression, timeoutMillis, lookup, typeRegistry)); + glue.addStepDefinition(new JavaStepDefinition(method, expression, timeoutMillis, lookup)); } void addHook(Annotation annotation, Method method) { diff --git a/java/src/main/java/io/cucumber/java/JavaParameterInfo.java b/java/src/main/java/io/cucumber/java/JavaParameterInfo.java new file mode 100644 index 0000000000..51064a9ccf --- /dev/null +++ b/java/src/main/java/io/cucumber/java/JavaParameterInfo.java @@ -0,0 +1,58 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.ParameterInfo; +import io.cucumber.core.backend.TypeResolver; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +/** + * This class composes all interesting parameter information into one object. + */ +class JavaParameterInfo implements ParameterInfo { + private final Type type; + private final boolean transposed; + + static List fromMethod(Method method) { + List result = new ArrayList<>(); + Type[] genericParameterTypes = method.getGenericParameterTypes(); + Annotation[][] annotations = method.getParameterAnnotations(); + for (int i = 0; i < genericParameterTypes.length; i++) { + boolean transposed = false; + for (Annotation annotation : annotations[i]) { + if (annotation instanceof Transpose) { + transposed = ((Transpose) annotation).value(); + } + } + result.add(new JavaParameterInfo(genericParameterTypes[i], transposed)); + } + return result; + } + + private JavaParameterInfo(Type type, boolean transposed) { + this.type = type; + this.transposed = transposed; + } + + public Type getType() { + return type; + } + + public boolean isTransposed() { + return transposed; + } + + @Override + public TypeResolver getTypeResolver() { + return () -> type; + } + + @Override + public String toString() { + return type.toString(); + } + +} diff --git a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java index 7d8f6b3fc4..4a364fa55f 100644 --- a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java @@ -1,86 +1,47 @@ package io.cucumber.java; import io.cucumber.core.backend.Lookup; -import io.cucumber.core.runtime.Invoker; -import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.core.stepexpression.Argument; -import io.cucumber.core.stepexpression.ArgumentMatcher; -import io.cucumber.core.reflection.MethodFormat; +import io.cucumber.core.backend.ParameterInfo; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.stepexpression.StepExpression; -import io.cucumber.core.stepexpression.StepExpressionFactory; -import gherkin.pickles.PickleStep; +import io.cucumber.core.reflection.MethodFormat; +import io.cucumber.core.runtime.Invoker; -import java.lang.annotation.Annotation; import java.lang.reflect.Method; -import java.lang.reflect.Type; -import java.util.ArrayList; import java.util.List; final class JavaStepDefinition implements StepDefinition { private final Method method; - private final StepExpression expression; + private final String expression; private final long timeoutMillis; private final Lookup lookup; - private final ArgumentMatcher argumentMatcher; - private final Type[] parameterTypes; private final String shortFormat; private final String fullFormat; + private final List parameterInfos; JavaStepDefinition(Method method, String expression, long timeoutMillis, - Lookup lookup, - TypeRegistry typeRegistry) { + Lookup lookup) { this.method = method; this.timeoutMillis = timeoutMillis; this.lookup = lookup; - List parameterInfos = ParameterInfo.fromMethod(method); - this.parameterTypes = getTypes(parameterInfos); - this.expression = createExpression(parameterInfos, expression, typeRegistry); - this.argumentMatcher = new ArgumentMatcher(this.expression); + this.parameterInfos = JavaParameterInfo.fromMethod(method); + this.expression = expression; this.shortFormat = MethodFormat.SHORT.format(method); this.fullFormat = MethodFormat.FULL.format(method); } - private StepExpression createExpression(List parameterInfos, String expression, TypeRegistry typeRegistry) { - if (parameterInfos.isEmpty()) { - return new StepExpressionFactory(typeRegistry).createExpression(expression); - } else { - ParameterInfo parameterInfo = parameterInfos.get(parameterInfos.size() - 1); - return new StepExpressionFactory(typeRegistry).createExpression(expression, parameterInfo.getType(), parameterInfo.isTransposed()); - } - } - @Override public void execute(Object[] args) throws Throwable { Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); } - @Override - public List matchedArguments(PickleStep step) { - return argumentMatcher.argumentsFrom(step, parameterTypes); - } - - private static Type[] getTypes(List parameterInfos) { - Type[] types = new Type[parameterInfos.size()]; - for (int i = 0; i < types.length; i++) { - types[i] = parameterInfos.get(i).getType(); - } - return types; - } - @Override public String getLocation(boolean detail) { return detail ? fullFormat : shortFormat; } - @Override - public Integer getParameterCount() { - return parameterTypes.length; - } - @Override public boolean isDefinedAt(StackTraceElement e) { return e.getClassName().equals(method.getDeclaringClass().getName()) && e.getMethodName().equals(method.getName()); @@ -88,49 +49,12 @@ public boolean isDefinedAt(StackTraceElement e) { @Override public String getPattern() { - return expression.getSource(); + return expression; } - /** - * This class composes all interesting parameter information into one object. - */ - static class ParameterInfo { - private final Type type; - private final boolean transposed; - - static List fromMethod(Method method) { - List result = new ArrayList(); - Type[] genericParameterTypes = method.getGenericParameterTypes(); - Annotation[][] annotations = method.getParameterAnnotations(); - for (int i = 0; i < genericParameterTypes.length; i++) { - boolean transposed = false; - for (Annotation annotation : annotations[i]) { - if (annotation instanceof Transpose) { - transposed = ((Transpose) annotation).value(); - } - } - result.add(new ParameterInfo(genericParameterTypes[i], transposed)); - } - return result; - } - - private ParameterInfo(Type type, boolean transposed) { - this.type = type; - this.transposed = transposed; - } - - Type getType() { - return type; - } - - boolean isTransposed() { - return transposed; - } - - @Override - public String toString() { - return type.toString(); - } - + @Override + public List parameterInfos() { + return parameterInfos; } + } diff --git a/java/src/test/java/io/cucumber/java/JavaBackendTest.java b/java/src/test/java/io/cucumber/java/JavaBackendTest.java index 091606fcbe..ec11dac401 100644 --- a/java/src/test/java/io/cucumber/java/JavaBackendTest.java +++ b/java/src/test/java/io/cucumber/java/JavaBackendTest.java @@ -1,6 +1,5 @@ package io.cucumber.java; -import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.StepDefinition; @@ -40,7 +39,7 @@ public class JavaBackendTest { public MockitoRule mockitoRule = MockitoJUnit.rule(); @Captor - public ArgumentCaptor> stepDefinition; + public ArgumentCaptor stepDefinition; @Mock private Glue glue; @@ -76,11 +75,8 @@ public void detects_repeated_annotations() { backend.loadGlue(glue, asList(URI.create("classpath:io/cucumber/java/repeatable"))); verify(glue, times(2)).addStepDefinition(stepDefinition.capture()); - TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); - List patterns = stepDefinition.getAllValues() .stream() - .map(stepDefinitionFunction -> stepDefinitionFunction.apply(typeRegistry)) .map(StepDefinition::getPattern) .collect(toList()); assertThat(patterns, equalTo(asList("test", "test again"))); diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java index d570e1bc71..1dc368e67d 100755 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTransposeTest.java @@ -2,150 +2,44 @@ import io.cucumber.core.backend.Lookup; import io.cucumber.core.backend.StepDefinition; -import gherkin.pickles.PickleCell; -import gherkin.pickles.PickleLocation; -import gherkin.pickles.PickleRow; -import gherkin.pickles.PickleStep; -import gherkin.pickles.PickleTable; -import io.cucumber.datatable.DataTable; -import io.cucumber.core.stepexpression.Argument; -import io.cucumber.core.stepexpression.TypeRegistry; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.List; -import java.util.Locale; import java.util.Map; -import static java.util.Arrays.asList; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; public class JavaStepDefinitionTransposeTest { - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private final TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); public static class StepDefs { - List> listOfListOfDoubles; - public Map mapOfDoubleToDouble; - - public DataTable dataTable; - private Map> mapOfDoubleToListOfDouble; - - - public void listOfListOfDoubles(List> listOfListOfDoubles) { - this.listOfListOfDoubles = listOfListOfDoubles; - } - - public void listOfListOfDoublesTransposed(@Transpose List> listOfListOfDoubles) { - this.listOfListOfDoubles = listOfListOfDoubles; - } - - public void plainDataTable(DataTable dataTable) { - this.dataTable = dataTable; - } - - public void transposedDataTable(@Transpose DataTable dataTable) { - this.dataTable = dataTable; - } public void mapOfDoubleToDouble(Map mapOfDoubleToDouble) { - this.mapOfDoubleToDouble = mapOfDoubleToDouble; + } public void transposedMapOfDoubleToListOfDouble(@Transpose Map> mapOfDoubleToListOfDouble) { - this.mapOfDoubleToListOfDouble = mapOfDoubleToListOfDouble; } } @Test public void transforms_to_map_of_double_to_double() throws Throwable { Method m = StepDefs.class.getMethod("mapOfDoubleToDouble", Map.class); - StepDefs stepDefs = runStepDef(m, new PickleTable(listOfDoublesWithoutHeader())); - assertEquals(Double.valueOf(999.0), stepDefs.mapOfDoubleToDouble.get(1000.0)); - assertEquals(Double.valueOf(-0.5), stepDefs.mapOfDoubleToDouble.get(0.5)); - assertEquals(Double.valueOf(99.5), stepDefs.mapOfDoubleToDouble.get(100.5)); + assertFalse(isTransposed(m)); } @Test public void transforms_transposed_to_map_of_double_to_double() throws Throwable { Method m = StepDefs.class.getMethod("transposedMapOfDoubleToListOfDouble", Map.class); - StepDefs stepDefs = runStepDef(m, new PickleTable(listOfDoublesWithoutHeader())); - assertEquals(asList(0.5, 1000.0), stepDefs.mapOfDoubleToListOfDouble.get(100.5)); - } - - @Test - public void transforms_to_list_of_single_values() throws Throwable { - Method m = StepDefs.class.getMethod("listOfListOfDoubles", List.class); - StepDefs stepDefs = runStepDef(m, new PickleTable(listOfDoublesWithoutHeader())); - assertEquals("[[100.5, 99.5], [0.5, -0.5], [1000.0, 999.0]]", stepDefs.listOfListOfDoubles.toString()); - } - - @Test - public void transforms_to_list_of_single_values_transposed() throws Throwable { - Method m = StepDefs.class.getMethod("listOfListOfDoublesTransposed", List.class); - StepDefs stepDefs = runStepDef(m, new PickleTable(transposedListOfDoublesWithoutHeader())); - assertEquals("[[100.5, 99.5], [0.5, -0.5], [1000.0, 999.0]]", stepDefs.listOfListOfDoubles.toString()); + assertTrue(isTransposed(m)); } - @Test - public void passes_plain_data_table() throws Throwable { - Method m = StepDefs.class.getMethod("plainDataTable", DataTable.class); - StepDefs stepDefs = runStepDef(m, new PickleTable(listOfDatesWithHeader())); - assertEquals("Birth Date", stepDefs.dataTable.cell(0, 0)); - assertEquals("1957-05-10", stepDefs.dataTable.cell(1, 0)); - } - - @Test - public void passes_transposed_data_table() throws Throwable { - Method m = StepDefs.class.getMethod("transposedDataTable", DataTable.class); - StepDefs stepDefs = runStepDef(m, new PickleTable(listOfDatesWithHeader())); - assertEquals("Birth Date", stepDefs.dataTable.cell(0, 0)); - assertEquals("1957-05-10", stepDefs.dataTable.cell(0, 1)); - } - - private StepDefs runStepDef(Method method, PickleTable table) throws Throwable { + private boolean isTransposed(Method method) { StepDefs stepDefs = new StepDefs(); Lookup lookup = new SingletonFactory(stepDefs); + StepDefinition stepDefinition = new JavaStepDefinition(method, "some text", 0, lookup); - StepDefinition stepDefinition = new JavaStepDefinition(method, "some text", 0, lookup, typeRegistry); - PickleStep stepWithTable = new PickleStep("some text", asList((gherkin.pickles.Argument) table), asList(mock(PickleLocation.class))); - List arguments = stepDefinition.matchedArguments(stepWithTable); - - List result = new ArrayList<>(); - for (Argument argument : arguments) { - result.add(argument.getValue()); - } - stepDefinition.execute(result.toArray(new Object[0])); - - return stepDefs; - } - - private List listOfDatesWithHeader() { - List rows = new ArrayList<>(); - rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "Birth Date")))); - rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "1957-05-10")))); - return rows; - } - - private List listOfDoublesWithoutHeader() { - List rows = new ArrayList<>(); - rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "100.5"), new PickleCell(mock(PickleLocation.class), "99.5")))); - rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "0.5"), new PickleCell(mock(PickleLocation.class), "-0.5")))); - rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "1000"), new PickleCell(mock(PickleLocation.class), "999")))); - return rows; - } - - private List transposedListOfDoublesWithoutHeader() { - List rows = new ArrayList<>(); - rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "100.5"), new PickleCell(mock(PickleLocation.class), "0.5"), new PickleCell(mock(PickleLocation.class), "1000")))); - rows.add(new PickleRow(asList(new PickleCell(mock(PickleLocation.class), "99.5"), new PickleCell(mock(PickleLocation.class), "-0.5"), new PickleCell(mock(PickleLocation.class), "999")))); - return rows; + return stepDefinition.parameterInfos().get(0).isTransposed(); } - } diff --git a/java8/src/main/groovy/lambda.java.gsp b/java8/src/main/groovy/lambda.java.gsp index 74c2997703..f0e5313b90 100644 --- a/java8/src/main/groovy/lambda.java.gsp +++ b/java8/src/main/groovy/lambda.java.gsp @@ -46,9 +46,7 @@ public interface ${className} extends LambdaGlue { * @param body a lambda expression with no parameters */ default void ${java.text.Normalizer.normalize(kw.replaceAll("[\\s',!]", ""), java.text.Normalizer.Form.NFC)}(String expression, A0 body) { - LambdaGlueRegistry.INSTANCE.get().addStepDefinition((typeRegistry) -> - Java8StepDefinition.create(expression, A0.class, body, typeRegistry) - ); + LambdaGlueRegistry.INSTANCE.get().addStepDefinition(Java8StepDefinition.create(expression, A0.class, body)); } /** @@ -68,9 +66,7 @@ public interface ${className} extends LambdaGlue { */ @Deprecated default void ${java.text.Normalizer.normalize(kw.replaceAll("[\\s',!]", ""), java.text.Normalizer.Form.NFC)}(String expression, long timeoutMillis, A0 body) { - LambdaGlueRegistry.INSTANCE.get().addStepDefinition((typeRegistry) -> - Java8StepDefinition.create(expression, timeoutMillis, A0.class, body, typeRegistry) - ); + LambdaGlueRegistry.INSTANCE.get().addStepDefinition(Java8StepDefinition.create(expression, timeoutMillis, A0.class, body)); } <% (1..9).each { arity -> @@ -85,9 +81,7 @@ public interface ${className} extends LambdaGlue { * @param type of argument ${i} <% } %> */ default <${genericSignature}> void ${java.text.Normalizer.normalize(kw.replaceAll("[\\s',!]", ""), java.text.Normalizer.Form.NFC)}(String expression, A${arity}<${genericSignature}> body) { - LambdaGlueRegistry.INSTANCE.get().addStepDefinition((typeRegistry) -> - Java8StepDefinition.create(expression, A${arity}.class, body, typeRegistry) - ); + LambdaGlueRegistry.INSTANCE.get().addStepDefinition(Java8StepDefinition.create(expression, A${arity}.class, body)); } /** @@ -109,9 +103,7 @@ public interface ${className} extends LambdaGlue { */ @Deprecated default <${genericSignature}> void ${java.text.Normalizer.normalize(kw.replaceAll("[\\s',!]", ""), java.text.Normalizer.Form.NFC)}(String expression, long timeoutMillis, A${arity}<${genericSignature}> body) { - LambdaGlueRegistry.INSTANCE.get().addStepDefinition((typeRegistry) -> - Java8StepDefinition.create(expression, timeoutMillis, A${arity}.class, body, typeRegistry) - ); + LambdaGlueRegistry.INSTANCE.get().addStepDefinition(Java8StepDefinition.create(expression, timeoutMillis, A${arity}.class, body)); } <% } %> diff --git a/java8/src/main/java/io/cucumber/java8/Java8Backend.java b/java8/src/main/java/io/cucumber/java8/Java8Backend.java index ff0d6ee6cc..2e43c35baf 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8Backend.java +++ b/java8/src/main/java/io/cucumber/java8/Java8Backend.java @@ -72,8 +72,8 @@ public Snippet getSnippet() { } @Override - public void addStepDefinition(Function stepDefinitionFunction) { - glue.addStepDefinition(stepDefinitionFunction); + public void addStepDefinition(StepDefinition stepDefinition) { + glue.addStepDefinition(stepDefinition); } @Override diff --git a/java8/src/main/java/io/cucumber/java8/Java8ParameterInfo.java b/java8/src/main/java/io/cucumber/java8/Java8ParameterInfo.java new file mode 100644 index 0000000000..2a9607b31b --- /dev/null +++ b/java8/src/main/java/io/cucumber/java8/Java8ParameterInfo.java @@ -0,0 +1,35 @@ +package io.cucumber.java8; + +import io.cucumber.core.backend.ParameterInfo; +import io.cucumber.core.backend.TypeResolver; + +import java.lang.reflect.Type; + +final class Java8ParameterInfo implements ParameterInfo { + private final Type type; + private final TypeResolver typeResolver; + + Java8ParameterInfo(Type type, TypeResolver typeResolver) { + this.type = type; + this.typeResolver = typeResolver; + } + + public Type getType() { + return type; + } + + @Override + public boolean isTransposed() { + return false; + } + + @Override + public TypeResolver getTypeResolver() { + return typeResolver; + } + + @Override + public String toString() { + return type.toString(); + } +} diff --git a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java index c877ec1cbe..5011a5dfa5 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java @@ -1,38 +1,28 @@ package io.cucumber.java8; -import gherkin.pickles.PickleStep; +import io.cucumber.core.backend.ParameterInfo; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.runtime.Invoker; import io.cucumber.core.runner.ScenarioScoped; -import io.cucumber.core.stepexpression.Argument; -import io.cucumber.core.stepexpression.ArgumentMatcher; -import io.cucumber.core.stepexpression.StepExpression; -import io.cucumber.core.stepexpression.StepExpressionFactory; -import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.core.stepexpression.TypeResolver; -import net.jodah.typetools.TypeResolver.Unknown; +import io.cucumber.core.runtime.Invoker; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import static io.cucumber.java8.Java8StepDefinition.ParameterInfo.fromTypes; import static java.lang.String.format; import static net.jodah.typetools.TypeResolver.resolveRawArguments; final class Java8StepDefinition implements StepDefinition, ScenarioScoped { public static Java8StepDefinition create( - String expression, Class bodyClass, T body, TypeRegistry typeRegistry) { - return new Java8StepDefinition(expression, 0, bodyClass, body, typeRegistry); + String expression, Class bodyClass, T body) { + return new Java8StepDefinition(expression, 0, bodyClass, body); } public static StepDefinition create( - String expression, long timeoutMillis, Class bodyClass, T body, TypeRegistry typeRegistry) { - return new Java8StepDefinition(expression, timeoutMillis, bodyClass, body, typeRegistry); + String expression, long timeoutMillis, Class bodyClass, T body) { + return new Java8StepDefinition(expression, timeoutMillis, bodyClass, body); } private final long timeoutMillis; @@ -40,31 +30,18 @@ public static StepDefinition create( private final StackTraceElement location; private final Method method; private final List parameterInfos; - private final StepExpression expression; - private final ArgumentMatcher argumentMatcher; + private final String expression; private Java8StepDefinition(String expression, long timeoutMillis, Class bodyClass, - T body, - TypeRegistry typeRegistry) { + T body) { this.timeoutMillis = timeoutMillis; this.body = body; - - this.location = new Exception().getStackTrace()[5]; + this.location = new Exception().getStackTrace()[3]; this.method = getAcceptMethod(body.getClass()); - this.parameterInfos = fromTypes(resolveRawArguments(bodyClass, body.getClass())); - this.expression = createExpression(expression, typeRegistry); - this.argumentMatcher = new ArgumentMatcher(this.expression); - } - - private StepExpression createExpression(String expression, TypeRegistry typeRegistry) { - if (parameterInfos.isEmpty()) { - return new StepExpressionFactory(typeRegistry).createExpression(expression); - } else { - ParameterInfo parameterInfo = parameterInfos.get(parameterInfos.size() - 1); - return new StepExpressionFactory(typeRegistry).createExpression(expression, new LambdaTypeResolver(parameterInfo)); - } + this.expression = expression; + this.parameterInfos = fromTypes(expression, location, resolveRawArguments(bodyClass, body.getClass())); } private Method getAcceptMethod(Class bodyClass) { @@ -81,30 +58,12 @@ private Method getAcceptMethod(Class bodyClass) { return acceptMethods.get(0); } - private CucumberException withLocation(CucumberException exception) { - exception.setStackTrace(new StackTraceElement[]{this.location}); - return exception; - } - - @Override - public List matchedArguments(PickleStep step) { - Type[] types = new Type[parameterInfos.size()]; - for (int i = 0; i < types.length; i++) { - types[i] = parameterInfos.get(i).getType(); - } - return argumentMatcher.argumentsFrom(step, types); - } @Override public String getLocation(boolean detail) { return location.getFileName() + ":" + location.getLineNumber(); } - @Override - public Integer getParameterCount() { - return parameterInfos.size(); - } - @Override public void execute(final Object[] args) throws Throwable { Invoker.invoke(body, method, timeoutMillis, args); @@ -116,73 +75,28 @@ public boolean isDefinedAt(StackTraceElement stackTraceElement) { } @Override - public String getPattern() { - return expression.getSource(); + public List parameterInfos() { + return parameterInfos; } - private final class LambdaTypeResolver implements TypeResolver { - - - private final ParameterInfo parameterInfo; - - LambdaTypeResolver(ParameterInfo parameterInfo) { - this.parameterInfo = parameterInfo; - } - - @Override - public Type resolve() { - Type type = parameterInfo.getType(); - if (Unknown.class.equals(type)) { - return Object.class; - } - - return requireNonMapOrListType(type); - } - - private Type requireNonMapOrListType(Type argumentType) { - if (argumentType instanceof Class) { - Class argumentClass = (Class) argumentType; - if (List.class.isAssignableFrom(argumentClass) || Map.class.isAssignableFrom(argumentClass)) { - throw withLocation( - new CucumberException( - format("Can't use %s in lambda step definition \"%s\". " + - "Declare a DataTable argument instead and convert " + - "manually with asList/asLists/asMap/asMaps", - argumentClass.getName(), expression.getSource()))); - } - } - return argumentType; - } + @Override + public String getPattern() { + return expression; } + @Override public void disposeScenarioScope() { this.body = null; } - static class ParameterInfo { - private final Type type; - - static List fromTypes(Type[] genericParameterTypes) { - List result = new ArrayList<>(); - for (Type genericParameterType : genericParameterTypes) { - result.add(new ParameterInfo(genericParameterType)); - } - return result; - } - - private ParameterInfo(Type type) { - this.type = type; - } - - Type getType() { - return type; + private static List fromTypes(String expression, StackTraceElement location, Type[] genericParameterTypes) { + List result = new ArrayList<>(); + for (Type type : genericParameterTypes) { + LambdaTypeResolver typeResolver = new LambdaTypeResolver(type, expression, location); + result.add(new Java8ParameterInfo(type, typeResolver)); } - - @Override - public String toString() { - return type.toString(); - } - + return result; } + } diff --git a/java8/src/main/java/io/cucumber/java8/LambdaGlueRegistry.java b/java8/src/main/java/io/cucumber/java8/LambdaGlueRegistry.java index 960997e02f..121a7e5e89 100644 --- a/java8/src/main/java/io/cucumber/java8/LambdaGlueRegistry.java +++ b/java8/src/main/java/io/cucumber/java8/LambdaGlueRegistry.java @@ -1,15 +1,12 @@ package io.cucumber.java8; -import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; -import java.util.function.Function; - interface LambdaGlueRegistry { ThreadLocal INSTANCE = new ThreadLocal<>(); - void addStepDefinition(Function stepDefinition); + void addStepDefinition(StepDefinition stepDefinition); void addBeforeStepHookDefinition(HookDefinition beforeStepHook); diff --git a/java8/src/main/java/io/cucumber/java8/LambdaTypeResolver.java b/java8/src/main/java/io/cucumber/java8/LambdaTypeResolver.java new file mode 100644 index 0000000000..4af00cab52 --- /dev/null +++ b/java8/src/main/java/io/cucumber/java8/LambdaTypeResolver.java @@ -0,0 +1,51 @@ +package io.cucumber.java8; + +import io.cucumber.core.backend.TypeResolver; +import io.cucumber.core.exception.CucumberException; + +import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; + +import static java.lang.String.format; + +final class LambdaTypeResolver implements TypeResolver { + private final Type type; + private final String expression; + private final StackTraceElement location; + + LambdaTypeResolver(Type type, String expression, StackTraceElement location) { + this.type = type; + this.expression = expression; + this.location = location; + } + + @Override + public Type resolve() { + if (net.jodah.typetools.TypeResolver.Unknown.class.equals(type)) { + return Object.class; + } + return requireNonMapOrListType(type); + } + + private Type requireNonMapOrListType(Type argumentType) { + if (argumentType instanceof Class) { + Class argumentClass = (Class) argumentType; + if (List.class.isAssignableFrom(argumentClass) || Map.class.isAssignableFrom(argumentClass)) { + throw withLocation( + new CucumberException( + format("Can't use %s in lambda step definition \"%s\". " + + "Declare a DataTable argument instead and convert " + + "manually with asList/asLists/asMap/asMaps", + argumentClass.getName(), expression))); + } + } + return argumentType; + } + + private CucumberException withLocation(CucumberException exception) { + exception.setStackTrace(new StackTraceElement[]{location}); + return exception; + } + +} diff --git a/java8/src/test/java/io/cucumber/java8/AnonInnerClassStepdefs.java b/java8/src/test/java/io/cucumber/java8/AnonInnerClassStepdefs.java index ca31a61f23..f4ec246e76 100644 --- a/java8/src/test/java/io/cucumber/java8/AnonInnerClassStepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/AnonInnerClassStepdefs.java @@ -1,28 +1,19 @@ package io.cucumber.java8; -import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.stepexpression.TypeRegistry; - -import java.util.function.Function; - import static org.junit.Assert.assertEquals; public class AnonInnerClassStepdefs implements LambdaGlue { public AnonInnerClassStepdefs() { - Java8Backend.INSTANCE.get().addStepDefinition(new Function() { - @Override - public StepDefinition apply(TypeRegistry typeRegistry) { - return Java8StepDefinition.create( - "I have {int} java7 beans in my {word}", StepdefBody.A2.class, - new StepdefBody.A2() { - @Override - public void accept(Integer cukes, String what) throws Throwable { - assertEquals(42, cukes.intValue()); - assertEquals("belly", what); - } - }, typeRegistry); - } - }); + Java8Backend.INSTANCE.get().addStepDefinition( + Java8StepDefinition.create( + "I have {int} java7 beans in my {word}", StepdefBody.A2.class, + new StepdefBody.A2() { + @Override + public void accept(Integer cukes, String what) throws Throwable { + assertEquals(42, cukes.intValue()); + assertEquals("belly", what); + } + })); } } diff --git a/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java b/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java index 6979183dcc..26ccb14129 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8AnonInnerClassStepDefinitionTest.java @@ -1,27 +1,23 @@ package io.cucumber.java8; -import static org.junit.Assert.assertEquals; - -import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Test; import java.util.List; -import java.util.Locale; -public class Java8AnonInnerClassStepDefinitionTest { +import static org.junit.Assert.assertEquals; - private final TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); +public class Java8AnonInnerClassStepDefinitionTest { @Test public void should_calculate_parameters_count_from_body_with_one_param() { - Java8StepDefinition java8StepDefinition = Java8StepDefinition.create("I have some step", StepdefBody.A1.class, oneParamStep(), typeRegistry); - assertEquals(Integer.valueOf(1), java8StepDefinition.getParameterCount()); + Java8StepDefinition java8StepDefinition = Java8StepDefinition.create("I have some step", StepdefBody.A1.class, oneParamStep()); + assertEquals(1, java8StepDefinition.parameterInfos().size()); } @Test public void should_calculate_parameters_count_from_body_with_two_params() { - Java8StepDefinition java8StepDefinition = Java8StepDefinition.create("I have some step", StepdefBody.A2.class, twoParamStep(), typeRegistry); - assertEquals(Integer.valueOf(2), java8StepDefinition.getParameterCount()); + Java8StepDefinition java8StepDefinition = Java8StepDefinition.create("I have some step", StepdefBody.A2.class, twoParamStep()); + assertEquals(2, java8StepDefinition.parameterInfos().size()); } private StepdefBody.A1 oneParamStep() { diff --git a/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java index c45a871f9c..39263936c5 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionMarksCorrectStackElementTest.java @@ -1,18 +1,12 @@ package io.cucumber.java8; -import io.cucumber.core.stepexpression.TypeRegistry; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.java8.En; import org.hamcrest.CustomTypeSafeMatcher; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import java.util.function.Function; - -import static java.util.Locale.ENGLISH; - public class Java8LambdaStepDefinitionMarksCorrectStackElementTest { @Rule @@ -48,8 +42,8 @@ private class MyLambdaGlueRegistry implements LambdaGlueRegistry { private StepDefinition stepDefinition; @Override - public void addStepDefinition(Function stepDefinitionFunction) { - stepDefinition = stepDefinitionFunction.apply(new TypeRegistry(ENGLISH)); + public void addStepDefinition(StepDefinition stepDefinition) { + this.stepDefinition = stepDefinition; } @Override diff --git a/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java index ad1bd70c9f..ea62a54e0a 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8LambdaStepDefinitionTest.java @@ -1,83 +1,60 @@ package io.cucumber.java8; -import gherkin.pickles.PickleCell; -import gherkin.pickles.PickleRow; -import gherkin.pickles.PickleStep; -import gherkin.pickles.PickleString; -import gherkin.pickles.PickleTable; -import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.stepexpression.Argument; -import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.datatable.DataTable; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import java.util.List; -import java.util.Locale; -import static java.util.Collections.emptyList; -import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; public class Java8LambdaStepDefinitionTest { - private final TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); + @Rule + public ExpectedException expectedException = ExpectedException.none(); @Test public void should_calculate_parameters_count_from_body_with_one_param() { StepdefBody.A1 body = p1 -> { }; - Java8StepDefinition def = Java8StepDefinition.create("I have some step", StepdefBody.A1.class, body, typeRegistry); - assertEquals(Integer.valueOf(1), def.getParameterCount()); + Java8StepDefinition stepDefinition = Java8StepDefinition.create("some step", StepdefBody.A1.class, body); + assertEquals(1, stepDefinition.parameterInfos().size()); } @Test public void should_calculate_parameters_count_from_body_with_two_params() { StepdefBody.A2 body = (p1, p2) -> { }; - Java8StepDefinition def = Java8StepDefinition.create("I have some step", StepdefBody.A2.class, body, typeRegistry); - assertEquals(Integer.valueOf(2), def.getParameterCount()); + Java8StepDefinition stepDefinition = Java8StepDefinition.create("some step", StepdefBody.A2.class, body); + assertEquals(2, stepDefinition.parameterInfos().size()); } @Test - public void should_apply_identity_transform_to_doc_string_when_target_type_is_object() { + public void should_resolve_type_to_object() { StepdefBody.A1 body = (p1) -> { }; - Java8StepDefinition def = Java8StepDefinition.create("I have some step", StepdefBody.A1.class, body, typeRegistry); - PickleString pickleString = new PickleString(null, "content", "text"); - List arguments = def.matchedArguments(new PickleStep("I have some step", singletonList(pickleString), emptyList())); - assertEquals("content", arguments.get(0).getValue()); - } + Java8StepDefinition stepDefinition = Java8StepDefinition.create("some step", StepdefBody.A1.class, body); - @Test - public void should_apply_identity_transform_to_data_table_when_target_type_is_object() { - StepdefBody.A1 body = (p1) -> { - }; - Java8StepDefinition def = Java8StepDefinition.create("I have some step", StepdefBody.A1.class, body, typeRegistry); - PickleTable table = new PickleTable(singletonList(new PickleRow(singletonList(new PickleCell(null, "content"))))); - List arguments = def.matchedArguments(new PickleStep("I have some step", singletonList(table), emptyList())); - assertEquals(DataTable.create(singletonList(singletonList("content"))), arguments.get(0).getValue()); + assertEquals(Object.class, stepDefinition.parameterInfos().get(0).getType()); } - @Test public void should_fail_for_param_with_non_generic_list() { - try { - StepdefBody.A1 body = p1 -> { - }; - Java8StepDefinition.create("I have some step", StepdefBody.A1.class, body, typeRegistry); - } catch (CucumberException expected) { - assertEquals("Can't use java.util.List in lambda step definition. Declare a DataTable argument instead and convert manually with asList/asLists/asMap/asMaps", expected.getMessage()); - } + expectedException.expectMessage("Can't use java.util.List in lambda step definition \"some step\". Declare a DataTable argument instead and convert manually with asList/asLists/asMap/asMaps"); + + StepdefBody.A1 body = p1 -> { + }; + Java8StepDefinition stepDefinition = Java8StepDefinition.create("some step", StepdefBody.A1.class, body); + stepDefinition.parameterInfos().get(0).getTypeResolver().resolve(); } @Test public void should_fail_for_param_with_generic_list() { - try { - StepdefBody.A1> body = p1 -> { - }; - Java8StepDefinition.create("I have some step", StepdefBody.A1.class, body, typeRegistry); - } catch (CucumberException expected) { - assertEquals("Can't use java.util.List in lambda step definition. Declare a DataTable argument instead and convert manually with asList/asLists/asMap/asMaps", expected.getMessage()); - } + expectedException.expectMessage("Can't use java.util.List in lambda step definition \"some step\". Declare a DataTable argument instead and convert manually with asList/asLists/asMap/asMaps"); + + StepdefBody.A1> body = p1 -> { + }; + Java8StepDefinition stepDefinition = Java8StepDefinition.create("some step", StepdefBody.A1.class, body); + stepDefinition.parameterInfos().get(0).getTypeResolver().resolve(); } } diff --git a/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java b/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java index 2070dc0313..a8e3996463 100644 --- a/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java +++ b/testng/src/test/java/io/cucumber/testng/StubBackendProviderService.java @@ -1,16 +1,15 @@ package io.cucumber.testng; -import gherkin.pickles.PickleStep; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.BackendProviderService; import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.Lookup; +import io.cucumber.core.backend.ParameterInfo; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.snippets.Snippet; -import io.cucumber.core.stepexpression.Argument; import java.lang.reflect.Type; import java.net.URI; @@ -36,34 +35,25 @@ private static class StubBackend implements Backend { @Override public void loadGlue(Glue glue, List gluePaths) { - glue.addStepDefinition(t -> createStepDefinition("background step")); - glue.addStepDefinition(t -> createStepDefinition("scenario name")); - glue.addStepDefinition(t -> createStepDefinition("scenario C")); - glue.addStepDefinition(t -> createStepDefinition("scenario D")); - glue.addStepDefinition(t -> createStepDefinition("scenario E")); - glue.addStepDefinition(t -> createStepDefinition("first step")); - glue.addStepDefinition(t -> createStepDefinition("second step")); - glue.addStepDefinition(t -> createStepDefinition("third step")); + glue.addStepDefinition(createStepDefinition("background step")); + glue.addStepDefinition(createStepDefinition("scenario name")); + glue.addStepDefinition(createStepDefinition("scenario C")); + glue.addStepDefinition(createStepDefinition("scenario D")); + glue.addStepDefinition(createStepDefinition("scenario E")); + glue.addStepDefinition(createStepDefinition("first step")); + glue.addStepDefinition(createStepDefinition("second step")); + glue.addStepDefinition(createStepDefinition("third step")); } private StepDefinition createStepDefinition(final String pattern) { return new StepDefinition() { - @Override - public List matchedArguments(PickleStep step) { - return pattern.equals(step.getText()) ? Collections.emptyList() : null; - } @Override public String getLocation(boolean detail) { return null; } - @Override - public Integer getParameterCount() { - return 0; - } - @Override public void execute(Object[] args) { @@ -74,6 +64,11 @@ public boolean isDefinedAt(StackTraceElement stackTraceElement) { return false; } + @Override + public List parameterInfos() { + return Collections.emptyList(); + } + @Override public String getPattern() { return pattern; From 0e41a1a40248adb2a5307857fe751813d99c9809 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 21 Jul 2019 12:43:33 +0200 Subject: [PATCH 124/155] [JUnit] Report failures that occur prior to pickle execution An exception may be thrown while the `PickleRunner` is setting up the `Runner` class due to, for example, duplicate step definitions, glue scanning failures, ect. These failures do not clearly show up in IDEA or Eclipse because Cucumber does not emit the right events to JUnit. And it is not possible to emit these events from the `JUnitReporter`. These exceptions happen before the system is ready to report. ```java @Override public void run(final RunNotifier notifier) { // Possibly invoked by a thread other then the creating thread Runner runner = runnerSupplier.get(); // <---- Exception is thrown here JUnitReporter jUnitReporter = new JUnitReporter(runner.getBus(), jUnitOptions); jUnitReporter.startExecutionUnit(this, notifier); runner.runPickle(pickleEvent); jUnitReporter.finishExecutionUnit(); } ``` As such the `FeatureRunner` should catch any exceptions thrown while executing its children and request JUnit to stop execution in case of a failure. This will allow IDEA and Eclipse to properly report on the test failure. --- .../java/io/cucumber/junit/FeatureRunner.java | 19 ++++++-- .../io/cucumber/junit/FeatureRunnerTest.java | 47 ++++++++++++++++--- 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/junit/src/main/java/io/cucumber/junit/FeatureRunner.java b/junit/src/main/java/io/cucumber/junit/FeatureRunner.java index 4879ee1626..54ca24f9b2 100644 --- a/junit/src/main/java/io/cucumber/junit/FeatureRunner.java +++ b/junit/src/main/java/io/cucumber/junit/FeatureRunner.java @@ -3,11 +3,12 @@ import gherkin.ast.Feature; import gherkin.events.PickleEvent; import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.feature.CucumberFeature; import io.cucumber.core.filter.Filters; +import io.cucumber.core.runtime.RunnerSupplier; import io.cucumber.junit.PickleRunners.PickleRunner; -import io.cucumber.core.feature.CucumberFeature; -import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import org.junit.runner.Description; +import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; import org.junit.runners.ParentRunner; import org.junit.runners.model.InitializationError; @@ -26,7 +27,7 @@ final class FeatureRunner extends ParentRunner { private final CucumberFeature cucumberFeature; private Description description; - FeatureRunner(CucumberFeature cucumberFeature, Filters filters, ThreadLocalRunnerSupplier runnerSupplier, JUnitOptions jUnitOptions) throws InitializationError { + FeatureRunner(CucumberFeature cucumberFeature, Filters filters, RunnerSupplier runnerSupplier, JUnitOptions jUnitOptions) throws InitializationError { super(null); this.cucumberFeature = cucumberFeature; buildFeatureElementRunners(filters, runnerSupplier, jUnitOptions); @@ -65,10 +66,18 @@ protected Description describeChild(PickleRunner child) { @Override protected void runChild(PickleRunner child, RunNotifier notifier) { - child.run(notifier); + notifier.fireTestStarted(getDescription()); + try { + child.run(notifier); + } catch (Throwable e) { + notifier.fireTestFailure(new Failure(getDescription(), e)); + notifier.pleaseStop(); + } finally { + notifier.fireTestFinished(getDescription()); + } } - private void buildFeatureElementRunners(Filters filters, ThreadLocalRunnerSupplier runnerSupplier, JUnitOptions jUnitOptions) { + private void buildFeatureElementRunners(Filters filters, RunnerSupplier runnerSupplier, JUnitOptions jUnitOptions) { for (PickleEvent pickleEvent : cucumberFeature.getPickles()) { if (filters.matchesFilters(pickleEvent)) { try { diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index 71d9d92317..857fa645e5 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -1,24 +1,27 @@ package io.cucumber.junit; import io.cucumber.core.backend.ObjectFactoryServiceLoader; +import io.cucumber.core.eventbus.EventBus; +import io.cucumber.core.feature.CucumberFeature; +import io.cucumber.core.filter.Filters; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runtime.BackendSupplier; import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; import io.cucumber.core.runtime.ObjectFactorySupplier; +import io.cucumber.core.runtime.RunnerSupplier; import io.cucumber.core.runtime.SingletonObjectFactorySupplier; -import io.cucumber.core.runtime.TimeServiceEventBus; -import io.cucumber.core.eventbus.EventBus; -import io.cucumber.core.runtime.BackendSupplier; -import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; -import io.cucumber.core.filter.Filters; -import io.cucumber.core.feature.CucumberFeature; +import io.cucumber.core.runtime.TimeServiceEventBus; import org.junit.Test; import org.junit.runner.Description; +import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; import org.junit.runners.model.InitializationError; +import org.mockito.ArgumentCaptor; import org.mockito.InOrder; import java.time.Clock; @@ -344,5 +347,37 @@ public void step_notification_can_be_turned_on_two_scenarios_with_background() t order.verify(notifier).fireTestFinished(argThat(new DescriptionMatcher("scenario_2 name"))); } + @Test + public void should_notify_of_failure_to_create_runners_and_request_test_execution_to_stop() throws InitializationError { + CucumberFeature feature = TestPickleBuilder.parseFeature("path/test.feature", "" + + "Feature: feature name\n" + + " Scenario: scenario_1 name\n" + + " Given first step\n" + ); + + Filters filters = new Filters(RuntimeOptions.defaultOptions()); + + IllegalStateException illegalStateException = new IllegalStateException(); + RunnerSupplier runnerSupplier = () -> { + throw illegalStateException; + }; + + FeatureRunner featureRunner = new FeatureRunner(feature, filters, runnerSupplier, new JUnitOptions()); + + RunNotifier notifier = mock(RunNotifier.class); + featureRunner.runChild(featureRunner.getChildren().get(0), notifier); + + Description description = featureRunner.getDescription(); + ArgumentCaptor failureArgumentCaptor = ArgumentCaptor.forClass(Failure.class); + + InOrder order = inOrder(notifier); + order.verify(notifier).fireTestStarted(description); + order.verify(notifier).fireTestFailure(failureArgumentCaptor.capture()); + assertEquals(illegalStateException, failureArgumentCaptor.getValue().getException()); + assertEquals(description, failureArgumentCaptor.getValue().getDescription()); + order.verify(notifier).pleaseStop(); + order.verify(notifier).fireTestFinished(description); + } + } From f7c28214d59231d46e161a9d76a4bd4cbbfffffa Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 30 Jun 2019 13:56:49 +0200 Subject: [PATCH 125/155] [Core] Allow parameter types access to test context --- .../java/io/cucumber/core/backend/Glue.java | 2 + .../core/backend/ParameterTypeDefinition.java | 11 +++ .../io/cucumber/core/runner/CachingGlue.java | 24 ++++++- .../java/io/cucumber/core/runner/Runner.java | 2 + .../cucumber/core/runner/CachingGlueTest.java | 9 +++ .../examples/java/DateCalculator.java | 10 +-- .../cucumber/examples/java/DateStepdefs.java | 16 +++-- .../java/io/cucumber/java/JavaBackend.java | 7 ++ .../java/JavaParameterTypeDefinition.java | 69 +++++++++++++++++++ .../java/io/cucumber/java/MethodScanner.java | 6 +- .../java/io/cucumber/java/ParameterType.java | 22 ++++++ 11 files changed, 161 insertions(+), 17 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/backend/ParameterTypeDefinition.java create mode 100644 java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java create mode 100644 java/src/main/java/io/cucumber/java/ParameterType.java diff --git a/core/src/main/java/io/cucumber/core/backend/Glue.java b/core/src/main/java/io/cucumber/core/backend/Glue.java index b47cafd635..48093680d7 100644 --- a/core/src/main/java/io/cucumber/core/backend/Glue.java +++ b/core/src/main/java/io/cucumber/core/backend/Glue.java @@ -15,4 +15,6 @@ public interface Glue { void addAfterStepHook(HookDefinition hookDefinition); + void addParameterType(ParameterTypeDefinition parameterTypeDefinition); + } diff --git a/core/src/main/java/io/cucumber/core/backend/ParameterTypeDefinition.java b/core/src/main/java/io/cucumber/core/backend/ParameterTypeDefinition.java new file mode 100644 index 0000000000..bc7da3213f --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/ParameterTypeDefinition.java @@ -0,0 +1,11 @@ +package io.cucumber.core.backend; + +import io.cucumber.cucumberexpressions.ParameterType; +import org.apiguardian.api.API; + +@API(status = API.Status.EXPERIMENTAL) +public interface ParameterTypeDefinition { + + ParameterType parameterType(); + +} diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 0ccdc284a0..97c6dca8fe 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -1,5 +1,7 @@ package io.cucumber.core.runner; +import io.cucumber.core.backend.ParameterTypeDefinition; +import io.cucumber.core.event.StepDefinedEvent; import gherkin.pickles.PickleStep; import io.cucumber.core.backend.DuplicateStepDefinitionException; import io.cucumber.core.backend.Glue; @@ -16,6 +18,7 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.function.Function; final class CachingGlue implements Glue { private static final HookComparator ASCENDING = new HookComparator(true); @@ -26,6 +29,7 @@ final class CachingGlue implements Glue { final List beforeStepHooks = new ArrayList<>(); final List afterHooks = new ArrayList<>(); final List afterStepHooks = new ArrayList<>(); + final List> stepDefinitionFunctions = new ArrayList<>(); private final EventBus bus; private final TypeRegistry typeRegistry; @@ -36,9 +40,18 @@ final class CachingGlue implements Glue { } @Override - public void addStepDefinition(StepDefinition stepDefinition) { - CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stepDefinition, typeRegistry); - CoreStepDefinition previous = stepDefinitionsByPattern.get(coreStepDefinition.getPattern()); + public void addStepDefinition(Function stepDefinitionFunction) { + stepDefinitionFunctions.add(stepDefinitionFunction); + } + + void applyStepDefinitions() { + stepDefinitionFunctions.forEach(this::applyStepDefinition); + stepDefinitionFunctions.clear(); + } + + private void applyStepDefinition(Function stepDefinitionFunction) { + StepDefinition stepDefinition = stepDefinitionFunction.apply(typeRegistry); + StepDefinition previous = stepDefinitionsByPattern.get(stepDefinition.getPattern()); if (previous != null) { throw new DuplicateStepDefinitionException(previous.getStepDefinition(), stepDefinition); } @@ -70,6 +83,11 @@ public void addAfterStepHook(HookDefinition hookDefinition) { afterStepHooks.sort(DESCENDING); } + @Override + public void addParameterType(ParameterTypeDefinition parameterTypeDefinition) { + typeRegistry.defineParameterType(parameterTypeDefinition.parameterType()); + } + List getBeforeHooks() { return new ArrayList<>(beforeHooks); } diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index 79562fef48..de3a5911f9 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -48,6 +48,7 @@ public Runner(EventBus bus, Collection backends, ObjectFactor for (Backend backend : backends) { log.debug("Loading glue for backend " + backend.getClass().getName()); backend.loadGlue(this.glue, gluePaths); + glue.applyStepDefinitions(); } } @@ -143,6 +144,7 @@ private void buildBackendWorlds() { for (Backend backend : backends) { backend.buildWorld(); } + glue.applyStepDefinitions(); } private void disposeBackendWorlds() { diff --git a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index dcd9fbed84..f0ec469d2a 100644 --- a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -50,6 +50,7 @@ public void throws_duplicate_error_on_dupe_stepdefs() { when(b.getLocation(true)).thenReturn("bar.bf:90"); try { glue.addStepDefinition(b); + glue.applyStepDefinitions(); fail("should have failed"); } catch (DuplicateStepDefinitionException expected) { assertEquals("Duplicate step definitions in foo.bf:10 and bar.bf:90", expected.getMessage()); @@ -65,6 +66,7 @@ public void removes_glue_that_is_scenario_scoped() { StepDefinition sd = spy(new MockedScenarioScopedStepDefinition()); when(sd.getPattern()).thenReturn("pattern"); glue.addStepDefinition(sd); + glue.applyStepDefinitions(); HookDefinition bh = spy(new MockedScenarioScopedHookDefinition()); glue.addBeforeHook(bh); @@ -87,6 +89,8 @@ public void removes_glue_that_is_scenario_scoped() { public void removes_scenario_scoped_cache_entries() { StepDefinition sd = new MockedScenarioScopedStepDefinition("pattern"); glue.addStepDefinition(sd); + glue.applyStepDefinitions(); + String featurePath = "someFeature.feature"; String stepText = "pattern"; @@ -106,6 +110,7 @@ public void removes_scenario_scoped_cache_entries() { public void returns_null_if_no_matching_steps_found() { StepDefinition stepDefinition = spy(new MockedStepDefinition("pattern1")); glue.addStepDefinition(stepDefinition); + glue.applyStepDefinitions(); String featurePath = "someFeature.feature"; PickleStep pickleStep = getPickleStep("pattern"); @@ -118,6 +123,7 @@ public void returns_match_from_cache_if_single_found() { StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); glue.addStepDefinition(stepDefinition1); glue.addStepDefinition(stepDefinition2); + glue.applyStepDefinitions(); String featurePath = "someFeature.feature"; String stepText = "pattern1"; @@ -144,6 +150,7 @@ public void returns_match_from_cache_for_step_with_table() { StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); glue.addStepDefinition(stepDefinition1); glue.addStepDefinition(stepDefinition2); + glue.applyStepDefinitions(); String featurePath = "someFeature.feature"; String stepText = "pattern1"; @@ -174,6 +181,7 @@ public void returns_match_from_cache_for_ste_with_doc_string() { StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); glue.addStepDefinition(stepDefinition1); glue.addStepDefinition(stepDefinition2); + glue.applyStepDefinitions(); String featurePath = "someFeature.feature"; String stepText = "pattern1"; @@ -217,6 +225,7 @@ public void throws_ambiguous_steps_def_exception_when_many_patterns_match() { glue.addStepDefinition(stepDefinition1); glue.addStepDefinition(stepDefinition2); glue.addStepDefinition(stepDefinition3); + glue.applyStepDefinitions(); String featurePath = "someFeature.feature"; checkAmbiguousCalled(featurePath); diff --git a/examples/java-calculator/src/main/java/io/cucumber/examples/java/DateCalculator.java b/examples/java-calculator/src/main/java/io/cucumber/examples/java/DateCalculator.java index c5719987ec..ecd2f98e6b 100644 --- a/examples/java-calculator/src/main/java/io/cucumber/examples/java/DateCalculator.java +++ b/examples/java-calculator/src/main/java/io/cucumber/examples/java/DateCalculator.java @@ -1,15 +1,15 @@ package io.cucumber.examples.java; -import java.util.Date; +import java.time.LocalDate; public class DateCalculator { - private Date now; + private LocalDate now; - public DateCalculator(Date now) { + public DateCalculator(LocalDate now) { this.now = now; } - public String isDateInThePast(Date date) { - return (date.before(now)) ? "yes" : "no"; + public String isDateInThePast(LocalDate date) { + return (date.isBefore(now)) ? "yes" : "no"; } } diff --git a/examples/java-calculator/src/test/java/io/cucumber/examples/java/DateStepdefs.java b/examples/java-calculator/src/test/java/io/cucumber/examples/java/DateStepdefs.java index 469a8bb059..8c6a2473ad 100644 --- a/examples/java-calculator/src/test/java/io/cucumber/examples/java/DateStepdefs.java +++ b/examples/java-calculator/src/test/java/io/cucumber/examples/java/DateStepdefs.java @@ -1,10 +1,11 @@ package io.cucumber.examples.java; +import io.cucumber.java.ParameterType; import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; -import java.util.Date; +import java.time.LocalDate; import static org.junit.Assert.assertEquals; @@ -12,13 +13,18 @@ public class DateStepdefs { private String result; private DateCalculator calculator; - @Given("^today is ([0-9]{4}-[0-9]{2}-[0-9]{2})$") - public void today_is(Date date) { + @ParameterType("([0-9]{4})-([0-9]{2})-([0-9]{2})") + public LocalDate iso8601Date(String year, String month, String day){ + return LocalDate.of(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day)); + } + + @Given("today is {iso8601Date}") + public void today_is(LocalDate date) { calculator = new DateCalculator(date); } - @When("^I ask if ([0-9]{4}-[0-9]{2}-[0-9]{2}) is in the past$") - public void I_ask_if_date_is_in_the_past(Date date) { + @When("I ask if {iso8601Date} is in the past") + public void I_ask_if_date_is_in_the_past(LocalDate date) { result = calculator.isDateInThePast(date); } diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index b32204d823..945128dcdd 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -87,6 +87,13 @@ void addHook(Annotation annotation, Method method) { String tagExpression = afterStep.value(); long timeout = afterStep.timeout(); glue.addAfterStepHook(new JavaHookDefinition(method, tagExpression, afterStep.order(), timeout, lookup)); + } else if (annotation.annotationType().equals(ParameterType.class)) { + ParameterType parameterType = (ParameterType) annotation; + String pattern = parameterType.value(); + String name = parameterType.name(); + boolean useForSnippets = parameterType.useForSnippets(); + boolean preferForRegexMatch = parameterType.preferForRegexMatch(); + glue.addParameterType(new JavaParameterTypeDefinition(name, pattern, method, useForSnippets, preferForRegexMatch, lookup)); } } } diff --git a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java new file mode 100644 index 0000000000..847ab8061b --- /dev/null +++ b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java @@ -0,0 +1,69 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.Lookup; +import io.cucumber.core.backend.ParameterTypeDefinition; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.runtime.Invoker; +import io.cucumber.cucumberexpressions.ParameterType; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; + +public class JavaParameterTypeDefinition implements ParameterTypeDefinition { + + private final String name; + private final List patterns; + private final Method method; + + private final Lookup lookup; + private final boolean preferForRegexpMatch; + private final boolean useForSnippets; + + JavaParameterTypeDefinition(String name, String pattern, Method method, boolean useForSnippets, boolean preferForRegexpMatch, Lookup lookup) { + this.name = name.isEmpty() ? method.getName() : name; + this.patterns = Collections.singletonList(pattern); + this.method = requireValidMethod(method); + this.lookup = lookup; + this.useForSnippets = useForSnippets; + this.preferForRegexpMatch = preferForRegexpMatch; + } + + private Method requireValidMethod(Method method) { + Class returnType = method.getReturnType(); + if (Void.class.equals(returnType)) { + throw new CucumberException("TODO"); + } + + Class[] parameterTypes = method.getParameterTypes(); + if (parameterTypes.length < 1) { + throw new CucumberException("TODO"); + } + + for (int i = 0; i < parameterTypes.length; i++) { + Class parameterType = parameterTypes[i]; + if (!String.class.equals(parameterType)) { + throw new CucumberException("TODO" + i); + } + } + + return method; + } + + @Override + public ParameterType parameterType() { + return new ParameterType<>( + name, + patterns, + method.getReturnType(), + this::execute, + useForSnippets, + preferForRegexpMatch + ); + } + + private Object execute(Object[] args) throws Throwable { + return Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, 0, args); + } + +} diff --git a/java/src/main/java/io/cucumber/java/MethodScanner.java b/java/src/main/java/io/cucumber/java/MethodScanner.java index 6fa06c90f3..2f7522385b 100644 --- a/java/src/main/java/io/cucumber/java/MethodScanner.java +++ b/java/src/main/java/io/cucumber/java/MethodScanner.java @@ -83,10 +83,8 @@ private boolean isHookAnnotation(Annotation annotation) { || annotationClass.equals(After.class) || annotationClass.equals(BeforeStep.class) || annotationClass.equals(AfterStep.class) - || annotationClass.equals(io.cucumber.java.Before.class) - || annotationClass.equals(io.cucumber.java.After.class) - || annotationClass.equals(io.cucumber.java.BeforeStep.class) - || annotationClass.equals(io.cucumber.java.AfterStep.class); + || annotationClass.equals(ParameterType.class) + ; } private boolean isStepdefAnnotation(Annotation annotation) { diff --git a/java/src/main/java/io/cucumber/java/ParameterType.java b/java/src/main/java/io/cucumber/java/ParameterType.java new file mode 100644 index 0000000000..4064f561a3 --- /dev/null +++ b/java/src/main/java/io/cucumber/java/ParameterType.java @@ -0,0 +1,22 @@ +package io.cucumber.java; + +import org.apiguardian.api.API; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@API(status = API.Status.STABLE) +public @interface ParameterType { + + String value(); + + String name() default ""; + + boolean preferForRegexMatch() default false; + + boolean useForSnippets() default false; +} From 553b3533d12a873c7009b0746804a45120c3d09c Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 6 Jul 2019 22:44:43 +0200 Subject: [PATCH 126/155] [Java] Add DataTableTypeDefinition --- .../backend/DataTableTypeTypeDefinition.java | 11 ++ .../java/io/cucumber/core/backend/Glue.java | 2 + .../io/cucumber/core/runner/CachingGlue.java | 8 +- .../java/io/cucumber/core/runner/Runner.java | 15 ++- .../java/io/cucumber/java/DataTableType.java | 23 ++++ .../java/io/cucumber/java/JavaBackend.java | 2 + .../java/JavaDataTableTypeDefinition.java | 122 ++++++++++++++++++ .../java/JavaParameterTypeDefinition.java | 48 +++---- .../java/io/cucumber/java/MethodScanner.java | 1 + .../java/io/cucumber/java/ParameterType.java | 6 + .../{Authors.java => DataTableStepdefs.java} | 64 +++++++-- .../annotation/ParameterTypeStepdefs.java | 28 ++++ .../io/cucumber/java/annotation/Stepdefs.java | 10 +- .../annotation/TypeRegistryConfiguration.java | 60 +++++---- .../{authors.feature => data-table.feature} | 13 +- .../java/annotation/parameter-types.feature | 7 + .../java/annotation/table_conversion.feature | 7 - 17 files changed, 340 insertions(+), 87 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/backend/DataTableTypeTypeDefinition.java create mode 100644 java/src/main/java/io/cucumber/java/DataTableType.java create mode 100644 java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java rename java/src/test/java/io/cucumber/java/annotation/{Authors.java => DataTableStepdefs.java} (51%) create mode 100644 java/src/test/java/io/cucumber/java/annotation/ParameterTypeStepdefs.java rename java/src/test/resources/io/cucumber/java/annotation/{authors.feature => data-table.feature} (63%) create mode 100644 java/src/test/resources/io/cucumber/java/annotation/parameter-types.feature delete mode 100644 java/src/test/resources/io/cucumber/java/annotation/table_conversion.feature diff --git a/core/src/main/java/io/cucumber/core/backend/DataTableTypeTypeDefinition.java b/core/src/main/java/io/cucumber/core/backend/DataTableTypeTypeDefinition.java new file mode 100644 index 0000000000..42ee8b1234 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/DataTableTypeTypeDefinition.java @@ -0,0 +1,11 @@ +package io.cucumber.core.backend; + +import io.cucumber.datatable.DataTableType; +import org.apiguardian.api.API; + +@API(status = API.Status.EXPERIMENTAL) +public interface DataTableTypeTypeDefinition { + + DataTableType dataTableType(); + +} diff --git a/core/src/main/java/io/cucumber/core/backend/Glue.java b/core/src/main/java/io/cucumber/core/backend/Glue.java index 48093680d7..b41228c36a 100644 --- a/core/src/main/java/io/cucumber/core/backend/Glue.java +++ b/core/src/main/java/io/cucumber/core/backend/Glue.java @@ -17,4 +17,6 @@ public interface Glue { void addParameterType(ParameterTypeDefinition parameterTypeDefinition); + void addDataTableType(DataTableTypeTypeDefinition dataTableTypeTypeDefinition); + } diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 97c6dca8fe..717c0ff23e 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -1,5 +1,6 @@ package io.cucumber.core.runner; +import io.cucumber.core.backend.DataTableTypeTypeDefinition; import io.cucumber.core.backend.ParameterTypeDefinition; import io.cucumber.core.event.StepDefinedEvent; import gherkin.pickles.PickleStep; @@ -88,6 +89,11 @@ public void addParameterType(ParameterTypeDefinition parameterTypeDefinition) { typeRegistry.defineParameterType(parameterTypeDefinition.parameterType()); } + @Override + public void addDataTableType(DataTableTypeTypeDefinition dataTableTypeTypeDefinition) { + typeRegistry.defineDataTableType(dataTableTypeTypeDefinition.dataTableType()); + } + List getBeforeHooks() { return new ArrayList<>(beforeHooks); } @@ -133,7 +139,7 @@ PickleStepDefinitionMatch stepDefinitionMatch(String featurePath, PickleStep ste } private List stepDefinitionMatches(String featurePath, PickleStep step) { - List result = new ArrayList(); + List result = new ArrayList<>(); for (CoreStepDefinition stepDefinition : stepDefinitionsByPattern.values()) { List arguments = stepDefinition.matchedArguments(step); if (arguments != null) { diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index de3a5911f9..80e5c1848b 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -1,13 +1,13 @@ package io.cucumber.core.runner; -import io.cucumber.core.event.HookType; -import io.cucumber.core.event.SnippetsSuggestedEvent; import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.event.HookType; +import io.cucumber.core.event.SnippetsSuggestedEvent; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.logging.Logger; import io.cucumber.core.logging.LoggerFactory; @@ -57,10 +57,13 @@ public EventBus getBus() { } public void runPickle(PickleEvent pickle) { - buildBackendWorlds(); // Java8 step definitions will be added to the glue here - TestCase testCase = createTestCaseForPickle(pickle); - testCase.run(bus); - disposeBackendWorlds(); + try { + buildBackendWorlds(); // Java8 step definitions will be added to the glue here + TestCase testCase = createTestCaseForPickle(pickle); + testCase.run(bus); + } finally { + disposeBackendWorlds(); + } } private TestCase createTestCaseForPickle(PickleEvent pickleEvent) { diff --git a/java/src/main/java/io/cucumber/java/DataTableType.java b/java/src/main/java/io/cucumber/java/DataTableType.java new file mode 100644 index 0000000000..b705e00fd0 --- /dev/null +++ b/java/src/main/java/io/cucumber/java/DataTableType.java @@ -0,0 +1,23 @@ +package io.cucumber.java; + +import org.apiguardian.api.API; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Allows a DataTableType to be registered. + * + * Supports TableCellTransformer: String -> T + * Supports TableEntryTransformer: Map -> T + * Supports TableRowTransformer: List -> T + * Supports TableTransformer: DataTable -> T + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@API(status = API.Status.STABLE) +public @interface DataTableType { + +} diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 945128dcdd..228161794d 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -94,6 +94,8 @@ void addHook(Annotation annotation, Method method) { boolean useForSnippets = parameterType.useForSnippets(); boolean preferForRegexMatch = parameterType.preferForRegexMatch(); glue.addParameterType(new JavaParameterTypeDefinition(name, pattern, method, useForSnippets, preferForRegexMatch, lookup)); + } else if (annotation.annotationType().equals(DataTableType.class)) { + glue.addDataTableType(new JavaDataTableTypeDefinition(method, lookup)); } } } diff --git a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java new file mode 100644 index 0000000000..d5d0e7b4d1 --- /dev/null +++ b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java @@ -0,0 +1,122 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.DataTableTypeTypeDefinition; +import io.cucumber.core.backend.Lookup; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.runtime.Invoker; +import io.cucumber.datatable.DataTable; +import io.cucumber.datatable.DataTableType; +import io.cucumber.datatable.TableCellTransformer; +import io.cucumber.datatable.TableEntryTransformer; +import io.cucumber.datatable.TableRowTransformer; +import io.cucumber.datatable.TableTransformer; + +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; + +class JavaDataTableTypeDefinition implements DataTableTypeTypeDefinition { + + private final Method method; + private final Lookup lookup; + private final DataTableType dataTableType; + + JavaDataTableTypeDefinition(Method method, Lookup lookup) { + this.method = method; + this.lookup = lookup; + this.dataTableType = createDataTableType(method); + } + + @SuppressWarnings("unchecked") + private DataTableType createDataTableType(Method method) { + Class returnType = requireValidReturnType(method); + Type parameterType = requireValidParameterType(method); + + if (DataTable.class.equals(parameterType)) { + return new DataTableType( + returnType, + (TableTransformer) this::execute + ); + } + + if (List.class.equals(parameterType)) { + return new DataTableType( + returnType, + (TableRowTransformer) this::execute + ); + } + + if (Map.class.equals(parameterType)) { + return new DataTableType( + returnType, + (TableEntryTransformer) this::execute + ); + } + + if (String.class.equals(parameterType)) { + return new DataTableType( + returnType, + (TableCellTransformer) this::execute + ); + } + + throw createInvalidSignatureException(); + + } + + private static CucumberException createInvalidSignatureException() { + return new CucumberException("" + + "A @DataTableType annotated method must have one of these signatures:\n" + + " * public Author author(DataTable table)\n" + + " * public Author author(List row)\n" + + " * public Author author(Map entry)\n" + + " * public Author author(String cell)\n" + + "Note: Author is an example of the class you want to convert the table to" + ); + } + + + private static Type requireValidParameterType(Method method) { + Type[] parameterTypes = method.getGenericParameterTypes(); + if (parameterTypes.length != 1) { + throw createInvalidSignatureException(); + } + + Type parameterType = parameterTypes[0]; + if (!(parameterType instanceof ParameterizedType)) { + return parameterType; + } + + ParameterizedType parameterizedType = (ParameterizedType) parameterType; + Type[] typeParameters = parameterizedType.getActualTypeArguments(); + for (Type typeParameter : typeParameters) { + if (!String.class.equals(typeParameter)) { + throw createInvalidSignatureException(); + } + } + + return parameterizedType.getRawType(); + } + + private static Class requireValidReturnType(Method method) { + Class returnType = method.getReturnType(); + if (Void.class.equals(returnType)) { + throw createInvalidSignatureException(); + } + return returnType; + } + + + @Override + public DataTableType dataTableType() { + return dataTableType; + } + + + private Object execute(Object arg) throws Throwable { + return Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, 0, arg); + } + +} diff --git a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java index 847ab8061b..08ad01a348 100644 --- a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java @@ -8,58 +8,60 @@ import java.lang.reflect.Method; import java.util.Collections; -import java.util.List; -public class JavaParameterTypeDefinition implements ParameterTypeDefinition { +class JavaParameterTypeDefinition implements ParameterTypeDefinition { - private final String name; - private final List patterns; private final Method method; private final Lookup lookup; - private final boolean preferForRegexpMatch; - private final boolean useForSnippets; + private final ParameterType parameterType; JavaParameterTypeDefinition(String name, String pattern, Method method, boolean useForSnippets, boolean preferForRegexpMatch, Lookup lookup) { - this.name = name.isEmpty() ? method.getName() : name; - this.patterns = Collections.singletonList(pattern); this.method = requireValidMethod(method); this.lookup = lookup; - this.useForSnippets = useForSnippets; - this.preferForRegexpMatch = preferForRegexpMatch; + this.parameterType = new ParameterType<>( + name.isEmpty() ? method.getName() : name, + Collections.singletonList(pattern), + this.method.getReturnType(), + this::execute, + useForSnippets, + preferForRegexpMatch + ); } private Method requireValidMethod(Method method) { Class returnType = method.getReturnType(); if (Void.class.equals(returnType)) { - throw new CucumberException("TODO"); + throw createInvalidSignatureException(); } Class[] parameterTypes = method.getParameterTypes(); if (parameterTypes.length < 1) { - throw new CucumberException("TODO"); + throw createInvalidSignatureException(); } - for (int i = 0; i < parameterTypes.length; i++) { - Class parameterType = parameterTypes[i]; + for (Class parameterType : parameterTypes) { if (!String.class.equals(parameterType)) { - throw new CucumberException("TODO" + i); + throw createInvalidSignatureException(); } } return method; } + private CucumberException createInvalidSignatureException() { + return new CucumberException("" + + "A @ParameterType annotated method must have one of these signatures:\n" + + " * public Author parameterName(String all)\n" + + " * public Author parameterName(String captureGroup1, String captureGroup2, ...ect )\n" + + " * public Author parameterName(String... captureGroups)\n" + + "Note: Author is an example of the class you want to convert parameter name" + ); + } + @Override public ParameterType parameterType() { - return new ParameterType<>( - name, - patterns, - method.getReturnType(), - this::execute, - useForSnippets, - preferForRegexpMatch - ); + return parameterType; } private Object execute(Object[] args) throws Throwable { diff --git a/java/src/main/java/io/cucumber/java/MethodScanner.java b/java/src/main/java/io/cucumber/java/MethodScanner.java index 2f7522385b..6ff23e92f0 100644 --- a/java/src/main/java/io/cucumber/java/MethodScanner.java +++ b/java/src/main/java/io/cucumber/java/MethodScanner.java @@ -84,6 +84,7 @@ private boolean isHookAnnotation(Annotation annotation) { || annotationClass.equals(BeforeStep.class) || annotationClass.equals(AfterStep.class) || annotationClass.equals(ParameterType.class) + || annotationClass.equals(DataTableType.class) ; } diff --git a/java/src/main/java/io/cucumber/java/ParameterType.java b/java/src/main/java/io/cucumber/java/ParameterType.java index 4064f561a3..10846c038c 100644 --- a/java/src/main/java/io/cucumber/java/ParameterType.java +++ b/java/src/main/java/io/cucumber/java/ParameterType.java @@ -7,6 +7,12 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * Defines a parameter type. + * + * Method signature must have a String argument for each capture group + * + */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @API(status = API.Status.STABLE) diff --git a/java/src/test/java/io/cucumber/java/annotation/Authors.java b/java/src/test/java/io/cucumber/java/annotation/DataTableStepdefs.java similarity index 51% rename from java/src/test/java/io/cucumber/java/annotation/Authors.java rename to java/src/test/java/io/cucumber/java/annotation/DataTableStepdefs.java index 4023b23aea..88e348376b 100644 --- a/java/src/test/java/io/cucumber/java/annotation/Authors.java +++ b/java/src/test/java/io/cucumber/java/annotation/DataTableStepdefs.java @@ -1,35 +1,40 @@ package io.cucumber.java.annotation; +import io.cucumber.java.DataTableType; import io.cucumber.java.Transpose; import io.cucumber.java.en.Given; import java.util.List; +import java.util.Map; +import java.util.Objects; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; -public class Authors { +public class DataTableStepdefs { - private final Author expected = new Author("Annie M. G.", "Schmidt", "1911-03-20"); + private final Author expectedAuthor = new Author("Annie M. G.", "Schmidt", "1911-03-20"); + private final Person expectedPerson = new Person("Astrid", "Lindgren"); @Given("a list of authors in a table") - public void aListOfAuthorsInATable(List authors) throws Throwable { - assertTrue(authors.contains(expected)); + public void aListOfAuthorsInATable(List authors) { + assertTrue(authors.contains(expectedAuthor)); } @Given("a list of authors in a transposed table") - public void aListOfAuthorsInATransposedTable(@Transpose List authors) throws Throwable { - assertTrue(authors.contains(expected)); + public void aListOfAuthorsInATransposedTable(@Transpose List authors) { + assertTrue(authors.contains(expectedAuthor)); } @Given("a single author in a table") - public void aSingleAuthorInATable(Author author) throws Throwable { - assertEquals(expected, author); + public void aSingleAuthorInATable(Author author) { + assertEquals(expectedAuthor, author); } @Given("a single author in a transposed table") - public void aSingleAuthorInATransposedTable(@Transpose Author author) throws Throwable { - assertEquals(expected, author); + public void aSingleAuthorInATransposedTable(@Transpose Author author) { + assertEquals(expectedAuthor, author); } public static class Author { @@ -72,4 +77,43 @@ public int hashCode() { return result; } } + + @Given("a list of people in a table") + public void this_table_of_authors(List persons) { + assertTrue(persons.contains(expectedPerson)); + } + + @DataTableType + public DataTableStepdefs.Person transform(Map tableEntry) { + return new Person(tableEntry.get("first"), tableEntry.get("last")); + } + + public static class Person { + private final String first; + private final String last; + + public Person(String first, String last) { + this.first = first; + this.last = last; + } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Person person = (Person) o; + return first.equals(person.first) && + last.equals(person.last); + } + + @Override + public int hashCode() { + return Objects.hash(first, last); + } + + + } + + } diff --git a/java/src/test/java/io/cucumber/java/annotation/ParameterTypeStepdefs.java b/java/src/test/java/io/cucumber/java/annotation/ParameterTypeStepdefs.java new file mode 100644 index 0000000000..461ddc5a97 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/annotation/ParameterTypeStepdefs.java @@ -0,0 +1,28 @@ +package io.cucumber.java.annotation; + +import io.cucumber.java.ParameterType; +import io.cucumber.java.en.Given; +import org.junit.jupiter.api.Assertions; + +import java.time.LocalDate; + +public class ParameterTypeStepdefs { + + private final LocalDate expected = LocalDate.of(1907, 11, 14); + + @ParameterType("([0-9]{4})-([0-9]{2})-([0-9]{2})") + public LocalDate parameterTypeIso8601Date(String year, String month, String day) { + return LocalDate.of(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day)); + } + + @Given("today is {parameterTypeIso8601Date}") + public void today_is(LocalDate date) { + + Assertions.assertEquals(expected, date); + } + + @Given("tomorrow is {parameterTypeRegistryIso8601Date}") + public void tomorrow_is(LocalDate date) { + Assertions.assertEquals(expected, date); + } +} diff --git a/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java b/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java index 6c5d99f38f..c9ccd045fb 100644 --- a/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java @@ -5,16 +5,12 @@ import java.util.List; public class Stepdefs { + @Given("I have {int} cukes in the belly") public void I_have_cukes_in_the_belly(int arg1) { } - @Given("this data table:") - public void this_data_table(List people) throws Throwable { - } - public static class Person { - String first; - String last; - } + + } diff --git a/java/src/test/java/io/cucumber/java/annotation/TypeRegistryConfiguration.java b/java/src/test/java/io/cucumber/java/annotation/TypeRegistryConfiguration.java index fd7dce76cc..5654a53328 100644 --- a/java/src/test/java/io/cucumber/java/annotation/TypeRegistryConfiguration.java +++ b/java/src/test/java/io/cucumber/java/annotation/TypeRegistryConfiguration.java @@ -1,13 +1,14 @@ package io.cucumber.java.annotation; -import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.core.api.TypeRegistry; -import io.cucumber.datatable.DataTable; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.cucumberexpressions.CaptureGroupTransformer; +import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.datatable.DataTableType; import io.cucumber.datatable.TableEntryTransformer; -import io.cucumber.java.annotation.Authors.Author; import io.cucumber.datatable.TableTransformer; +import java.time.LocalDate; import java.util.Locale; import java.util.Map; @@ -15,31 +16,24 @@ public class TypeRegistryConfiguration implements TypeRegistryConfigurer { - private final TableEntryTransformer personEntryTransformer = new TableEntryTransformer() { - @Override - public Stepdefs.Person transform(Map tableEntry) { - Stepdefs.Person person = new Stepdefs.Person(); - person.first = tableEntry.get("first"); - person.last = tableEntry.get("last"); - return person; - } - }; - private final TableEntryTransformer authorEntryTransformer = new TableEntryTransformer() { - @Override - public Author transform(Map tableEntry) { - return new Author( - tableEntry.get("firstName"), - tableEntry.get("lastName"), - tableEntry.get("birthDate")); - } - }; - private final TableTransformer singleAuthorTransformer = new TableTransformer() { - @Override - public Author transform(DataTable table) throws Throwable { + private final TableEntryTransformer authorEntryTransformer = + tableEntry -> new DataTableStepdefs.Author( + tableEntry.get("firstName"), + tableEntry.get("lastName"), + tableEntry.get("birthDate")); + + private final TableTransformer singleAuthorTransformer = + table -> { Map tableEntry = table.asMaps().get(0); return authorEntryTransformer.transform(tableEntry); - } - }; + }; + + private final CaptureGroupTransformer localDateParameterType = + (String[] args) -> LocalDate.of( + Integer.parseInt(args[0]), + Integer.parseInt(args[1]), + Integer.parseInt(args[2]) + ); @Override public Locale locale() { @@ -49,15 +43,19 @@ public Locale locale() { @Override public void configureTypeRegistry(TypeRegistry typeRegistry) { typeRegistry.defineDataTableType(new DataTableType( - Author.class, + DataTableStepdefs.Author.class, authorEntryTransformer)); typeRegistry.defineDataTableType(new DataTableType( - Author.class, + DataTableStepdefs.Author.class, singleAuthorTransformer)); - typeRegistry.defineDataTableType(new DataTableType( - Stepdefs.Person.class, - personEntryTransformer)); + + typeRegistry.defineParameterType(new ParameterType<>( + "parameterTypeRegistryIso8601Date", + "([0-9]{4})/([0-9]{2})/([0-9]{2})", + LocalDate.class, + localDateParameterType + )); } } diff --git a/java/src/test/resources/io/cucumber/java/annotation/authors.feature b/java/src/test/resources/io/cucumber/java/annotation/data-table.feature similarity index 63% rename from java/src/test/resources/io/cucumber/java/annotation/authors.feature rename to java/src/test/resources/io/cucumber/java/annotation/data-table.feature index 7b2c57d8d0..bcf1b280a6 100644 --- a/java/src/test/resources/io/cucumber/java/annotation/authors.feature +++ b/java/src/test/resources/io/cucumber/java/annotation/data-table.feature @@ -1,6 +1,6 @@ -Feature: Authors and tables +Feature: Datatable - Scenario: Some authors and tables + Scenario: Convert a table to a generic list via the ParameterTypeRegistry Given a list of authors in a table | firstName | lastName | birthDate | | Annie M. G. | Schmidt | 1911-03-20 | @@ -11,6 +11,8 @@ Feature: Authors and tables | lastName | Schmidt | Dahl | | birthDate | 1911-03-20 | 1916-09-13 | + Scenario: Convert a table to a single object via the ParameterTypeRegistry + Given a single author in a table | firstName | lastName | birthDate | | Annie M. G. | Schmidt | 1911-03-20 | @@ -20,3 +22,10 @@ Feature: Authors and tables | lastName | Schmidt | | birthDate | 1911-03-20 | + + Scenario: Convert a table to a generic list via the @DataTableType Annotation + + Given a list of people in a table + | first | last | + | Astrid | Lindgren | + | Roald | Dahl | \ No newline at end of file diff --git a/java/src/test/resources/io/cucumber/java/annotation/parameter-types.feature b/java/src/test/resources/io/cucumber/java/annotation/parameter-types.feature new file mode 100644 index 0000000000..84894790fd --- /dev/null +++ b/java/src/test/resources/io/cucumber/java/annotation/parameter-types.feature @@ -0,0 +1,7 @@ +Feature: ParameterTypes + + Scenario: Convert a parameter to date via the ParameterTypeRegistry + Given tomorrow is 1907/11/14 + + Scenario: Convert a parameter to date via the @ParameterType Annotation + Given today is 1907-11-14 diff --git a/java/src/test/resources/io/cucumber/java/annotation/table_conversion.feature b/java/src/test/resources/io/cucumber/java/annotation/table_conversion.feature deleted file mode 100644 index 7a4881ae4b..0000000000 --- a/java/src/test/resources/io/cucumber/java/annotation/table_conversion.feature +++ /dev/null @@ -1,7 +0,0 @@ -Feature: Table Conversion - - Scenario: use a table - Given this data table: - | first | last | - | Aslak | Hellesøy | - | Donald | Duck | From bfef3a61b19f5155a07541a72f6f4870128df8da Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 16 Jul 2019 09:05:28 +0200 Subject: [PATCH 127/155] [Core] Use new TypeRegistry for each Scenario --- .../core/api/TypeRegistryConfigurer.java | 7 +- .../io/cucumber/core/backend/Backend.java | 8 +- ...tion.java => DataTableTypeDefinition.java} | 2 +- .../java/io/cucumber/core/backend/Glue.java | 10 +- .../io/cucumber/core/runner/CachingGlue.java | 176 +++++++++++------- .../core/runner/CoreStepDefinition.java | 22 +-- .../DuplicateStepDefinitionException.java | 9 +- .../java/io/cucumber/core/runner/Runner.java | 92 +++++---- .../io/cucumber/core/runner/TestCase.java | 2 +- .../io/cucumber/core/runtime/Runtime.java | 6 +- ...anningTypeRegistryConfigurerSupplier.java} | 12 +- .../core/runtime/SingletonRunnerSupplier.java | 8 +- .../runtime/ThreadLocalRunnerSupplier.java | 14 +- .../TypeRegistryConfigurerSupplier.java | 7 + .../core/runtime/TypeRegistrySupplier.java | 7 - .../stepexpression/StepExpressionFactory.java | 7 +- .../cucumber/core/runner/CachingGlueTest.java | 153 ++++++++------- .../core/runner/CoreStepDefinitionTest.java | 2 +- .../cucumber/core/runner/HookOrderTest.java | 75 ++++---- .../io/cucumber/core/runner/HookTest.java | 43 ++--- .../io/cucumber/core/runner/RunnerTest.java | 35 ++-- .../core/runner/TestRunnerSupplier.java | 10 +- .../io/cucumber/core/runtime/RuntimeTest.java | 18 +- .../runtime/SingletonRunnerSupplierTest.java | 4 +- .../runtime/TestTypeRegistrySupplier.java | 13 -- .../ThreadLocalRunnerSupplierTest.java | 4 +- .../java/JavaDataTableTypeDefinition.java | 4 +- .../cucumber/java/JavaStepDefinitionTest.java | 69 ++++--- .../java/io/cucumber/java8/Java8Backend.java | 63 ++++--- .../java/io/cucumber/java8/LambdaGlue.java | 80 ++++---- .../java8/AnonInnerClassStepdefs.java | 2 +- .../main/java/io/cucumber/junit/Cucumber.java | 8 +- .../io/cucumber/junit/FeatureRunnerTest.java | 4 +- .../cucumber/testng/TestNGCucumberRunner.java | 8 +- 34 files changed, 505 insertions(+), 479 deletions(-) rename core/src/main/java/io/cucumber/core/backend/{DataTableTypeTypeDefinition.java => DataTableTypeDefinition.java} (80%) rename core/src/main/java/io/cucumber/core/{backend => runner}/DuplicateStepDefinitionException.java (53%) rename core/src/main/java/io/cucumber/core/runtime/{ConfiguringTypeRegistrySupplier.java => ScanningTypeRegistryConfigurerSupplier.java} (55%) create mode 100644 core/src/main/java/io/cucumber/core/runtime/TypeRegistryConfigurerSupplier.java delete mode 100644 core/src/main/java/io/cucumber/core/runtime/TypeRegistrySupplier.java delete mode 100644 core/src/test/java/io/cucumber/core/runtime/TestTypeRegistrySupplier.java diff --git a/core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java b/core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java index 8d965b4df1..86a968e4e6 100644 --- a/core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java +++ b/core/src/main/java/io/cucumber/core/api/TypeRegistryConfigurer.java @@ -10,12 +10,15 @@ @API(status = API.Status.STABLE) public interface TypeRegistryConfigurer { /** - * @return The locale to use. + * @return The locale to use, or null when language from feature file should be used. */ - Locale locale(); + default Locale locale() { + return null; + } /** * Configures the type registry. + * * @param typeRegistry The new type registry. */ void configureTypeRegistry(TypeRegistry typeRegistry); diff --git a/core/src/main/java/io/cucumber/core/backend/Backend.java b/core/src/main/java/io/cucumber/core/backend/Backend.java index 9a793f1c8d..8cd344ec87 100644 --- a/core/src/main/java/io/cucumber/core/backend/Backend.java +++ b/core/src/main/java/io/cucumber/core/backend/Backend.java @@ -10,15 +10,17 @@ public interface Backend { /** * Invoked once before all features. This is where stepdefs and hooks should be loaded. - * - * @param glue Glue that provides the stepdefs to be executed. + * + * @param glue Glue that provides the stepdefs to be executed. * @param gluePaths The locations for the glue to be loaded. */ void loadGlue(Glue glue, List gluePaths); /** * Invoked before a new scenario starts. Implementations should do any necessary - * setup of new, isolated state here. + * setup of new, isolated state here. Additional scenario scoped step definitions + * can be loaded here. These step definitions should implement + * {@link io.cucumber.core.runner.ScenarioScoped} */ void buildWorld(); diff --git a/core/src/main/java/io/cucumber/core/backend/DataTableTypeTypeDefinition.java b/core/src/main/java/io/cucumber/core/backend/DataTableTypeDefinition.java similarity index 80% rename from core/src/main/java/io/cucumber/core/backend/DataTableTypeTypeDefinition.java rename to core/src/main/java/io/cucumber/core/backend/DataTableTypeDefinition.java index 42ee8b1234..0fde393184 100644 --- a/core/src/main/java/io/cucumber/core/backend/DataTableTypeTypeDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/DataTableTypeDefinition.java @@ -4,7 +4,7 @@ import org.apiguardian.api.API; @API(status = API.Status.EXPERIMENTAL) -public interface DataTableTypeTypeDefinition { +public interface DataTableTypeDefinition { DataTableType dataTableType(); diff --git a/core/src/main/java/io/cucumber/core/backend/Glue.java b/core/src/main/java/io/cucumber/core/backend/Glue.java index b41228c36a..b14bf4bbd6 100644 --- a/core/src/main/java/io/cucumber/core/backend/Glue.java +++ b/core/src/main/java/io/cucumber/core/backend/Glue.java @@ -5,18 +5,18 @@ @API(status = API.Status.STABLE) public interface Glue { - void addStepDefinition(StepDefinition stepDefinition) throws DuplicateStepDefinitionException; + void addStepDefinition(StepDefinition stepDefinition); - void addBeforeHook(HookDefinition hookDefinition); + void addBeforeHook(HookDefinition beforeHook); - void addAfterHook(HookDefinition hookDefinition); + void addAfterHook(HookDefinition afterHook); void addBeforeStepHook(HookDefinition beforeStepHook); - void addAfterStepHook(HookDefinition hookDefinition); + void addAfterStepHook(HookDefinition afterStepHook); void addParameterType(ParameterTypeDefinition parameterTypeDefinition); - void addDataTableType(DataTableTypeTypeDefinition dataTableTypeTypeDefinition); + void addDataTableType(DataTableTypeDefinition dataTableTypeDefinition); } diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 717c0ff23e..7ddd1856ed 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -1,12 +1,10 @@ package io.cucumber.core.runner; -import io.cucumber.core.backend.DataTableTypeTypeDefinition; -import io.cucumber.core.backend.ParameterTypeDefinition; -import io.cucumber.core.event.StepDefinedEvent; import gherkin.pickles.PickleStep; -import io.cucumber.core.backend.DuplicateStepDefinitionException; +import io.cucumber.core.backend.DataTableTypeDefinition; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.backend.ParameterTypeDefinition; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.event.StepDefinedEvent; import io.cucumber.core.eventbus.EventBus; @@ -19,45 +17,38 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; -import java.util.function.Function; final class CachingGlue implements Glue { private static final HookComparator ASCENDING = new HookComparator(true); private static final HookComparator DESCENDING = new HookComparator(false); - final Map stepDefinitionsByPattern = new TreeMap<>(); - final Map stepDefinitionsByStepText = new HashMap<>(); - final List beforeHooks = new ArrayList<>(); - final List beforeStepHooks = new ArrayList<>(); - final List afterHooks = new ArrayList<>(); - final List afterStepHooks = new ArrayList<>(); - final List> stepDefinitionFunctions = new ArrayList<>(); + + private final List parameterTypeDefinitions = new ArrayList<>(); + private final List dataTableTypeDefinitions = new ArrayList<>(); + + private final List beforeHooks = new ArrayList<>(); + private final List beforeStepHooks = new ArrayList<>(); + private final List stepDefinitions = new ArrayList<>(); + private final List afterStepHooks = new ArrayList<>(); + private final List afterHooks = new ArrayList<>(); + + /* + * Storing the pattern that matches the step text allows us to cache the rather slow + * regex comparisons in `stepDefinitionMatches`. + * This cache does not need to be cleaned. The matching pattern be will used to look + * up a pickle specific step definition from `stepDefinitionsByPattern`. + */ + private final Map stepPatternByStepText = new HashMap<>(); + private final Map stepDefinitionsByPattern = new TreeMap<>(); private final EventBus bus; - private final TypeRegistry typeRegistry; - CachingGlue(EventBus bus, TypeRegistry typeRegistry) { + CachingGlue(EventBus bus) { this.bus = bus; - this.typeRegistry = typeRegistry; } @Override - public void addStepDefinition(Function stepDefinitionFunction) { - stepDefinitionFunctions.add(stepDefinitionFunction); - } - - void applyStepDefinitions() { - stepDefinitionFunctions.forEach(this::applyStepDefinition); - stepDefinitionFunctions.clear(); - } - - private void applyStepDefinition(Function stepDefinitionFunction) { - StepDefinition stepDefinition = stepDefinitionFunction.apply(typeRegistry); - StepDefinition previous = stepDefinitionsByPattern.get(stepDefinition.getPattern()); - if (previous != null) { - throw new DuplicateStepDefinitionException(previous.getStepDefinition(), stepDefinition); - } - stepDefinitionsByPattern.put(stepDefinition.getPattern(), coreStepDefinition); - bus.send(new StepDefinedEvent(bus.getInstant(), stepDefinition)); + public void addStepDefinition(StepDefinition stepDefinition) { + stepDefinitions.add(stepDefinition); } @Override @@ -86,12 +77,12 @@ public void addAfterStepHook(HookDefinition hookDefinition) { @Override public void addParameterType(ParameterTypeDefinition parameterTypeDefinition) { - typeRegistry.defineParameterType(parameterTypeDefinition.parameterType()); + parameterTypeDefinitions.add(parameterTypeDefinition); } @Override - public void addDataTableType(DataTableTypeTypeDefinition dataTableTypeTypeDefinition) { - typeRegistry.defineDataTableType(dataTableTypeTypeDefinition.dataTableType()); + public void addDataTableType(DataTableTypeDefinition dataTableTypeDefinition) { + dataTableTypeDefinitions.add(dataTableTypeDefinition); } List getBeforeHooks() { @@ -110,19 +101,70 @@ List getAfterStepHooks() { return new ArrayList<>(afterStepHooks); } + List getParameterTypeDefinitions() { + return parameterTypeDefinitions; + } + + List getDataTableTypeDefinitions() { + return dataTableTypeDefinitions; + } + + List getStepDefinitions() { + return stepDefinitions; + } + + Map getStepPatternByStepText() { + return stepPatternByStepText; + } + + Map getStepDefinitionsByPattern() { + return stepDefinitionsByPattern; + } + + void prepareGlue(TypeRegistry typeRegistry) throws DuplicateStepDefinitionException { + parameterTypeDefinitions.forEach(ptd -> typeRegistry.defineParameterType(ptd.parameterType())); + dataTableTypeDefinitions.forEach(dtd -> typeRegistry.defineDataTableType(dtd.dataTableType())); + + stepDefinitions.forEach(stepDefinition -> { + CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stepDefinition, typeRegistry); + CoreStepDefinition previous = stepDefinitionsByPattern.get(stepDefinition.getPattern()); + if (previous != null) { + throw new DuplicateStepDefinitionException(previous.getStepDefinition(), stepDefinition); + } + stepDefinitionsByPattern.put(coreStepDefinition.getPattern(), coreStepDefinition); + bus.send(new StepDefinedEvent(bus.getInstant(), stepDefinition)); + }); + } + PickleStepDefinitionMatch stepDefinitionMatch(String featurePath, PickleStep step) { - String stepText = step.getText(); - - CoreStepDefinition stepDefinition = stepDefinitionsByStepText.get(stepText); - if (stepDefinition != null) { - // Step definition arguments consists of parameters included in the step text and - // gherkin step arguments (doc string and data table) which are not included in - // the step text. As such the step definition arguments can not be cached and - // must be recreated each time. - List arguments = stepDefinition.matchedArguments(step); - return new PickleStepDefinitionMatch(arguments, stepDefinition, featurePath, step); + PickleStepDefinitionMatch cachedMatch = cachedStepDefinitionMatch(featurePath, step); + if (cachedMatch != null) { + return cachedMatch; + } + return findStepDefinitionMatch(featurePath, step); + } + + + private PickleStepDefinitionMatch cachedStepDefinitionMatch(String featurePath, PickleStep step) { + String stepDefinitionPattern = stepPatternByStepText.get(step.getText()); + if (stepDefinitionPattern == null) { + return null; } + CoreStepDefinition coreStepDefinition = stepDefinitionsByPattern.get(stepDefinitionPattern); + if (coreStepDefinition == null) { + return null; + } + + // Step definition arguments consists of parameters included in the step text and + // gherkin step arguments (doc string and data table) which are not included in + // the step text. As such the step definition arguments can not be cached and + // must be recreated each time. + List arguments = coreStepDefinition.matchedArguments(step); + return new PickleStepDefinitionMatch(arguments, coreStepDefinition.getStepDefinition(), featurePath, step); + } + + private PickleStepDefinitionMatch findStepDefinitionMatch(String featurePath, PickleStep step) { List matches = stepDefinitionMatches(featurePath, step); if (matches.isEmpty()) { return null; @@ -133,35 +175,37 @@ PickleStepDefinitionMatch stepDefinitionMatch(String featurePath, PickleStep ste PickleStepDefinitionMatch match = matches.get(0); - stepDefinitionsByStepText.put(stepText, (CoreStepDefinition) match.getStepDefinition()); + stepPatternByStepText.put(step.getText(), match.getPattern()); return match; } private List stepDefinitionMatches(String featurePath, PickleStep step) { List result = new ArrayList<>(); - for (CoreStepDefinition stepDefinition : stepDefinitionsByPattern.values()) { - List arguments = stepDefinition.matchedArguments(step); + for (CoreStepDefinition coreStepDefinition : stepDefinitionsByPattern.values()) { + List arguments = coreStepDefinition.matchedArguments(step); if (arguments != null) { - result.add(new PickleStepDefinitionMatch(arguments, stepDefinition, featurePath, step)); + result.add(new PickleStepDefinitionMatch(arguments, coreStepDefinition.getStepDefinition(), featurePath, step)); } } return result; } void removeScenarioScopedGlue() { - removeScenarioScopedHooks(beforeHooks); - removeScenarioScopedHooks(beforeStepHooks); - removeScenarioScopedHooks(afterHooks); - removeScenarioScopedHooks(afterStepHooks); - removeScenariosScopedStepDefinitions(stepDefinitionsByPattern); - removeScenariosScopedStepDefinitions(stepDefinitionsByStepText); - } - - private void removeScenarioScopedHooks(List beforeHooks) { - Iterator hookIterator = beforeHooks.iterator(); + stepDefinitionsByPattern.clear(); + removeScenarioScopedGlue(beforeHooks); + removeScenarioScopedGlue(beforeStepHooks); + removeScenarioScopedGlue(afterHooks); + removeScenarioScopedGlue(afterStepHooks); + removeScenarioScopedGlue(stepDefinitions); + removeScenarioScopedGlue(dataTableTypeDefinitions); + removeScenarioScopedGlue(parameterTypeDefinitions); + } + + private void removeScenarioScopedGlue(List glue) { + Iterator hookIterator = glue.iterator(); while (hookIterator.hasNext()) { - HookDefinition hook = hookIterator.next(); + Object hook = hookIterator.next(); if (hook instanceof ScenarioScoped) { ScenarioScoped scenarioScopedHookDefinition = (ScenarioScoped) hook; scenarioScopedHookDefinition.disposeScenarioScope(); @@ -170,16 +214,4 @@ private void removeScenarioScopedHooks(List beforeHooks) { } } - private void removeScenariosScopedStepDefinitions(Map stepDefinitions) { - Iterator> stepDefinitionIterator = stepDefinitions.entrySet().iterator(); - while (stepDefinitionIterator.hasNext()) { - CoreStepDefinition coreStepDefinition = stepDefinitionIterator.next().getValue(); - StepDefinition stepDefinition = coreStepDefinition.getStepDefinition(); - if (stepDefinition instanceof ScenarioScoped) { - ScenarioScoped scenarioScopedStepDefinition = (ScenarioScoped) stepDefinition; - scenarioScopedStepDefinition.disposeScenarioScope(); - stepDefinitionIterator.remove(); - } - } - } } diff --git a/core/src/main/java/io/cucumber/core/runner/CoreStepDefinition.java b/core/src/main/java/io/cucumber/core/runner/CoreStepDefinition.java index ca5fc5bb93..bbf85dac29 100644 --- a/core/src/main/java/io/cucumber/core/runner/CoreStepDefinition.java +++ b/core/src/main/java/io/cucumber/core/runner/CoreStepDefinition.java @@ -15,7 +15,7 @@ import static java.util.Objects.requireNonNull; -class CoreStepDefinition implements StepDefinition { +class CoreStepDefinition { private final StepExpression expression; private final ArgumentMatcher argumentMatcher; @@ -41,26 +41,6 @@ private StepExpression createExpression(List parameterInfos, Stri } } - @Override - public void execute(Object[] args) throws Throwable { - stepDefinition.execute(args); - } - - @Override - public boolean isDefinedAt(StackTraceElement stackTraceElement) { - return stepDefinition.isDefinedAt(stackTraceElement); - } - - @Override - public List parameterInfos() { - return stepDefinition.parameterInfos(); - } - - @Override - public String getLocation(boolean detail) { - return stepDefinition.getLocation(detail); - } - public String getPattern() { return expression.getSource(); } diff --git a/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java b/core/src/main/java/io/cucumber/core/runner/DuplicateStepDefinitionException.java similarity index 53% rename from core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java rename to core/src/main/java/io/cucumber/core/runner/DuplicateStepDefinitionException.java index 4e9a5be781..e8653787da 100644 --- a/core/src/main/java/io/cucumber/core/backend/DuplicateStepDefinitionException.java +++ b/core/src/main/java/io/cucumber/core/runner/DuplicateStepDefinitionException.java @@ -1,11 +1,10 @@ -package io.cucumber.core.backend; +package io.cucumber.core.runner; +import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.exception.CucumberException; -import org.apiguardian.api.API; -@API(status = API.Status.STABLE) -public final class DuplicateStepDefinitionException extends CucumberException { - public DuplicateStepDefinitionException(StepDefinition a, StepDefinition b) { +final class DuplicateStepDefinitionException extends CucumberException { + DuplicateStepDefinitionException(StepDefinition a, StepDefinition b) { super(createMessage(a, b)); } diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index 80e5c1848b..d62264971b 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -3,6 +3,7 @@ import gherkin.events.PickleEvent; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; +import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.ObjectFactory; @@ -18,9 +19,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Locale; import java.util.stream.Collectors; -import static java.util.stream.Collectors.joining; +import static java.util.Collections.emptyList; public final class Runner { @@ -31,24 +33,21 @@ public final class Runner { private final Collection backends; private final Options runnerOptions; private final ObjectFactory objectFactory; - private final List snippetGenerators; + private final TypeRegistryConfigurer typeRegistryConfigurer; + private List snippetGenerators; - public Runner(EventBus bus, Collection backends, ObjectFactory objectFactory, TypeRegistry typeRegistry, Options runnerOptions) { + public Runner(EventBus bus, Collection backends, ObjectFactory objectFactory, TypeRegistryConfigurer typeRegistryConfigurer, Options runnerOptions) { this.bus = bus; - this.glue = new CachingGlue(bus, typeRegistry); this.runnerOptions = runnerOptions; this.backends = backends; - this.snippetGenerators = backends.stream() - .map(Backend::getSnippet) - .map(s -> new SnippetGenerator(s, typeRegistry.parameterTypeRegistry())) - .collect(Collectors.toList()); + this.glue = new CachingGlue(bus); this.objectFactory = objectFactory; + this.typeRegistryConfigurer = typeRegistryConfigurer; List gluePaths = runnerOptions.getGlue(); - log.debug("Loading glue from " + gluePaths.stream().map(URI::toString).collect(joining(", "))); + log.debug("Loading glue from " + gluePaths); for (Backend backend : backends) { log.debug("Loading glue for backend " + backend.getClass().getName()); backend.loadGlue(this.glue, gluePaths); - glue.applyStepDefinitions(); } } @@ -58,27 +57,52 @@ public EventBus getBus() { public void runPickle(PickleEvent pickle) { try { + TypeRegistry typeRegistry = createTypeRegistryForPickle(pickle); + snippetGenerators = createSnippetGeneratorsForPickle(typeRegistry); + buildBackendWorlds(); // Java8 step definitions will be added to the glue here + + glue.prepareGlue(typeRegistry); + TestCase testCase = createTestCaseForPickle(pickle); testCase.run(bus); } finally { + glue.removeScenarioScopedGlue(); disposeBackendWorlds(); } } + private List createSnippetGeneratorsForPickle(TypeRegistry typeRegistry) { + return backends.stream() + .map(Backend::getSnippet) + .map(s -> new SnippetGenerator(s, typeRegistry.parameterTypeRegistry())) + .collect(Collectors.toList()); + } + + private TypeRegistry createTypeRegistryForPickle(PickleEvent pickle) { + Locale locale = typeRegistryConfigurer.locale(); + if(locale == null){ + locale = new Locale(pickle.pickle.getLanguage()); + } + TypeRegistry typeRegistry = new TypeRegistry(locale); + typeRegistryConfigurer.configureTypeRegistry(typeRegistry); + return typeRegistry; + } + private TestCase createTestCaseForPickle(PickleEvent pickleEvent) { - List testSteps = new ArrayList<>(); - List beforeHooks = new ArrayList<>(); - List afterHooks = new ArrayList<>(); - if (!pickleEvent.pickle.getSteps().isEmpty()) { - addTestStepsForBeforeHooks(beforeHooks, pickleEvent.pickle.getTags()); - addTestStepsForPickleSteps(testSteps, pickleEvent); - addTestStepsForAfterHooks(afterHooks, pickleEvent.pickle.getTags()); + if (pickleEvent.pickle.getSteps().isEmpty()) { + return new TestCase(emptyList(), emptyList(), emptyList(), pickleEvent, runnerOptions.isDryRun()); } + + List testSteps = addTestStepsForPickleSteps(pickleEvent); + List beforeHooks = addTestStepsForBeforeHooks(pickleEvent.pickle.getTags()); + List afterHooks = addTestStepsForAfterHooks(pickleEvent.pickle.getTags()); return new TestCase(testSteps, beforeHooks, afterHooks, pickleEvent, runnerOptions.isDryRun()); } - private void addTestStepsForPickleSteps(List testSteps, PickleEvent pickleEvent) { + private List addTestStepsForPickleSteps(PickleEvent pickleEvent) { + List testSteps = new ArrayList<>(); + for (PickleStep step : pickleEvent.pickle.getSteps()) { PickleStepDefinitionMatch match; try { @@ -105,6 +129,8 @@ private void addTestStepsForPickleSteps(List testSteps, Pick List beforeStepHookSteps = getBeforeStepHooks(pickleEvent.pickle.getTags()); testSteps.add(new PickleStepTestStep(pickleEvent.uri, step, beforeStepHookSteps, afterStepHookSteps, match)); } + + return testSteps; } private List locations(PickleStep step) { @@ -113,33 +139,27 @@ private List locations(PickleStep step) { .collect(Collectors.toList()); } - private void addTestStepsForBeforeHooks(List testSteps, List tags) { - addTestStepsForHooks(testSteps, tags, glue.getBeforeHooks(), HookType.BEFORE); + private List addTestStepsForBeforeHooks(List tags) { + return addTestStepsForHooks(tags, glue.getBeforeHooks(), HookType.BEFORE); } - private void addTestStepsForAfterHooks(List testSteps, List tags) { - addTestStepsForHooks(testSteps, tags, glue.getAfterHooks(), HookType.AFTER); + private List addTestStepsForAfterHooks(List tags) { + return addTestStepsForHooks(tags, glue.getAfterHooks(), HookType.AFTER); } - private void addTestStepsForHooks(List testSteps, List tags, List hooks, HookType hookType) { - for (HookDefinition hook : hooks) { - if (hook.matches(tags)) { - HookTestStep testStep = new HookTestStep(hookType, new HookDefinitionMatch(hook)); - testSteps.add(testStep); - } - } + private List addTestStepsForHooks(List tags, List hooks, HookType hookType) { + return hooks.stream() + .filter(hook -> hook.matches(tags)) + .map(hook -> new HookTestStep(hookType, new HookDefinitionMatch(hook))) + .collect(Collectors.toList()); } private List getAfterStepHooks(List tags) { - List hookSteps = new ArrayList<>(); - addTestStepsForHooks(hookSteps, tags, glue.getAfterStepHooks(), HookType.AFTER_STEP); - return hookSteps; + return addTestStepsForHooks(tags, glue.getAfterStepHooks(), HookType.AFTER_STEP); } private List getBeforeStepHooks(List tags) { - List hookSteps = new ArrayList<>(); - addTestStepsForHooks(hookSteps, tags, glue.getBeforeStepHooks(), HookType.BEFORE_STEP); - return hookSteps; + return addTestStepsForHooks(tags, glue.getBeforeStepHooks(), HookType.BEFORE_STEP); } private void buildBackendWorlds() { @@ -147,7 +167,6 @@ private void buildBackendWorlds() { for (Backend backend : backends) { backend.buildWorld(); } - glue.applyStepDefinitions(); } private void disposeBackendWorlds() { @@ -155,6 +174,5 @@ private void disposeBackendWorlds() { backend.disposeWorld(); } objectFactory.stop(); - glue.removeScenarioScopedGlue(); } } diff --git a/core/src/main/java/io/cucumber/core/runner/TestCase.java b/core/src/main/java/io/cucumber/core/runner/TestCase.java index 467efbfab1..85c6926a07 100644 --- a/core/src/main/java/io/cucumber/core/runner/TestCase.java +++ b/core/src/main/java/io/cucumber/core/runner/TestCase.java @@ -22,7 +22,7 @@ final class TestCase implements io.cucumber.core.event.TestCase { private final List beforeHooks; private final List afterHooks; - public TestCase(List testSteps, + TestCase(List testSteps, List beforeHooks, List afterHooks, PickleEvent pickleEvent, diff --git a/core/src/main/java/io/cucumber/core/runtime/Runtime.java b/core/src/main/java/io/cucumber/core/runtime/Runtime.java index 984c4ee791..ea3ab04d9b 100644 --- a/core/src/main/java/io/cucumber/core/runtime/Runtime.java +++ b/core/src/main/java/io/cucumber/core/runtime/Runtime.java @@ -217,11 +217,11 @@ public Runtime build() { plugins.setEventBusOnEventListenerPlugins(eventBus); } - final TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); + final TypeRegistryConfigurerSupplier typeRegistryConfigurerSupplier = new ScanningTypeRegistryConfigurerSupplier(classFinder, runtimeOptions); final RunnerSupplier runnerSupplier = runtimeOptions.isMultiThreaded() - ? new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactorySupplier, typeRegistrySupplier) - : new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactorySupplier, typeRegistrySupplier); + ? new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactorySupplier, typeRegistryConfigurerSupplier) + : new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactorySupplier, typeRegistryConfigurerSupplier); final ExecutorService executor = runtimeOptions.isMultiThreaded() ? Executors.newFixedThreadPool(runtimeOptions.getThreads(), new CucumberThreadFactory()) diff --git a/core/src/main/java/io/cucumber/core/runtime/ConfiguringTypeRegistrySupplier.java b/core/src/main/java/io/cucumber/core/runtime/ScanningTypeRegistryConfigurerSupplier.java similarity index 55% rename from core/src/main/java/io/cucumber/core/runtime/ConfiguringTypeRegistrySupplier.java rename to core/src/main/java/io/cucumber/core/runtime/ScanningTypeRegistryConfigurerSupplier.java index ac96061be8..dc51894d4c 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ConfiguringTypeRegistrySupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ScanningTypeRegistryConfigurerSupplier.java @@ -4,27 +4,23 @@ import io.cucumber.core.io.ClassFinder; import io.cucumber.core.reflection.Reflections; import io.cucumber.core.runner.Options; -import io.cucumber.core.stepexpression.TypeRegistry; import java.util.Locale; -public final class ConfiguringTypeRegistrySupplier implements TypeRegistrySupplier { +public final class ScanningTypeRegistryConfigurerSupplier implements TypeRegistryConfigurerSupplier { private final ClassFinder classFinder; private final Options options; - public ConfiguringTypeRegistrySupplier(ClassFinder classFinder, Options options) { + public ScanningTypeRegistryConfigurerSupplier(ClassFinder classFinder, Options options) { this.classFinder = classFinder; this.options = options; } @Override - public TypeRegistry get() { + public TypeRegistryConfigurer get() { Reflections reflections = new Reflections(classFinder); - TypeRegistryConfigurer typeRegistryConfigurer = reflections.instantiateExactlyOneSubclass(TypeRegistryConfigurer.class, options.getGlue(), new Class[0], new Object[0], new DefaultTypeRegistryConfiguration()); - TypeRegistry typeRegistry = new TypeRegistry(typeRegistryConfigurer.locale()); - typeRegistryConfigurer.configureTypeRegistry(typeRegistry); - return typeRegistry; + return reflections.instantiateExactlyOneSubclass(TypeRegistryConfigurer.class, options.getGlue(), new Class[0], new Object[0], new DefaultTypeRegistryConfiguration()); } private static final class DefaultTypeRegistryConfiguration implements TypeRegistryConfigurer { diff --git a/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java index fba17eaa02..93e57da1ec 100644 --- a/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/SingletonRunnerSupplier.java @@ -15,19 +15,19 @@ public final class SingletonRunnerSupplier implements RunnerSupplier { private final Options runnerOptions; private final EventBus eventBus; private final ObjectFactorySupplier objectFactorySupplier; - private final TypeRegistrySupplier typeRegistrySupplier; + private final TypeRegistryConfigurerSupplier typeRegistryConfigurerSupplier; public SingletonRunnerSupplier( Options runnerOptions, EventBus eventBus, BackendSupplier backendSupplier, - ObjectFactorySupplier objectFactorySupplier, TypeRegistrySupplier typeRegistrySupplier) { + ObjectFactorySupplier objectFactorySupplier, TypeRegistryConfigurerSupplier typeRegistryConfigurerSupplier) { this.backendSupplier = backendSupplier; this.runnerOptions = runnerOptions; this.eventBus = eventBus; this.objectFactorySupplier = objectFactorySupplier; - this.typeRegistrySupplier = typeRegistrySupplier; + this.typeRegistryConfigurerSupplier = typeRegistryConfigurerSupplier; } private Runner runner; @@ -45,7 +45,7 @@ private Runner createRunner() { eventBus, backendSupplier.get(), objectFactorySupplier.get(), - typeRegistrySupplier.get(), + typeRegistryConfigurerSupplier.get(), runnerOptions ); } diff --git a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java index 35c23ff4e3..cc0e6db910 100644 --- a/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java +++ b/core/src/main/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplier.java @@ -1,7 +1,5 @@ package io.cucumber.core.runtime; -import java.time.Instant; - import io.cucumber.core.event.Event; import io.cucumber.core.event.EventHandler; import io.cucumber.core.eventbus.AbstractEventBus; @@ -9,6 +7,8 @@ import io.cucumber.core.runner.Options; import io.cucumber.core.runner.Runner; +import java.time.Instant; + /** * Creates a distinct runner for each calling thread. Each runner has its own bus, backend- and glue-suppliers. *

        @@ -20,7 +20,7 @@ public final class ThreadLocalRunnerSupplier implements RunnerSupplier { private final io.cucumber.core.runner.Options runnerOptions; private final SynchronizedEventBus sharedEventBus; private final ObjectFactorySupplier objectFactorySupplier; - private final TypeRegistrySupplier typeRegistrySupplier; + private final TypeRegistryConfigurerSupplier typeRegistryConfigurerSupplier; private final ThreadLocal runners = ThreadLocal.withInitial(this::createRunner); @@ -28,12 +28,14 @@ public ThreadLocalRunnerSupplier( Options runnerOptions, EventBus sharedEventBus, BackendSupplier backendSupplier, - ObjectFactorySupplier objectFactorySupplier, TypeRegistrySupplier typeRegistrySupplier) { + ObjectFactorySupplier objectFactorySupplier, + TypeRegistryConfigurerSupplier typeRegistryConfigurerSupplier + ) { this.runnerOptions = runnerOptions; this.sharedEventBus = SynchronizedEventBus.synchronize(sharedEventBus); this.backendSupplier = backendSupplier; this.objectFactorySupplier = objectFactorySupplier; - this.typeRegistrySupplier = typeRegistrySupplier; + this.typeRegistryConfigurerSupplier = typeRegistryConfigurerSupplier; } @Override @@ -46,7 +48,7 @@ private Runner createRunner() { new LocalEventBus(sharedEventBus), backendSupplier.get(), objectFactorySupplier.get(), - typeRegistrySupplier.get(), + typeRegistryConfigurerSupplier.get(), runnerOptions ); } diff --git a/core/src/main/java/io/cucumber/core/runtime/TypeRegistryConfigurerSupplier.java b/core/src/main/java/io/cucumber/core/runtime/TypeRegistryConfigurerSupplier.java new file mode 100644 index 0000000000..18d77a2d4c --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runtime/TypeRegistryConfigurerSupplier.java @@ -0,0 +1,7 @@ +package io.cucumber.core.runtime; + +import io.cucumber.core.api.TypeRegistryConfigurer; + +public interface TypeRegistryConfigurerSupplier { + TypeRegistryConfigurer get(); +} diff --git a/core/src/main/java/io/cucumber/core/runtime/TypeRegistrySupplier.java b/core/src/main/java/io/cucumber/core/runtime/TypeRegistrySupplier.java deleted file mode 100644 index 5a4d2e32b7..0000000000 --- a/core/src/main/java/io/cucumber/core/runtime/TypeRegistrySupplier.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.cucumber.core.runtime; - -import io.cucumber.core.stepexpression.TypeRegistry; - -public interface TypeRegistrySupplier { - TypeRegistry get(); -} diff --git a/core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java b/core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java index fa83533ebb..4490018b64 100644 --- a/core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java +++ b/core/src/main/java/io/cucumber/core/stepexpression/StepExpressionFactory.java @@ -1,19 +1,16 @@ package io.cucumber.core.stepexpression; import io.cucumber.core.exception.CucumberException; +import io.cucumber.cucumberexpressions.Expression; import io.cucumber.cucumberexpressions.UndefinedParameterTypeException; -import io.cucumber.datatable.DataTableTypeRegistryTableConverter; import io.cucumber.datatable.DataTable; - -import io.cucumber.cucumberexpressions.Expression; -import org.apiguardian.api.API; +import io.cucumber.datatable.DataTableTypeRegistryTableConverter; import java.lang.reflect.Type; import java.util.List; import static java.util.Collections.singletonList; -@API(status = API.Status.STABLE) public final class StepExpressionFactory { private final io.cucumber.cucumberexpressions.ExpressionFactory expressionFactory; diff --git a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index f0ec469d2a..8e5f2ccddf 100644 --- a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -9,13 +9,16 @@ import gherkin.pickles.PickleTable; import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; -import io.cucumber.core.backend.DuplicateStepDefinitionException; +import io.cucumber.core.backend.DataTableTypeDefinition; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.ParameterInfo; +import io.cucumber.core.backend.ParameterTypeDefinition; import io.cucumber.core.backend.StepDefinition; import io.cucumber.core.runtime.TimeServiceEventBus; import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.datatable.DataTable; +import io.cucumber.datatable.DataTableType; import org.junit.Test; import java.time.Clock; @@ -30,13 +33,12 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; public class CachingGlueTest { private final TypeRegistry typeRegistry = new TypeRegistry(ENGLISH); - private CachingGlue glue = new CachingGlue(new TimeServiceEventBus(Clock.systemUTC()), typeRegistry); + private CachingGlue glue = new CachingGlue(new TimeServiceEventBus(Clock.systemUTC())); @Test public void throws_duplicate_error_on_dupe_stepdefs() { @@ -48,9 +50,10 @@ public void throws_duplicate_error_on_dupe_stepdefs() { StepDefinition b = mock(StepDefinition.class); when(b.getPattern()).thenReturn("hello"); when(b.getLocation(true)).thenReturn("bar.bf:90"); + glue.addStepDefinition(b); + try { - glue.addStepDefinition(b); - glue.applyStepDefinitions(); + glue.prepareGlue(typeRegistry); fail("should have failed"); } catch (DuplicateStepDefinitionException expected) { assertEquals("Duplicate step definitions in foo.bf:10 and bar.bf:90", expected.getMessage()); @@ -63,54 +66,34 @@ public void removes_glue_that_is_scenario_scoped() { // But it was too much hassle creating a better test without refactoring RuntimeGlue // and probably some of its immediate collaborators... Aslak. - StepDefinition sd = spy(new MockedScenarioScopedStepDefinition()); - when(sd.getPattern()).thenReturn("pattern"); - glue.addStepDefinition(sd); - glue.applyStepDefinitions(); - - HookDefinition bh = spy(new MockedScenarioScopedHookDefinition()); - glue.addBeforeHook(bh); - - HookDefinition ah = spy(new MockedScenarioScopedHookDefinition()); - glue.addAfterHook(ah); - - assertEquals(1, glue.stepDefinitionsByPattern.size()); - assertEquals(1, glue.beforeHooks.size()); - assertEquals(1, glue.afterHooks.size()); - - glue.removeScenarioScopedGlue(); - - assertEquals(0, glue.stepDefinitionsByPattern.size()); - assertEquals(0, glue.beforeHooks.size()); - assertEquals(0, glue.afterHooks.size()); - } - - @Test - public void removes_scenario_scoped_cache_entries() { - StepDefinition sd = new MockedScenarioScopedStepDefinition("pattern"); - glue.addStepDefinition(sd); - glue.applyStepDefinitions(); + glue.addStepDefinition(new MockedScenarioScopedStepDefinition("pattern")); + glue.addBeforeHook(new MockedScenarioScopedHookDefinition()); + glue.addAfterHook(new MockedScenarioScopedHookDefinition()); + glue.addDataTableType(new MockedDataTableTypeDefinition()); + glue.addParameterType(new MockedParemterTypeDefinition()); - String featurePath = "someFeature.feature"; - - String stepText = "pattern"; - PickleStep pickleStep1 = getPickleStep(stepText); - PickleStepDefinitionMatch pickleStepDefinitionMatch = glue.stepDefinitionMatch(featurePath, pickleStep1); - CoreStepDefinition coreStepDefinition = (CoreStepDefinition) pickleStepDefinitionMatch.getStepDefinition(); - assertEquals(sd, coreStepDefinition.getStepDefinition()); + glue.prepareGlue(typeRegistry); - assertEquals(1, glue.stepDefinitionsByStepText.size()); + assertEquals(1, glue.getStepDefinitions().size()); + assertEquals(1, glue.getBeforeHooks().size()); + assertEquals(1, glue.getAfterHooks().size()); + assertEquals(1, glue.getDataTableTypeDefinitions().size()); + assertEquals(1, glue.getParameterTypeDefinitions().size()); glue.removeScenarioScopedGlue(); - assertEquals(0, glue.stepDefinitionsByStepText.size()); + assertEquals(0, glue.getStepDefinitions().size()); + assertEquals(0, glue.getBeforeHooks().size()); + assertEquals(0, glue.getAfterHooks().size()); + assertEquals(0, glue.getDataTableTypeDefinitions().size()); + assertEquals(0, glue.getParameterTypeDefinitions().size()); } @Test public void returns_null_if_no_matching_steps_found() { - StepDefinition stepDefinition = spy(new MockedStepDefinition("pattern1")); + StepDefinition stepDefinition = new MockedStepDefinition("pattern1"); glue.addStepDefinition(stepDefinition); - glue.applyStepDefinitions(); + String featurePath = "someFeature.feature"; PickleStep pickleStep = getPickleStep("pattern"); @@ -119,50 +102,50 @@ public void returns_null_if_no_matching_steps_found() { @Test public void returns_match_from_cache_if_single_found() { - StepDefinition stepDefinition1 = spy(new MockedStepDefinition("^pattern1")); - StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); + StepDefinition stepDefinition1 = new MockedStepDefinition("^pattern1"); + StepDefinition stepDefinition2 = new MockedStepDefinition("^pattern2"); glue.addStepDefinition(stepDefinition1); glue.addStepDefinition(stepDefinition2); - glue.applyStepDefinitions(); + glue.prepareGlue(typeRegistry); + String featurePath = "someFeature.feature"; String stepText = "pattern1"; PickleStep pickleStep1 = getPickleStep(stepText); PickleStepDefinitionMatch pickleStepDefinitionMatch = glue.stepDefinitionMatch(featurePath, pickleStep1); - CoreStepDefinition coreStepDefinition = (CoreStepDefinition) pickleStepDefinitionMatch.getStepDefinition(); - assertEquals(stepDefinition1, coreStepDefinition.getStepDefinition()); + assertEquals(stepDefinition1, pickleStepDefinitionMatch.getStepDefinition()); //check cache - CoreStepDefinition entry = glue.stepDefinitionsByStepText.get(stepText); - assertEquals(stepDefinition1, entry.getStepDefinition()); + assertEquals(stepDefinition1.getPattern(), glue.getStepPatternByStepText().get(stepText)); + CoreStepDefinition coreStepDefinition = glue.getStepDefinitionsByPattern().get(stepDefinition1.getPattern()); + assertEquals(stepDefinition1, coreStepDefinition.getStepDefinition()); PickleStep pickleStep2 = getPickleStep(stepText); PickleStepDefinitionMatch pickleStepDefinitionMatch2 = glue.stepDefinitionMatch(featurePath, pickleStep2); - CoreStepDefinition coreStepDefinition2 = (CoreStepDefinition) pickleStepDefinitionMatch2.getStepDefinition(); - assertEquals(stepDefinition1, coreStepDefinition2.getStepDefinition()); + assertEquals(stepDefinition1, pickleStepDefinitionMatch2.getStepDefinition()); } @Test public void returns_match_from_cache_for_step_with_table() { - StepDefinition stepDefinition1 = spy(new MockedStepDefinition("^pattern1")); - StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); + StepDefinition stepDefinition1 = new MockedStepDefinition("^pattern1"); + StepDefinition stepDefinition2 = new MockedStepDefinition("^pattern2"); glue.addStepDefinition(stepDefinition1); glue.addStepDefinition(stepDefinition2); - glue.applyStepDefinitions(); + glue.prepareGlue(typeRegistry); + String featurePath = "someFeature.feature"; String stepText = "pattern1"; PickleStep pickleStep1 = getPickleStepWithSingleCellTable(stepText, "cell 1"); PickleStepDefinitionMatch match1 = glue.stepDefinitionMatch(featurePath, pickleStep1); - CoreStepDefinition coreStepDefinition = (CoreStepDefinition) match1.getStepDefinition(); - - assertEquals(stepDefinition1, coreStepDefinition.getStepDefinition()); + assertEquals(stepDefinition1, match1.getStepDefinition()); //check cache - CoreStepDefinition entry = glue.stepDefinitionsByStepText.get(stepText); - assertEquals(stepDefinition1, entry.getStepDefinition()); + assertEquals(stepDefinition1.getPattern(), glue.getStepPatternByStepText().get(stepText)); + CoreStepDefinition coreStepDefinition = glue.getStepDefinitionsByPattern().get(stepDefinition1.getPattern()); + assertEquals(stepDefinition1, coreStepDefinition.getStepDefinition()); //check arguments assertEquals("cell 1", ((DataTable) match1.getArguments().get(0).getValue()).cell(0, 0)); @@ -177,24 +160,24 @@ public void returns_match_from_cache_for_step_with_table() { @Test public void returns_match_from_cache_for_ste_with_doc_string() { - StepDefinition stepDefinition1 = spy(new MockedStepDefinition("^pattern1")); - StepDefinition stepDefinition2 = spy(new MockedStepDefinition("^pattern2")); + StepDefinition stepDefinition1 = new MockedStepDefinition("^pattern1"); + StepDefinition stepDefinition2 = new MockedStepDefinition("^pattern2"); glue.addStepDefinition(stepDefinition1); glue.addStepDefinition(stepDefinition2); - glue.applyStepDefinitions(); + glue.prepareGlue(typeRegistry); + String featurePath = "someFeature.feature"; String stepText = "pattern1"; PickleStep pickleStep1 = getPickleStepWithDocString(stepText, "doc string 1"); PickleStepDefinitionMatch match1 = glue.stepDefinitionMatch(featurePath, pickleStep1); - CoreStepDefinition coreStepDefinition = (CoreStepDefinition) match1.getStepDefinition(); - - assertEquals(stepDefinition1, coreStepDefinition.getStepDefinition()); + assertEquals(stepDefinition1, match1.getStepDefinition()); //check cache - CoreStepDefinition entry = glue.stepDefinitionsByStepText.get(stepText); - assertEquals(stepDefinition1, entry.getStepDefinition()); + assertEquals(stepDefinition1.getPattern(), glue.getStepPatternByStepText().get(stepText)); + CoreStepDefinition coreStepDefinition = glue.getStepDefinitionsByPattern().get(stepDefinition1.getPattern()); + assertEquals(stepDefinition1, coreStepDefinition.getStepDefinition()); //check arguments assertEquals("doc string 1", match1.getArguments().get(0).getValue()); @@ -225,7 +208,8 @@ public void throws_ambiguous_steps_def_exception_when_many_patterns_match() { glue.addStepDefinition(stepDefinition1); glue.addStepDefinition(stepDefinition2); glue.addStepDefinition(stepDefinition3); - glue.applyStepDefinitions(); + glue.prepareGlue(typeRegistry); + String featurePath = "someFeature.feature"; checkAmbiguousCalled(featurePath); @@ -295,6 +279,37 @@ public String getPattern() { } + private static class MockedDataTableTypeDefinition implements DataTableTypeDefinition, ScenarioScoped { + + boolean disposed; + + @Override + public DataTableType dataTableType() { + return new DataTableType(Object.class, (DataTable table) -> new Object()); + } + + @Override + public void disposeScenarioScope() { + this.disposed = true; + } + + } + private static class MockedParemterTypeDefinition implements ParameterTypeDefinition, ScenarioScoped { + + boolean disposed; + + @Override + public void disposeScenarioScope() { + this.disposed = true; + } + + @Override + public ParameterType parameterType() { + return new ParameterType<>("mock", "[ab]", Object.class, (String arg) -> new Object()); + } + } + + private static class MockedScenarioScopedHookDefinition implements HookDefinition, ScenarioScoped { boolean disposed; diff --git a/core/src/test/java/io/cucumber/core/runner/CoreStepDefinitionTest.java b/core/src/test/java/io/cucumber/core/runner/CoreStepDefinitionTest.java index 1d846bebe3..ae9244824b 100644 --- a/core/src/test/java/io/cucumber/core/runner/CoreStepDefinitionTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CoreStepDefinitionTest.java @@ -128,7 +128,7 @@ private T runStepDef(Method method, boolean transposed, PickleTable table) t for (Argument argument : arguments) { result.add(argument.getValue()); } - coreStepDefinition.execute(result.toArray(new Object[0])); + coreStepDefinition.getStepDefinition().execute(result.toArray(new Object[0])); return (T) stub.getArgs().get(0); } diff --git a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java index 3b75640470..68ac48a788 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookOrderTest.java @@ -13,7 +13,6 @@ import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.StubStepDefinition; import io.cucumber.core.runtime.TimeServiceEventBus; -import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.InOrder; @@ -23,7 +22,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Locale; import static java.util.Collections.singletonList; import static org.mockito.Mockito.inOrder; @@ -35,18 +33,17 @@ public class HookOrderTest { private final RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); private final EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); - private final TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); private final StubStepDefinition stepDefinition = new StubStepDefinition("pattern1"); - private final PickleStep pickleStep = new PickleStep("pattern1", Collections.emptyList(), singletonList(new PickleLocation(2,2))); + private final PickleStep pickleStep = new PickleStep("pattern1", Collections.emptyList(), singletonList(new PickleLocation(2,2))); private final PickleEvent pickleEvent = new PickleEvent("uri", - new Pickle("scenario1", ENGLISH, singletonList(pickleStep), Collections.emptyList(), singletonList(new PickleLocation(1,1)))); + new Pickle("scenario1", ENGLISH, singletonList(pickleStep), Collections.emptyList(), singletonList(new PickleLocation(1,1)))); @Test public void before_hooks_execute_in_order() throws Throwable { final List hooks = mockHooks(3, Integer.MAX_VALUE, 1, -1, 0, 10000, Integer.MIN_VALUE); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(new StubStepDefinition("pattern1")); @@ -60,20 +57,20 @@ public void loadGlue(Glue glue, List gluePaths) { runnerSupplier.get().runPickle(pickleEvent); InOrder inOrder = inOrder(hooks.toArray()); - inOrder.verify(hooks.get(6)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(3)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(4)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(2)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(0)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(5)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(1)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(6)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(3)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(4)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(2)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(0)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(5)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(1)).execute(ArgumentMatchers.any()); } @Test public void before_step_hooks_execute_in_order() throws Throwable { final List hooks = mockHooks(3, Integer.MAX_VALUE, 1, -1, 0, 10000, Integer.MIN_VALUE); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); @@ -87,20 +84,20 @@ public void loadGlue(Glue glue, List gluePaths) { runnerSupplier.get().runPickle(pickleEvent); InOrder inOrder = inOrder(hooks.toArray()); - inOrder.verify(hooks.get(6)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(3)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(4)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(2)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(0)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(5)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(1)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(6)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(3)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(4)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(2)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(0)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(5)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(1)).execute(ArgumentMatchers.any()); } @Test public void after_hooks_execute_in_reverse_order() throws Throwable { final List hooks = mockHooks(Integer.MIN_VALUE, 2, Integer.MAX_VALUE, 4, -1, 0, 10000); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); @@ -114,20 +111,20 @@ public void loadGlue(Glue glue, List gluePaths) { runnerSupplier.get().runPickle(pickleEvent); InOrder inOrder = inOrder(hooks.toArray()); - inOrder.verify(hooks.get(2)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(6)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(3)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(1)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(5)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(4)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(0)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(2)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(6)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(3)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(1)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(5)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(4)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(0)).execute(ArgumentMatchers.any()); } @Test public void after_step_hooks_execute_in_reverse_order() throws Throwable { final List hooks = mockHooks(Integer.MIN_VALUE, 2, Integer.MAX_VALUE, 4, -1, 0, 10000); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); @@ -141,13 +138,13 @@ public void loadGlue(Glue glue, List gluePaths) { runnerSupplier.get().runPickle(pickleEvent); InOrder inOrder = inOrder(hooks.toArray()); - inOrder.verify(hooks.get(2)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(6)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(3)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(1)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(5)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(4)).execute(ArgumentMatchers.any()); - inOrder.verify(hooks.get(0)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(2)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(6)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(3)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(1)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(5)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(4)).execute(ArgumentMatchers.any()); + inOrder.verify(hooks.get(0)).execute(ArgumentMatchers.any()); } @Test @@ -156,7 +153,7 @@ public void hooks_order_across_many_backends() throws Throwable { final List backend2Hooks = mockHooks(2, Integer.MAX_VALUE, 4); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); @@ -191,7 +188,7 @@ private List mockHooks(int... ordering) { for (int order : ordering) { HookDefinition hook = mock(HookDefinition.class, "Mock number " + order); when(hook.getOrder()).thenReturn(order); - when(hook.matches(ArgumentMatchers.anyList())).thenReturn(true); + when(hook.matches(ArgumentMatchers.anyList())).thenReturn(true); hooks.add(hook); } return hooks; diff --git a/core/src/test/java/io/cucumber/core/runner/HookTest.java b/core/src/test/java/io/cucumber/core/runner/HookTest.java index 35e38b310d..8fef4acf87 100644 --- a/core/src/test/java/io/cucumber/core/runner/HookTest.java +++ b/core/src/test/java/io/cucumber/core/runner/HookTest.java @@ -1,30 +1,25 @@ package io.cucumber.core.runner; -import io.cucumber.core.api.Scenario; +import gherkin.events.PickleEvent; +import gherkin.pickles.Pickle; +import gherkin.pickles.PickleLocation; +import gherkin.pickles.PickleStep; +import io.cucumber.core.api.TypeRegistryConfigurer; +import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.options.RuntimeOptions; -import gherkin.events.PickleEvent; -import gherkin.pickles.Argument; -import gherkin.pickles.Pickle; -import gherkin.pickles.PickleLocation; -import gherkin.pickles.PickleStep; -import gherkin.pickles.PickleTag; import io.cucumber.core.runtime.TimeServiceEventBus; -import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.InOrder; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -import java.net.URI; import java.time.Clock; import java.util.Collections; -import java.util.Locale; import static java.util.Collections.singletonList; import static org.mockito.ArgumentMatchers.any; @@ -37,38 +32,34 @@ public class HookTest { private final static String ENGLISH = "en"; private final EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); private final RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); - private final PickleStep pickleStep = new PickleStep("pattern1", Collections.emptyList(), singletonList(new PickleLocation(2, 2))); + private final PickleStep pickleStep = new PickleStep("pattern1", Collections.emptyList(), singletonList(new PickleLocation(2, 2))); private final PickleEvent pickleEvent = new PickleEvent("uri", - new Pickle("scenario1", ENGLISH, singletonList(pickleStep), Collections.emptyList(), singletonList(new PickleLocation(1, 1)))); + new Pickle("scenario1", ENGLISH, singletonList(pickleStep), Collections.emptyList(), singletonList(new PickleLocation(1, 1)))); /** * Test for #23. */ @Test public void after_hooks_execute_before_objects_are_disposed() throws Throwable { - Backend backend = mock(Backend.class); ObjectFactory objectFactory = mock(ObjectFactory.class); - TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); final HookDefinition hook = mock(HookDefinition.class); - when(hook.matches(ArgumentMatchers.anyCollection())).thenReturn(true); + TypeRegistryConfigurer typeRegistryConfigurer = mock(TypeRegistryConfigurer.class); + when(hook.matches(ArgumentMatchers.anyCollection())).thenReturn(true); - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) { - Glue glue = invocation.getArgument(0); - glue.addBeforeHook(hook); - return null; - } - }).when(backend).loadGlue(any(Glue.class), ArgumentMatchers.anyList()); + doAnswer(invocation -> { + Glue glue = invocation.getArgument(0); + glue.addBeforeHook(hook); + return null; + }).when(backend).loadGlue(any(Glue.class), ArgumentMatchers.anyList()); - Runner runner = new Runner(bus, Collections.singleton(backend), objectFactory, typeRegistry, runtimeOptions); + Runner runner = new Runner(bus, Collections.singleton(backend), objectFactory, typeRegistryConfigurer, runtimeOptions); runner.runPickle(pickleEvent); InOrder inOrder = inOrder(hook, backend); inOrder.verify(backend).buildWorld(); - inOrder.verify(hook).execute(ArgumentMatchers.any()); + inOrder.verify(hook).execute(ArgumentMatchers.any()); inOrder.verify(backend).disposeWorld(); } } diff --git a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java index bdb98a1bc4..465492bd04 100644 --- a/core/src/test/java/io/cucumber/core/runner/RunnerTest.java +++ b/core/src/test/java/io/cucumber/core/runner/RunnerTest.java @@ -6,6 +6,7 @@ import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; +import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.core.backend.Backend; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; @@ -15,7 +16,6 @@ import io.cucumber.core.options.RuntimeOptionsBuilder; import io.cucumber.core.runtime.TimeServiceEventBus; import io.cucumber.core.snippets.TestSnippet; -import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.InOrder; @@ -26,7 +26,6 @@ import java.time.Clock; import java.util.Collections; import java.util.List; -import java.util.Locale; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; @@ -52,7 +51,7 @@ public class RunnerTest { private final RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); private final EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); - private final TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); + private final TypeRegistryConfigurer typeRegistryConfigurer = typeRegistry -> {}; @Test public void hooks_execute_when_world_exist() throws Throwable { @@ -70,13 +69,13 @@ public Object answer(InvocationOnMock invocation) { glue.addBeforeHook(beforeHook); return null; } - }).when(backend).loadGlue(any(Glue.class), ArgumentMatchers.anyList()); + }).when(backend).loadGlue(any(Glue.class), ArgumentMatchers.anyList()); PickleStep step = mock(PickleStep.class); when(step.getText()).thenReturn("some step"); - new Runner(bus, singletonList(backend), objectFactory, typeRegistry, runtimeOptions).runPickle(createPickleEventWithSteps(asList(step))); + new Runner(bus, singletonList(backend), objectFactory, typeRegistryConfigurer, runtimeOptions).runPickle(createPickleEventWithSteps(asList(step))); InOrder inOrder = inOrder(beforeHook, afterHook, backend); inOrder.verify(backend).buildWorld(); @@ -91,8 +90,8 @@ public void steps_are_skipped_after_failure() throws Throwable { PickleEvent pickleEventMatchingStepDefinitions = createPickleEventMatchingStepDefinitions(stepDefinition); final HookDefinition failingBeforeHook = addBeforeHook(); - doThrow(RuntimeException.class).when(failingBeforeHook).execute(ArgumentMatchers.any()); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + doThrow(RuntimeException.class).when(failingBeforeHook).execute(ArgumentMatchers.any()); + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addBeforeHook(failingBeforeHook); @@ -112,7 +111,7 @@ public void aftersteps_are_executed_after_failed_step() throws Throwable { StubStepDefinition stepDefinition = spy(new StubStepDefinition("some step") { @Override - public void execute(Object[] args) throws Throwable { + public void execute(Object[] args) { throw new RuntimeException(); } }); @@ -121,7 +120,7 @@ public void execute(Object[] args) throws Throwable { final HookDefinition afteStepHook = addAfterStepHook(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addAfterHook(afteStepHook); @@ -144,7 +143,7 @@ public void aftersteps_executed_for_passed_step() throws Throwable { HookDefinition afteStepHook1 = addAfterStepHook(); HookDefinition afteStepHook2 = addAfterStepHook(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addAfterHook(afteStepHook1); @@ -168,7 +167,7 @@ public void hooks_execute_also_after_failure() throws Throwable { final HookDefinition beforeHook = addBeforeHook(); final HookDefinition afterHook = addAfterHook(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addBeforeHook(failingBeforeHook); @@ -188,10 +187,10 @@ public void loadGlue(Glue glue, List gluePaths) { } @Test - public void steps_are_executed() throws Throwable { + public void steps_are_executed() { StubStepDefinition stepDefinition = new StubStepDefinition("some step"); PickleEvent pickleEventMatchingStepDefinitions = createPickleEventMatchingStepDefinitions(stepDefinition); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); @@ -206,7 +205,7 @@ public void steps_are_not_executed_on_dry_run() { StubStepDefinition stepDefinition = new StubStepDefinition("some step"); PickleEvent pickleEvent = createPickleEventMatchingStepDefinitions(stepDefinition); RuntimeOptions runtimeOptions = new RuntimeOptionsBuilder().setDryRun().build(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { glue.addStepDefinition(stepDefinition); @@ -225,7 +224,7 @@ public void hooks_not_executed_in_dry_run_mode() throws Throwable { final HookDefinition afterHook = addAfterHook(); final HookDefinition afterStepHook = addAfterStepHook(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { @@ -250,7 +249,7 @@ public void hooks_not_executed_for_empty_pickles() throws Throwable { final HookDefinition afterHook = addAfterHook(); final HookDefinition afterStepHook = addAfterStepHook(); - TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, typeRegistry, runtimeOptions) { + TestRunnerSupplier runnerSupplier = new TestRunnerSupplier(bus, runtimeOptions) { @Override public void loadGlue(Glue glue, List gluePaths) { @@ -274,7 +273,7 @@ public void backends_are_asked_for_snippets_for_undefined_steps() { Backend backend = mock(Backend.class); when(backend.getSnippet()).thenReturn(new TestSnippet()); ObjectFactory objectFactory = mock(ObjectFactory.class); - Runner runner = new Runner(bus, singletonList(backend), objectFactory, typeRegistry, runtimeOptions); + Runner runner = new Runner(bus, singletonList(backend), objectFactory, typeRegistryConfigurer, runtimeOptions); runner.runPickle(createPickleEventWithSteps(asList(step))); verify(backend).getSnippet(); } @@ -293,7 +292,7 @@ private HookDefinition addAfterStepHook() { private HookDefinition addHook() { HookDefinition hook = mock(HookDefinition.class); - when(hook.matches(ArgumentMatchers.anyList())).thenReturn(true); + when(hook.matches(ArgumentMatchers.anyList())).thenReturn(true); return hook; } diff --git a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java index 0d5cea2e98..f68766e68d 100644 --- a/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java +++ b/core/src/test/java/io/cucumber/core/runner/TestRunnerSupplier.java @@ -8,21 +8,19 @@ import io.cucumber.core.runtime.RunnerSupplier; import io.cucumber.core.snippets.Snippet; import io.cucumber.core.snippets.TestSnippet; -import io.cucumber.core.stepexpression.TypeRegistry; import java.net.URI; -import java.util.Collections; import java.util.List; +import static java.util.Collections.singleton; + public class TestRunnerSupplier implements Backend, RunnerSupplier, ObjectFactory { private final EventBus bus; private final RuntimeOptions runtimeOptions; - private final TypeRegistry typeRegistry; - protected TestRunnerSupplier(EventBus bus, TypeRegistry typeRegistry, RuntimeOptions runtimeOptions) { + protected TestRunnerSupplier(EventBus bus, RuntimeOptions runtimeOptions) { this.bus = bus; - this.typeRegistry = typeRegistry; this.runtimeOptions = runtimeOptions; } @@ -48,7 +46,7 @@ public Snippet getSnippet() { @Override public Runner get() { - return new Runner(bus, Collections.singleton(this), this, typeRegistry, runtimeOptions); + return new Runner(bus, singleton(this), this, typeRegistry -> {}, runtimeOptions); } @Override diff --git a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java index 9369ffff38..3c2a56e9ea 100644 --- a/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/RuntimeTest.java @@ -60,7 +60,7 @@ import static java.util.Collections.singletonList; import static java.util.concurrent.TimeUnit.HOURS; import static java.util.concurrent.TimeUnit.SECONDS; -import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -573,7 +573,8 @@ public void receive(StepDefinedEvent event) { }; - final List definedStepDefinitions = new ArrayList<>(); + final MockedStepDefinition mockedStepDefinition = new MockedStepDefinition(); + final MockedScenarioScopedStepDefinition mockedScenarioScopedStepDefinition = new MockedScenarioScopedStepDefinition(); BackendSupplier backendSupplier = new TestBackendSupplier() { @@ -582,15 +583,11 @@ public void receive(StepDefinedEvent event) { @Override public void loadGlue(Glue glue, List gluePaths) { this.glue = glue; - final io.cucumber.core.backend.StepDefinition mockedStepDefinition = new MockedStepDefinition(); - definedStepDefinitions.add(mockedStepDefinition); glue.addStepDefinition(mockedStepDefinition); } @Override public void buildWorld() { - final io.cucumber.core.backend.StepDefinition mockedScenarioScopedStepDefinition = new MockedScenarioScopedStepDefinition(); - definedStepDefinitions.add(mockedScenarioScopedStepDefinition); glue.addStepDefinition(mockedScenarioScopedStepDefinition); } }; @@ -612,7 +609,14 @@ public List get() { .build() .run(); - assertThat(stepDefinedEvents, equalTo(definedStepDefinitions)); + + assertThat(stepDefinedEvents, contains( + mockedStepDefinition, + mockedScenarioScopedStepDefinition, + // Twice, once for each scenario + mockedStepDefinition, + mockedScenarioScopedStepDefinition + )); for (StepDefinition stepDefinedEvent : stepDefinedEvents) { if (stepDefinedEvent instanceof MockedScenarioScopedStepDefinition) { diff --git a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java index 990ec3a6e0..62f75ddf1e 100644 --- a/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/SingletonRunnerSupplierTest.java @@ -33,8 +33,8 @@ public void before() { ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(objectFactoryServiceLoader); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); EventBus eventBus = new TimeServiceEventBus(Clock.systemUTC()); - TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); - runnerSupplier = new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactory, typeRegistrySupplier); + TypeRegistryConfigurerSupplier typeRegistryConfigurerSupplier = new ScanningTypeRegistryConfigurerSupplier(classFinder, runtimeOptions); + runnerSupplier = new SingletonRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactory, typeRegistryConfigurerSupplier); } @Test diff --git a/core/src/test/java/io/cucumber/core/runtime/TestTypeRegistrySupplier.java b/core/src/test/java/io/cucumber/core/runtime/TestTypeRegistrySupplier.java deleted file mode 100644 index 85a86fc54e..0000000000 --- a/core/src/test/java/io/cucumber/core/runtime/TestTypeRegistrySupplier.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.cucumber.core.runtime; - -import io.cucumber.core.stepexpression.TypeRegistry; - -import java.util.Locale; - -public class TestTypeRegistrySupplier implements TypeRegistrySupplier { - - @Override - public TypeRegistry get() { - return new TypeRegistry(Locale.ENGLISH); - } -} diff --git a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java index 6ddc73ea15..063f3b42a9 100644 --- a/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java +++ b/core/src/test/java/io/cucumber/core/runtime/ThreadLocalRunnerSupplierTest.java @@ -42,8 +42,8 @@ public void before() { ObjectFactorySupplier objectFactory = new SingletonObjectFactorySupplier(objectFactoryServiceLoader); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactory); eventBus = new TimeServiceEventBus(Clock.systemUTC()); - TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); - runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactory, typeRegistrySupplier); + TypeRegistryConfigurerSupplier typeRegistryConfigurerSupplier = new ScanningTypeRegistryConfigurerSupplier(classFinder, runtimeOptions); + runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, eventBus, backendSupplier, objectFactory, typeRegistryConfigurerSupplier); } diff --git a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java index d5d0e7b4d1..62015a930e 100644 --- a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java @@ -1,6 +1,6 @@ package io.cucumber.java; -import io.cucumber.core.backend.DataTableTypeTypeDefinition; +import io.cucumber.core.backend.DataTableTypeDefinition; import io.cucumber.core.backend.Lookup; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.runtime.Invoker; @@ -17,7 +17,7 @@ import java.util.List; import java.util.Map; -class JavaDataTableTypeDefinition implements DataTableTypeTypeDefinition { +class JavaDataTableTypeDefinition implements DataTableTypeDefinition { private final Method method; private final Lookup lookup; diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 52ae39f414..4886bc59fd 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -1,38 +1,34 @@ package io.cucumber.java; -import io.cucumber.core.event.Result; -import io.cucumber.core.event.EventHandler; -import io.cucumber.core.event.TestStepFinished; -import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.java.en.Given; -import io.cucumber.core.runtime.TimeServiceEventBus; -import io.cucumber.core.eventbus.EventBus; -import io.cucumber.core.runner.Runner; -import io.cucumber.core.runner.AmbiguousStepDefinitionsException; -import io.cucumber.core.backend.Backend; -import io.cucumber.core.runtime.BackendSupplier; -import io.cucumber.core.backend.DuplicateStepDefinitionException; -import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; -import io.cucumber.core.io.MultiLoader; -import io.cucumber.core.io.ResourceLoader; import gherkin.events.PickleEvent; import gherkin.pickles.Argument; import gherkin.pickles.Pickle; import gherkin.pickles.PickleLocation; import gherkin.pickles.PickleStep; import gherkin.pickles.PickleTag; +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.event.Result; +import io.cucumber.core.event.TestStepFinished; +import io.cucumber.core.eventbus.EventBus; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.io.MultiLoader; +import io.cucumber.core.io.ResourceLoader; +import io.cucumber.core.options.RuntimeOptions; +import io.cucumber.core.runner.AmbiguousStepDefinitionsException; +import io.cucumber.core.runner.Runner; +import io.cucumber.core.runtime.BackendSupplier; +import io.cucumber.core.runtime.ObjectFactorySupplier; +import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; +import io.cucumber.core.runtime.TimeServiceEventBus; +import io.cucumber.core.runtime.TypeRegistryConfigurerSupplier; +import io.cucumber.java.en.Given; import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.function.Executable; import java.lang.reflect.Method; import java.time.Clock; -import java.util.Collection; import java.util.Collections; -import java.util.Locale; - -import io.cucumber.core.stepexpression.TypeRegistry; -import org.junit.jupiter.api.function.Executable; import static java.lang.Thread.currentThread; import static java.util.Arrays.asList; @@ -71,31 +67,30 @@ public void createBackendAndLoadNoGlue() { ClassLoader classLoader = currentThread().getContextClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); ObjectFactory objectFactory = new SingletonFactory(defs); - TypeRegistry typeRegistry = new TypeRegistry(Locale.ENGLISH); this.backend = new JavaBackend(objectFactory, objectFactory, resourceLoader); RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); - BackendSupplier backendSupplier = new BackendSupplier() { - @Override - public Collection get() { - return asList(backend); - } + BackendSupplier backendSupplier = () -> asList(backend); + ObjectFactorySupplier objectFactorySupplier = () -> objectFactory; + TypeRegistryConfigurerSupplier typeRegistryConfigurerSupplier = () -> typeRegistry -> { }; - this.runner = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, () -> objectFactory, () -> typeRegistry).get(); - - bus.registerHandlerFor(TestStepFinished.class, new EventHandler() { - @Override - public void receive(TestStepFinished event) { - latestReceivedResult = event.getResult(); - } - }); + this.runner = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier, typeRegistryConfigurerSupplier).get(); + + bus.registerHandlerFor(TestStepFinished.class, event -> latestReceivedResult = event.getResult()); } @Test public void throws_duplicate_when_two_stepdefs_with_same_regexp_found() { backend.addStepDefinition(THREE_BLIND_ANIMALS.getAnnotation(Given.class), THREE_DISABLED_MICE); - final Executable testMethod = () -> backend.addStepDefinition(THREE_BLIND_ANIMALS.getAnnotation(Given.class), THREE_BLIND_ANIMALS); - final DuplicateStepDefinitionException expectedThrown = assertThrows(DuplicateStepDefinitionException.class, testMethod); + backend.addStepDefinition(THREE_BLIND_ANIMALS.getAnnotation(Given.class), THREE_BLIND_ANIMALS); + + PickleTag tag = new PickleTag(mock(PickleLocation.class), "@foo"); + PickleStep step = new PickleStep("three blind mice", Collections.emptyList(), asList(mock(PickleLocation.class))); + Pickle pickle = new Pickle("pickle name", ENGLISH, asList(step), asList(tag), asList(mock(PickleLocation.class))); + PickleEvent pickleEvent = new PickleEvent("uri", pickle); + + final Executable testMethod = () -> runner.runPickle(pickleEvent); + final CucumberException expectedThrown = assertThrows(CucumberException.class, testMethod); assertThat(expectedThrown.getMessage(), is(startsWith("Duplicate step definitions in io.cucumber.java.JavaStepDefinitionTest$Defs.threeDisabledMice(String) in file:"))); } diff --git a/java8/src/main/java/io/cucumber/java8/Java8Backend.java b/java8/src/main/java/io/cucumber/java8/Java8Backend.java index 2e43c35baf..45ebf28b4f 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8Backend.java +++ b/java8/src/main/java/io/cucumber/java8/Java8Backend.java @@ -10,24 +10,22 @@ import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; import io.cucumber.core.snippets.Snippet; -import io.cucumber.core.stepexpression.TypeRegistry; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.function.Function; import static java.lang.Thread.currentThread; -final class Java8Backend implements Backend, LambdaGlueRegistry { +final class Java8Backend implements Backend { private final Lookup lookup; private final Container container; private final ClassFinder classFinder; - private Glue glue; private List> lambdaGlueClasses = new ArrayList<>(); + private Glue glue; Java8Backend(Lookup lookup, Container container, ResourceLoader resourceLoader) { this.classFinder = new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader()); @@ -55,15 +53,15 @@ public void loadGlue(Glue glue, List gluePaths) { public void buildWorld() { // Instantiate all the stepdef classes for java8 - the stepdef will be initialised // in the constructor. - INSTANCE.set(this); - for (Class lambdaGlueClass: lambdaGlueClasses) { + LambdaGlueRegistry.INSTANCE.set(new GlueAdaptor(glue)); + for (Class lambdaGlueClass : lambdaGlueClasses) { lookup.getInstance(lambdaGlueClass); } } @Override public void disposeWorld() { - INSTANCE.remove(); + LambdaGlueRegistry.INSTANCE.remove(); } @Override @@ -71,29 +69,42 @@ public Snippet getSnippet() { return new Java8Snippet(); } - @Override - public void addStepDefinition(StepDefinition stepDefinition) { - glue.addStepDefinition(stepDefinition); - } - @Override - public void addBeforeHookDefinition(HookDefinition beforeHook) { - glue.addBeforeHook(beforeHook); - } + private static final class GlueAdaptor implements LambdaGlueRegistry { - @Override - public void addAfterHookDefinition(HookDefinition afterHook) { - glue.addAfterHook(afterHook); - } + private final Glue glue; - @Override - public void addAfterStepHookDefinition(HookDefinition afterStepHook) { - glue.addAfterStepHook(afterStepHook); - } + private GlueAdaptor(Glue glue) { + this.glue = glue; + } - @Override - public void addBeforeStepHookDefinition(HookDefinition beforeStepHook) { - glue.addBeforeStepHook(beforeStepHook); + @Override + public void addStepDefinition(StepDefinition stepDefinition) { + glue.addStepDefinition(stepDefinition); + } + + @Override + public void addBeforeStepHookDefinition(HookDefinition beforeStepHook) { + glue.addBeforeStepHook(beforeStepHook); + + } + + @Override + public void addAfterStepHookDefinition(HookDefinition afterStepHook) { + glue.addAfterStepHook(afterStepHook); + + } + + @Override + public void addBeforeHookDefinition(HookDefinition beforeHook) { + glue.addBeforeHook(beforeHook); + + } + + @Override + public void addAfterHookDefinition(HookDefinition afterHook) { + glue.addAfterHook(afterHook); + } } } diff --git a/java8/src/main/java/io/cucumber/java8/LambdaGlue.java b/java8/src/main/java/io/cucumber/java8/LambdaGlue.java index 2f86e7422d..90a92b908e 100644 --- a/java8/src/main/java/io/cucumber/java8/LambdaGlue.java +++ b/java8/src/main/java/io/cucumber/java8/LambdaGlue.java @@ -16,7 +16,7 @@ public interface LambdaGlue { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void Before(final HookBody body) { - Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } /** @@ -26,7 +26,7 @@ default void Before(final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void Before(String tagExpression, final HookBody body) { - Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } /** @@ -36,7 +36,7 @@ default void Before(String tagExpression, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void Before(long timeoutMillis, final HookBody body) { - Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); } /** @@ -46,7 +46,7 @@ default void Before(long timeoutMillis, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void Before(int order, final HookBody body) { - Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -58,7 +58,7 @@ default void Before(int order, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void Before(String tagExpression, long timeoutMillis, int order, final HookBody body) { - Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -67,7 +67,7 @@ default void Before(String tagExpression, long timeoutMillis, int order, final H * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void Before(final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } /** @@ -77,7 +77,7 @@ default void Before(final HookNoArgsBody body) { * @param body lambda to execute */ default void Before(String tagExpression, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } /** @@ -87,7 +87,7 @@ default void Before(String tagExpression, final HookNoArgsBody body) { * @param body lambda to execute */ default void Before(long timeoutMillis, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); } /** @@ -97,7 +97,7 @@ default void Before(long timeoutMillis, final HookNoArgsBody body) { * @param body lambda to execute */ default void Before(int order, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -109,7 +109,7 @@ default void Before(int order, final HookNoArgsBody body) { * @param body lambda to execute */ default void Before(String tagExpression, long timeoutMillis, int order, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -118,7 +118,7 @@ default void Before(String tagExpression, long timeoutMillis, int order, final H * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void BeforeStep(final HookBody body) { - Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } /** @@ -128,7 +128,7 @@ default void BeforeStep(final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void BeforeStep(String tagExpression, final HookBody body) { - Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } /** @@ -138,7 +138,7 @@ default void BeforeStep(String tagExpression, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void BeforeStep(long timeoutMillis, final HookBody body) { - Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); } /** @@ -148,7 +148,7 @@ default void BeforeStep(long timeoutMillis, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void BeforeStep(int order, final HookBody body) { - Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -160,7 +160,7 @@ default void BeforeStep(int order, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void BeforeStep(String tagExpression, long timeoutMillis, int order, final HookBody body) { - Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -169,7 +169,7 @@ default void BeforeStep(String tagExpression, long timeoutMillis, int order, fin * @param body lambda to execute */ default void BeforeStep(final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } @@ -180,7 +180,7 @@ default void BeforeStep(final HookNoArgsBody body) { * @param body lambda to execute */ default void BeforeStep(String tagExpression, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_BEFORE_ORDER, NO_TIMEOUT, body)); } @@ -191,7 +191,7 @@ default void BeforeStep(String tagExpression, final HookNoArgsBody body) { * @param body lambda to execute */ default void BeforeStep(long timeoutMillis, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_BEFORE_ORDER, timeoutMillis, body)); } /** @@ -201,7 +201,7 @@ default void BeforeStep(long timeoutMillis, final HookNoArgsBody body) { * @param body lambda to execute */ default void BeforeStep(int order, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -213,7 +213,7 @@ default void BeforeStep(int order, final HookNoArgsBody body) { * @param body lambda to execute */ default void BeforeStep(String tagExpression, long timeoutMillis, int order, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addBeforeStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -222,7 +222,7 @@ default void BeforeStep(String tagExpression, long timeoutMillis, int order, fin * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void After(final HookBody body) { - Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -232,7 +232,7 @@ default void After(final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void After(String tagExpression, final HookBody body) { - Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -242,7 +242,7 @@ default void After(String tagExpression, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void After(long timeoutMillis, final HookBody body) { - Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); } /** @@ -252,7 +252,7 @@ default void After(long timeoutMillis, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void After(int order, final HookBody body) { - Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -264,7 +264,7 @@ default void After(int order, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void After(String tagExpression, long timeoutMillis, int order, final HookBody body) { - Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -273,7 +273,7 @@ default void After(String tagExpression, long timeoutMillis, int order, final Ho * @param body lambda to execute */ default void After(final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -283,7 +283,7 @@ default void After(final HookNoArgsBody body) { * @param body lambda to execute */ default void After(String tagExpression, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -293,7 +293,7 @@ default void After(String tagExpression, final HookNoArgsBody body) { * @param body lambda to execute */ default void After(long timeoutMillis, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); } /** @@ -303,7 +303,7 @@ default void After(long timeoutMillis, final HookNoArgsBody body) { * @param body lambda to execute */ default void After(int order, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -315,7 +315,7 @@ default void After(int order, final HookNoArgsBody body) { * @param body lambda to execute */ default void After(String tagExpression, long timeoutMillis, int order, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -324,7 +324,7 @@ default void After(String tagExpression, long timeoutMillis, int order, final Ho * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void AfterStep(final HookBody body) { - Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -334,7 +334,7 @@ default void AfterStep(final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void AfterStep(String tagExpression, final HookBody body) { - Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -344,7 +344,7 @@ default void AfterStep(String tagExpression, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void AfterStep(long timeoutMillis, final HookBody body) { - Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); } /** @@ -354,7 +354,7 @@ default void AfterStep(long timeoutMillis, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void AfterStep(int order, final HookBody body) { - Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -366,7 +366,7 @@ default void AfterStep(int order, final HookBody body) { * @param body lambda to execute, takes {@link io.cucumber.core.api.Scenario} as an argument */ default void AfterStep(String tagExpression, long timeoutMillis, int order, final HookBody body) { - Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } /** @@ -375,7 +375,7 @@ default void AfterStep(String tagExpression, long timeoutMillis, int order, fina * @param body lambda to execute */ default void AfterStep(final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -385,7 +385,7 @@ default void AfterStep(final HookNoArgsBody body) { * @param body lambda to execute */ default void AfterStep(String tagExpression, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, DEFAULT_AFTER_ORDER, NO_TIMEOUT, body)); } /** @@ -395,7 +395,7 @@ default void AfterStep(String tagExpression, final HookNoArgsBody body) { * @param body lambda to execute */ default void AfterStep(long timeoutMillis, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, DEFAULT_AFTER_ORDER, timeoutMillis, body)); } /** @@ -405,7 +405,7 @@ default void AfterStep(long timeoutMillis, final HookNoArgsBody body) { * @param body lambda to execute */ default void AfterStep(int order, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(EMPTY_TAG_EXPRESSIONS, order, NO_TIMEOUT, body)); } /** @@ -417,7 +417,7 @@ default void AfterStep(int order, final HookNoArgsBody body) { * @param body lambda to execute */ default void AfterStep(String tagExpression, long timeoutMillis, int order, final HookNoArgsBody body) { - Java8Backend.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); + LambdaGlueRegistry.INSTANCE.get().addAfterStepHookDefinition(new Java8HookDefinition(tagExpression, order, timeoutMillis, body)); } } diff --git a/java8/src/test/java/io/cucumber/java8/AnonInnerClassStepdefs.java b/java8/src/test/java/io/cucumber/java8/AnonInnerClassStepdefs.java index f4ec246e76..e604320659 100644 --- a/java8/src/test/java/io/cucumber/java8/AnonInnerClassStepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/AnonInnerClassStepdefs.java @@ -5,7 +5,7 @@ public class AnonInnerClassStepdefs implements LambdaGlue { public AnonInnerClassStepdefs() { - Java8Backend.INSTANCE.get().addStepDefinition( + LambdaGlueRegistry.INSTANCE.get().addStepDefinition( Java8StepDefinition.create( "I have {int} java7 beans in my {word}", StepdefBody.A2.class, new StepdefBody.A2() { diff --git a/junit/src/main/java/io/cucumber/junit/Cucumber.java b/junit/src/main/java/io/cucumber/junit/Cucumber.java index b8e64438f4..719e32eb22 100644 --- a/junit/src/main/java/io/cucumber/junit/Cucumber.java +++ b/junit/src/main/java/io/cucumber/junit/Cucumber.java @@ -9,7 +9,7 @@ import io.cucumber.core.options.CucumberProperties; import io.cucumber.core.options.CucumberPropertiesParser; import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; +import io.cucumber.core.runtime.ScanningTypeRegistryConfigurerSupplier; import io.cucumber.core.runtime.ObjectFactorySupplier; import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier; import io.cucumber.core.eventbus.EventBus; @@ -27,7 +27,7 @@ import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; import io.cucumber.core.feature.CucumberFeature; -import io.cucumber.core.runtime.TypeRegistrySupplier; +import io.cucumber.core.runtime.TypeRegistryConfigurerSupplier; import org.apiguardian.api.API; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -146,8 +146,8 @@ public Cucumber(Class clazz) throws InitializationError { ObjectFactoryServiceLoader objectFactoryServiceLoader = new ObjectFactoryServiceLoader(runtimeOptions); ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(objectFactoryServiceLoader); BackendSupplier backendSupplier = new BackendServiceLoader(resourceLoader, objectFactorySupplier); - TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); - ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier, typeRegistrySupplier); + TypeRegistryConfigurerSupplier typeRegistryConfigurerSupplier = new ScanningTypeRegistryConfigurerSupplier(classFinder, runtimeOptions); + ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier, typeRegistryConfigurerSupplier); Filters filters = new Filters(runtimeOptions); for (CucumberFeature cucumberFeature : features) { FeatureRunner featureRunner = new FeatureRunner(cucumberFeature, filters, runnerSupplier, junitOptions); diff --git a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java index 857fa645e5..44de8db0ec 100644 --- a/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java +++ b/junit/src/test/java/io/cucumber/junit/FeatureRunnerTest.java @@ -10,7 +10,7 @@ import io.cucumber.core.io.ResourceLoaderClassFinder; import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runtime.BackendSupplier; -import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; +import io.cucumber.core.runtime.ScanningTypeRegistryConfigurerSupplier; import io.cucumber.core.runtime.ObjectFactorySupplier; import io.cucumber.core.runtime.RunnerSupplier; import io.cucumber.core.runtime.SingletonObjectFactorySupplier; @@ -181,7 +181,7 @@ public Clock withZone(ZoneId zone) { ClassLoader classLoader = ClassLoader.getSystemClassLoader(); ResourceLoader resourceLoader = new MultiLoader(classLoader); ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - ConfiguringTypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); + ScanningTypeRegistryConfigurerSupplier typeRegistrySupplier = new ScanningTypeRegistryConfigurerSupplier(classFinder, runtimeOptions); ThreadLocalRunnerSupplier runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactory, typeRegistrySupplier); return new FeatureRunner(cucumberFeature, filters, runnerSupplier, junitOption); } diff --git a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java index 43092f2bdd..4fc0206404 100644 --- a/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java @@ -23,13 +23,13 @@ import io.cucumber.core.plugin.Plugins; import io.cucumber.core.runner.Runner; import io.cucumber.core.runtime.BackendServiceLoader; -import io.cucumber.core.runtime.ConfiguringTypeRegistrySupplier; +import io.cucumber.core.runtime.ScanningTypeRegistryConfigurerSupplier; import io.cucumber.core.runtime.FeaturePathFeatureSupplier; import io.cucumber.core.runtime.ObjectFactorySupplier; import io.cucumber.core.runtime.ThreadLocalObjectFactorySupplier; import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; import io.cucumber.core.runtime.TimeServiceEventBus; -import io.cucumber.core.runtime.TypeRegistrySupplier; +import io.cucumber.core.runtime.TypeRegistryConfigurerSupplier; import org.apiguardian.api.API; import java.time.Clock; @@ -95,8 +95,8 @@ public TestNGCucumberRunner(Class clazz) { ObjectFactorySupplier objectFactorySupplier = new ThreadLocalObjectFactorySupplier(objectFactoryServiceLoader); BackendServiceLoader backendSupplier = new BackendServiceLoader(resourceLoader, objectFactorySupplier); this.filters = new Filters(runtimeOptions); - TypeRegistrySupplier typeRegistrySupplier = new ConfiguringTypeRegistrySupplier(classFinder, runtimeOptions); - this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier, typeRegistrySupplier); + TypeRegistryConfigurerSupplier typeRegistryConfigurerSupplier = new ScanningTypeRegistryConfigurerSupplier(classFinder, runtimeOptions); + this.runnerSupplier = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier, typeRegistryConfigurerSupplier); } public void runScenario(PickleEvent pickle) throws Throwable { From d12528451c7c46e8f604387515d4fb1ee7915933 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 21 Jul 2019 23:34:47 +0200 Subject: [PATCH 128/155] [JUnit] Improve README.md --- junit/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/junit/README.md b/junit/README.md index a03994f8c8..417cc79dcc 100644 --- a/junit/README.md +++ b/junit/README.md @@ -1,9 +1,7 @@ Cucumber JUnit ============== -Use JUnit to execute cucumber scenarios. - -Add the `cucumber-junit` dependency to your pom.xml: +Use JUnit to execute cucumber scenarios. To use add the `cucumber-junit` dependency to your pom.xml: ```xml From 1b72c716ae58c9f39ad5da46f0d720ca50a59f79 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 21 Jul 2019 23:35:00 +0200 Subject: [PATCH 129/155] [TestNG] Improve README.md --- testng/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/testng/README.md b/testng/README.md index e4ff4ef645..00c5005af6 100644 --- a/testng/README.md +++ b/testng/README.md @@ -1,9 +1,7 @@ Cucumber TestNG ============== -Use TestNG to execute cucumber scenarios. - -Add the `cucumber-testng` dependency to your pom. +Use TestNG to execute cucumber scenarios. To use add the `cucumber-testng` dependency to your pom. ```xml From ef85ddfab4512259af0b9eec1d683ad0701c0046 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 21 Jul 2019 23:35:35 +0200 Subject: [PATCH 130/155] [Core] Add TypeRegistryHooks to Glue --- .../core/backend/DataTableTypeDefinition.java | 10 +- ...ultDataTableCellTransformerDefinition.java | 20 ++ ...ltDataTableEntryTransformerDefinition.java | 19 ++ ...DefaultParameterTransformerDefinition.java | 19 ++ .../java/io/cucumber/core/backend/Glue.java | 6 + .../core/backend/ParameterTypeDefinition.java | 8 + .../cucumber/core/event/StepDefinition.java | 2 +- .../io/cucumber/core/runner/CachingGlue.java | 65 +++++ ...icateDefaultDataTableCellTransformers.java | 20 ++ ...cateDefaultDataTableEntryTransformers.java | 20 ++ ...DuplicateDefaultParameterTransformers.java | 20 ++ .../DuplicateStepDefinitionException.java | 2 +- .../cucumber/core/runner/CachingGlueTest.java | 239 ++++++++++++++++-- 13 files changed, 419 insertions(+), 31 deletions(-) create mode 100644 core/src/main/java/io/cucumber/core/backend/DefaultDataTableCellTransformerDefinition.java create mode 100644 core/src/main/java/io/cucumber/core/backend/DefaultDataTableEntryTransformerDefinition.java create mode 100644 core/src/main/java/io/cucumber/core/backend/DefaultParameterTransformerDefinition.java create mode 100644 core/src/main/java/io/cucumber/core/runner/DuplicateDefaultDataTableCellTransformers.java create mode 100644 core/src/main/java/io/cucumber/core/runner/DuplicateDefaultDataTableEntryTransformers.java create mode 100644 core/src/main/java/io/cucumber/core/runner/DuplicateDefaultParameterTransformers.java diff --git a/core/src/main/java/io/cucumber/core/backend/DataTableTypeDefinition.java b/core/src/main/java/io/cucumber/core/backend/DataTableTypeDefinition.java index 0fde393184..40ff965f08 100644 --- a/core/src/main/java/io/cucumber/core/backend/DataTableTypeDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/DataTableTypeDefinition.java @@ -3,9 +3,17 @@ import io.cucumber.datatable.DataTableType; import org.apiguardian.api.API; -@API(status = API.Status.EXPERIMENTAL) +@API(status = API.Status.STABLE) public interface DataTableTypeDefinition { DataTableType dataTableType(); + /** + * The source line where the data table type is defined. + * Example: com/example/app/Cucumber.test():42 + * + * @param detail true if extra detailed location information should be included. + * @return The source line of the step definition. + */ + String getLocation(boolean detail); } diff --git a/core/src/main/java/io/cucumber/core/backend/DefaultDataTableCellTransformerDefinition.java b/core/src/main/java/io/cucumber/core/backend/DefaultDataTableCellTransformerDefinition.java new file mode 100644 index 0000000000..8c8ad6db91 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/DefaultDataTableCellTransformerDefinition.java @@ -0,0 +1,20 @@ +package io.cucumber.core.backend; + +import io.cucumber.datatable.TableCellByTypeTransformer; +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE) +public interface DefaultDataTableCellTransformerDefinition { + + TableCellByTypeTransformer tableCellByTypeTransformer(); + + /** + * The source line where the default data table cell is defined. + * Example: com/example/app/Cucumber.test():42 + * + * @param detail true if extra detailed location information should be included. + * @return The source line of the step definition. + */ + String getLocation(boolean detail); + +} diff --git a/core/src/main/java/io/cucumber/core/backend/DefaultDataTableEntryTransformerDefinition.java b/core/src/main/java/io/cucumber/core/backend/DefaultDataTableEntryTransformerDefinition.java new file mode 100644 index 0000000000..3db632f6f5 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/DefaultDataTableEntryTransformerDefinition.java @@ -0,0 +1,19 @@ +package io.cucumber.core.backend; + +import io.cucumber.datatable.TableEntryByTypeTransformer; +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE) +public interface DefaultDataTableEntryTransformerDefinition { + + TableEntryByTypeTransformer tableEntryByTypeTransformer(); + + /** + * The source line where the default table entry transformer is defined. + * Example: com/example/app/Cucumber.test():42 + * + * @param detail true if extra detailed location information should be included. + * @return The source line of the step definition. + */ + String getLocation(boolean detail); +} diff --git a/core/src/main/java/io/cucumber/core/backend/DefaultParameterTransformerDefinition.java b/core/src/main/java/io/cucumber/core/backend/DefaultParameterTransformerDefinition.java new file mode 100644 index 0000000000..14c0103d29 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/backend/DefaultParameterTransformerDefinition.java @@ -0,0 +1,19 @@ +package io.cucumber.core.backend; + +import io.cucumber.cucumberexpressions.ParameterByTypeTransformer; +import org.apiguardian.api.API; + +@API(status = API.Status.STABLE) +public interface DefaultParameterTransformerDefinition { + + ParameterByTypeTransformer parameterByTypeTransformer(); + + /** + * The source line where the default parameter transformer is defined. + * Example: com/example/app/Cucumber.test():42 + * + * @param detail true if extra detailed location information should be included. + * @return The source line of the step definition. + */ + String getLocation(boolean detail); +} diff --git a/core/src/main/java/io/cucumber/core/backend/Glue.java b/core/src/main/java/io/cucumber/core/backend/Glue.java index b14bf4bbd6..5da600fd72 100644 --- a/core/src/main/java/io/cucumber/core/backend/Glue.java +++ b/core/src/main/java/io/cucumber/core/backend/Glue.java @@ -19,4 +19,10 @@ public interface Glue { void addDataTableType(DataTableTypeDefinition dataTableTypeDefinition); + void addDefaultParameterTransformer(DefaultParameterTransformerDefinition defaultParameterTransformer); + + void addDefaultDataTableEntryTransformer(DefaultDataTableEntryTransformerDefinition defaultDataTableEntryTransformer); + + void addDefaultDataTableCellTransformer(DefaultDataTableCellTransformerDefinition defaultDataTableCellTransformer); + } diff --git a/core/src/main/java/io/cucumber/core/backend/ParameterTypeDefinition.java b/core/src/main/java/io/cucumber/core/backend/ParameterTypeDefinition.java index bc7da3213f..e0956cbcb4 100644 --- a/core/src/main/java/io/cucumber/core/backend/ParameterTypeDefinition.java +++ b/core/src/main/java/io/cucumber/core/backend/ParameterTypeDefinition.java @@ -8,4 +8,12 @@ public interface ParameterTypeDefinition { ParameterType parameterType(); + /** + * The source line where the parameter type is defined. + * Example: com/example/app/Cucumber.test():42 + * + * @param detail true if extra detailed location information should be included. + * @return The source line of the step definition. + */ + String getLocation(boolean detail); } diff --git a/core/src/main/java/io/cucumber/core/event/StepDefinition.java b/core/src/main/java/io/cucumber/core/event/StepDefinition.java index b43e083565..3f6353a619 100644 --- a/core/src/main/java/io/cucumber/core/event/StepDefinition.java +++ b/core/src/main/java/io/cucumber/core/event/StepDefinition.java @@ -8,7 +8,7 @@ public interface StepDefinition { /** * The source line where the step definition is defined. - * Example: foo/bar/Zap.brainfuck:42 + * Example: com/example/app/Cucumber.test():42 * * @param detail true if extra detailed location information should be included. * @return The source line of the step definition. diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 7ddd1856ed..dc80647e7a 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -2,6 +2,9 @@ import gherkin.pickles.PickleStep; import io.cucumber.core.backend.DataTableTypeDefinition; +import io.cucumber.core.backend.DefaultDataTableCellTransformerDefinition; +import io.cucumber.core.backend.DefaultDataTableEntryTransformerDefinition; +import io.cucumber.core.backend.DefaultParameterTransformerDefinition; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.ParameterTypeDefinition; @@ -10,6 +13,9 @@ import io.cucumber.core.eventbus.EventBus; import io.cucumber.core.stepexpression.Argument; import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.cucumberexpressions.ParameterByTypeTransformer; +import io.cucumber.datatable.TableCellByTypeTransformer; +import io.cucumber.datatable.TableEntryByTypeTransformer; import java.util.ArrayList; import java.util.HashMap; @@ -24,6 +30,9 @@ final class CachingGlue implements Glue { private final List parameterTypeDefinitions = new ArrayList<>(); private final List dataTableTypeDefinitions = new ArrayList<>(); + private final List defaultParameterTransformers = new ArrayList<>(); + private final List defaultDataTableEntryTransformers = new ArrayList<>(); + private final List defaultDataTableCellTransformers = new ArrayList<>(); private final List beforeHooks = new ArrayList<>(); private final List beforeStepHooks = new ArrayList<>(); @@ -42,6 +51,7 @@ final class CachingGlue implements Glue { private final EventBus bus; + CachingGlue(EventBus bus) { this.bus = bus; } @@ -85,6 +95,21 @@ public void addDataTableType(DataTableTypeDefinition dataTableTypeDefinition) { dataTableTypeDefinitions.add(dataTableTypeDefinition); } + @Override + public void addDefaultParameterTransformer(DefaultParameterTransformerDefinition defaultParameterTransformer) { + defaultParameterTransformers.add(defaultParameterTransformer); + } + + @Override + public void addDefaultDataTableEntryTransformer(DefaultDataTableEntryTransformerDefinition defaultDataTableEntryTransformer) { + defaultDataTableEntryTransformers.add(defaultDataTableEntryTransformer); + } + + @Override + public void addDefaultDataTableCellTransformer(DefaultDataTableCellTransformerDefinition defaultDataTableCellTransformer) { + defaultDataTableCellTransformers.add(defaultDataTableCellTransformer); + } + List getBeforeHooks() { return new ArrayList<>(beforeHooks); } @@ -121,10 +146,47 @@ Map getStepDefinitionsByPattern() { return stepDefinitionsByPattern; } + List getDefaultParameterTransformers() { + return defaultParameterTransformers; + } + + List getDefaultDataTableEntryTransformers() { + return defaultDataTableEntryTransformers; + } + + List getDefaultDataTableCellTransformers() { + return defaultDataTableCellTransformers; + } + void prepareGlue(TypeRegistry typeRegistry) throws DuplicateStepDefinitionException { parameterTypeDefinitions.forEach(ptd -> typeRegistry.defineParameterType(ptd.parameterType())); dataTableTypeDefinitions.forEach(dtd -> typeRegistry.defineDataTableType(dtd.dataTableType())); + if (defaultParameterTransformers.size() == 1) { + DefaultParameterTransformerDefinition definition = defaultParameterTransformers.get(0); + ParameterByTypeTransformer transformer = definition.parameterByTypeTransformer(); + typeRegistry.setDefaultParameterTransformer(transformer); + } else if (defaultParameterTransformers.size() > 1) { + throw new DuplicateDefaultParameterTransformers(defaultParameterTransformers); + } + + if (defaultDataTableEntryTransformers.size() == 1) { + DefaultDataTableEntryTransformerDefinition definition = defaultDataTableEntryTransformers.get(0); + TableEntryByTypeTransformer transformer = definition.tableEntryByTypeTransformer(); + typeRegistry.setDefaultDataTableEntryTransformer(transformer); + } else if (defaultDataTableEntryTransformers.size() > 1) { + throw new DuplicateDefaultDataTableEntryTransformers(defaultDataTableEntryTransformers); + } + + + if (defaultDataTableCellTransformers.size() == 1) { + DefaultDataTableCellTransformerDefinition definition = defaultDataTableCellTransformers.get(0); + TableCellByTypeTransformer transformer = definition.tableCellByTypeTransformer(); + typeRegistry.setDefaultDataTableCellTransformer(transformer); + } else if (defaultDataTableCellTransformers.size() > 1) { + throw new DuplicateDefaultDataTableCellTransformers(defaultDataTableCellTransformers); + } + stepDefinitions.forEach(stepDefinition -> { CoreStepDefinition coreStepDefinition = new CoreStepDefinition(stepDefinition, typeRegistry); CoreStepDefinition previous = stepDefinitionsByPattern.get(stepDefinition.getPattern()); @@ -200,6 +262,9 @@ void removeScenarioScopedGlue() { removeScenarioScopedGlue(stepDefinitions); removeScenarioScopedGlue(dataTableTypeDefinitions); removeScenarioScopedGlue(parameterTypeDefinitions); + removeScenarioScopedGlue(defaultParameterTransformers); + removeScenarioScopedGlue(defaultDataTableEntryTransformers); + removeScenarioScopedGlue(defaultDataTableCellTransformers); } private void removeScenarioScopedGlue(List glue) { diff --git a/core/src/main/java/io/cucumber/core/runner/DuplicateDefaultDataTableCellTransformers.java b/core/src/main/java/io/cucumber/core/runner/DuplicateDefaultDataTableCellTransformers.java new file mode 100644 index 0000000000..26446a51e5 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runner/DuplicateDefaultDataTableCellTransformers.java @@ -0,0 +1,20 @@ +package io.cucumber.core.runner; + +import io.cucumber.core.backend.DefaultDataTableCellTransformerDefinition; +import io.cucumber.core.exception.CucumberException; + +import java.util.List; + +import static java.util.stream.Collectors.joining; + +class DuplicateDefaultDataTableCellTransformers extends CucumberException { + DuplicateDefaultDataTableCellTransformers(List definitions) { + super(createMessage(definitions)); + } + + private static String createMessage(List definitions) { + return "There may not be more then one default table cell transformers. Found:" + definitions.stream() + .map(d -> d.getLocation(true)) + .collect(joining("\n - ", "\n - ", "\n")); + } +} diff --git a/core/src/main/java/io/cucumber/core/runner/DuplicateDefaultDataTableEntryTransformers.java b/core/src/main/java/io/cucumber/core/runner/DuplicateDefaultDataTableEntryTransformers.java new file mode 100644 index 0000000000..16ed120bee --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runner/DuplicateDefaultDataTableEntryTransformers.java @@ -0,0 +1,20 @@ +package io.cucumber.core.runner; + +import io.cucumber.core.backend.DefaultDataTableEntryTransformerDefinition; +import io.cucumber.core.exception.CucumberException; + +import java.util.List; + +import static java.util.stream.Collectors.joining; + +class DuplicateDefaultDataTableEntryTransformers extends CucumberException { + DuplicateDefaultDataTableEntryTransformers(List definitions) { + super(createMessage(definitions)); + } + + private static String createMessage(List definitions) { + return "There may not be more then one default data table entry. Found:" + definitions.stream() + .map(d -> d.getLocation(true)) + .collect(joining("\n - ", "\n - ", "\n")); + } +} diff --git a/core/src/main/java/io/cucumber/core/runner/DuplicateDefaultParameterTransformers.java b/core/src/main/java/io/cucumber/core/runner/DuplicateDefaultParameterTransformers.java new file mode 100644 index 0000000000..b52f1313f7 --- /dev/null +++ b/core/src/main/java/io/cucumber/core/runner/DuplicateDefaultParameterTransformers.java @@ -0,0 +1,20 @@ +package io.cucumber.core.runner; + +import io.cucumber.core.backend.DefaultParameterTransformerDefinition; +import io.cucumber.core.exception.CucumberException; + +import java.util.List; + +import static java.util.stream.Collectors.joining; + +class DuplicateDefaultParameterTransformers extends CucumberException { + DuplicateDefaultParameterTransformers(List definitions) { + super(createMessage(definitions)); + } + + private static String createMessage(List definitions) { + return "There may not be more then one default parameter transformer. Found:" + definitions.stream() + .map(d -> d.getLocation(true)) + .collect(joining("\n - ", "\n - ", "\n")); + } +} diff --git a/core/src/main/java/io/cucumber/core/runner/DuplicateStepDefinitionException.java b/core/src/main/java/io/cucumber/core/runner/DuplicateStepDefinitionException.java index e8653787da..bde5758872 100644 --- a/core/src/main/java/io/cucumber/core/runner/DuplicateStepDefinitionException.java +++ b/core/src/main/java/io/cucumber/core/runner/DuplicateStepDefinitionException.java @@ -9,6 +9,6 @@ final class DuplicateStepDefinitionException extends CucumberException { } private static String createMessage(StepDefinition a, StepDefinition b) { - return String.format("Duplicate step definitions in %s and %s", a.getLocation(true), b.getLocation(true)); + return "Duplicate step definitions in " + a.getLocation(true) + " and " + b.getLocation(true); } } diff --git a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java index 8e5f2ccddf..02130f799f 100644 --- a/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java +++ b/core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java @@ -1,37 +1,30 @@ package io.cucumber.core.runner; -import gherkin.pickles.Argument; -import gherkin.pickles.PickleCell; -import gherkin.pickles.PickleLocation; -import gherkin.pickles.PickleRow; -import gherkin.pickles.PickleStep; -import gherkin.pickles.PickleString; -import gherkin.pickles.PickleTable; -import gherkin.pickles.PickleTag; +import gherkin.pickles.*; import io.cucumber.core.api.Scenario; -import io.cucumber.core.backend.DataTableTypeDefinition; -import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.backend.ParameterInfo; -import io.cucumber.core.backend.ParameterTypeDefinition; -import io.cucumber.core.backend.StepDefinition; +import io.cucumber.core.backend.*; import io.cucumber.core.runtime.TimeServiceEventBus; import io.cucumber.core.stepexpression.TypeRegistry; +import io.cucumber.cucumberexpressions.ParameterByTypeTransformer; import io.cucumber.cucumberexpressions.ParameterType; import io.cucumber.datatable.DataTable; import io.cucumber.datatable.DataTableType; +import io.cucumber.datatable.TableCellByTypeTransformer; +import io.cucumber.datatable.TableEntryByTypeTransformer; import org.junit.Test; import java.time.Clock; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import static java.util.Collections.singletonList; import static java.util.Locale.ENGLISH; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -52,14 +45,62 @@ public void throws_duplicate_error_on_dupe_stepdefs() { when(b.getLocation(true)).thenReturn("bar.bf:90"); glue.addStepDefinition(b); - try { - glue.prepareGlue(typeRegistry); - fail("should have failed"); - } catch (DuplicateStepDefinitionException expected) { - assertEquals("Duplicate step definitions in foo.bf:10 and bar.bf:90", expected.getMessage()); - } + DuplicateStepDefinitionException exception = assertThrows( + DuplicateStepDefinitionException.class, + () -> glue.prepareGlue(typeRegistry) + ); + assertThat(exception.getMessage(), equalTo("Duplicate step definitions in foo.bf:10 and bar.bf:90")); + } + + @Test + public void throws_on_duplicate_default_parameter_transformer() { + glue.addDefaultParameterTransformer(new MockedDefaultParameterTransformer()); + glue.addDefaultParameterTransformer(new MockedDefaultParameterTransformer()); + + DuplicateDefaultParameterTransformers exception = assertThrows( + DuplicateDefaultParameterTransformers.class, + () -> glue.prepareGlue(typeRegistry) + ); + assertThat(exception.getMessage(), equalTo("" + + "There may not be more then one default parameter transformer. Found:\n" + + " - mocked default parameter transformer\n" + + " - mocked default parameter transformer\n" + )); + } + + @Test + public void throws_on_duplicate_default_table_entry_transformer() { + glue.addDefaultDataTableEntryTransformer(new MockedDefaultDataTableEntryTransformer()); + glue.addDefaultDataTableEntryTransformer(new MockedDefaultDataTableEntryTransformer()); + + DuplicateDefaultDataTableEntryTransformers exception = assertThrows( + DuplicateDefaultDataTableEntryTransformers.class, + () -> glue.prepareGlue(typeRegistry) + ); + assertThat(exception.getMessage(), equalTo("" + + "There may not be more then one default data table entry. Found:\n" + + " - mocked default data table entry transformer\n" + + " - mocked default data table entry transformer\n" + )); } + @Test + public void throws_on_duplicate_default_table_cell_transformer() { + glue.addDefaultDataTableCellTransformer(new MockedDefaultDataTableCellTransformer()); + glue.addDefaultDataTableCellTransformer(new MockedDefaultDataTableCellTransformer()); + + DuplicateDefaultDataTableCellTransformers exception = assertThrows( + DuplicateDefaultDataTableCellTransformers.class, + () -> glue.prepareGlue(typeRegistry) + ); + assertThat(exception.getMessage(), equalTo("" + + "There may not be more then one default table cell transformers. Found:\n" + + " - mocked default data table cell transformer\n" + + " - mocked default data table cell transformer\n" + )); + } + + @Test public void removes_glue_that_is_scenario_scoped() { // This test is a bit fragile - it is testing state, not behaviour. @@ -69,24 +110,39 @@ public void removes_glue_that_is_scenario_scoped() { glue.addStepDefinition(new MockedScenarioScopedStepDefinition("pattern")); glue.addBeforeHook(new MockedScenarioScopedHookDefinition()); glue.addAfterHook(new MockedScenarioScopedHookDefinition()); + glue.addBeforeStepHook(new MockedScenarioScopedHookDefinition()); + glue.addAfterStepHook(new MockedScenarioScopedHookDefinition()); glue.addDataTableType(new MockedDataTableTypeDefinition()); - glue.addParameterType(new MockedParemterTypeDefinition()); + glue.addParameterType(new MockedParameterTypeDefinition()); + glue.addDefaultParameterTransformer(new MockedDefaultParameterTransformer()); + glue.addDefaultDataTableCellTransformer(new MockedDefaultDataTableCellTransformer()); + glue.addDefaultDataTableEntryTransformer(new MockedDefaultDataTableEntryTransformer()); glue.prepareGlue(typeRegistry); assertEquals(1, glue.getStepDefinitions().size()); assertEquals(1, glue.getBeforeHooks().size()); assertEquals(1, glue.getAfterHooks().size()); + assertEquals(1, glue.getBeforeStepHooks().size()); + assertEquals(1, glue.getAfterStepHooks().size()); assertEquals(1, glue.getDataTableTypeDefinitions().size()); assertEquals(1, glue.getParameterTypeDefinitions().size()); + assertEquals(1, glue.getDefaultParameterTransformers().size()); + assertEquals(1, glue.getDefaultDataTableCellTransformers().size()); + assertEquals(1, glue.getDefaultDataTableEntryTransformers().size()); glue.removeScenarioScopedGlue(); assertEquals(0, glue.getStepDefinitions().size()); assertEquals(0, glue.getBeforeHooks().size()); assertEquals(0, glue.getAfterHooks().size()); + assertEquals(0, glue.getBeforeStepHooks().size()); + assertEquals(0, glue.getAfterStepHooks().size()); assertEquals(0, glue.getDataTableTypeDefinitions().size()); assertEquals(0, glue.getParameterTypeDefinitions().size()); + assertEquals(0, glue.getDefaultParameterTransformers().size()); + assertEquals(0, glue.getDefaultDataTableCellTransformers().size()); + assertEquals(0, glue.getDefaultDataTableEntryTransformers().size()); } @Test @@ -187,17 +243,63 @@ public void returns_match_from_cache_for_ste_with_doc_string() { PickleStepDefinitionMatch match2 = glue.stepDefinitionMatch(featurePath, pickleStep2); //check arguments assertEquals("doc string 2", match2.getArguments().get(0).getValue()); + } + @Test + public void returns_fresh_match_from_cache_after_evicting_scenario_scoped() { + String featurePath = "someFeature.feature"; + String stepText = "pattern1"; + PickleStep pickleStep1 = getPickleStep(stepText); + + + StepDefinition stepDefinition1 = new MockedScenarioScopedStepDefinition("^pattern1"); + glue.addStepDefinition(stepDefinition1); + glue.prepareGlue(typeRegistry); + + + PickleStepDefinitionMatch pickleStepDefinitionMatch = glue.stepDefinitionMatch(featurePath, pickleStep1); + assertEquals(stepDefinition1, pickleStepDefinitionMatch.getStepDefinition()); + + glue.removeScenarioScopedGlue(); + StepDefinition stepDefinition2 = new MockedScenarioScopedStepDefinition("^pattern1"); + glue.addStepDefinition(stepDefinition2); + glue.prepareGlue(typeRegistry); + + PickleStepDefinitionMatch pickleStepDefinitionMatch2 = glue.stepDefinitionMatch(featurePath, pickleStep1); + assertEquals(stepDefinition2, pickleStepDefinitionMatch2.getStepDefinition()); } + @Test + public void returns_no_match_after_evicting_scenario_scoped() { + String featurePath = "someFeature.feature"; + String stepText = "pattern1"; + PickleStep pickleStep1 = getPickleStep(stepText); + + + StepDefinition stepDefinition1 = new MockedScenarioScopedStepDefinition("^pattern1"); + glue.addStepDefinition(stepDefinition1); + glue.prepareGlue(typeRegistry); + + + PickleStepDefinitionMatch pickleStepDefinitionMatch = glue.stepDefinitionMatch(featurePath, pickleStep1); + assertEquals(stepDefinition1, pickleStepDefinitionMatch.getStepDefinition()); + + glue.removeScenarioScopedGlue(); + + glue.prepareGlue(typeRegistry); + + PickleStepDefinitionMatch pickleStepDefinitionMatch2 = glue.stepDefinitionMatch(featurePath, pickleStep1); + assertThat(pickleStepDefinitionMatch2, nullValue()); + } + private static PickleStep getPickleStepWithSingleCellTable(String stepText, String cell) { - return new PickleStep(stepText, Collections.singletonList(new PickleTable(singletonList(new PickleRow(singletonList(new PickleCell(mock(PickleLocation.class), cell)))))), Collections.emptyList()); + return new PickleStep(stepText, Collections.singletonList(new PickleTable(singletonList(new PickleRow(singletonList(new PickleCell(mock(PickleLocation.class), cell)))))), Collections.emptyList()); } private static PickleStep getPickleStepWithDocString(String stepText, String doc) { - return new PickleStep(stepText, Collections.singletonList(new PickleString(mock(PickleLocation.class), doc)), Collections.emptyList()); + return new PickleStep(stepText, Collections.singletonList(new PickleString(mock(PickleLocation.class), doc)), Collections.emptyList()); } @Test @@ -230,7 +332,7 @@ private void checkAmbiguousCalled(String featurePath) { } private static PickleStep getPickleStep(String text) { - return new PickleStep(text, Collections.emptyList(), Collections.emptyList()); + return new PickleStep(text, Collections.emptyList(), Collections.emptyList()); } private static class MockedScenarioScopedStepDefinition implements StepDefinition, ScenarioScoped { @@ -288,13 +390,19 @@ public DataTableType dataTableType() { return new DataTableType(Object.class, (DataTable table) -> new Object()); } + @Override + public String getLocation(boolean detail) { + return "mocked data table type definition"; + } + @Override public void disposeScenarioScope() { this.disposed = true; } } - private static class MockedParemterTypeDefinition implements ParameterTypeDefinition, ScenarioScoped { + + private static class MockedParameterTypeDefinition implements ParameterTypeDefinition, ScenarioScoped { boolean disposed; @@ -307,6 +415,11 @@ public void disposeScenarioScope() { public ParameterType parameterType() { return new ParameterType<>("mock", "[ab]", Object.class, (String arg) -> new Object()); } + + @Override + public String getLocation(boolean detail) { + return "mocked parameter type location"; + } } @@ -373,4 +486,74 @@ public String getPattern() { return pattern; } } + + private static class MockedDefaultParameterTransformer implements DefaultParameterTransformerDefinition, ScenarioScoped { + + boolean disposed; + + @Override + public void disposeScenarioScope() { + this.disposed = true; + } + + @Override + public ParameterByTypeTransformer parameterByTypeTransformer() { + return (fromValue, toValueType) -> new Object(); + } + + @Override + public String getLocation(boolean detail) { + return "mocked default parameter transformer"; + } + } + + private static class MockedDefaultDataTableCellTransformer implements DefaultDataTableCellTransformerDefinition, ScenarioScoped { + + + boolean disposed; + + @Override + public void disposeScenarioScope() { + this.disposed = true; + } + + @Override + public TableCellByTypeTransformer tableCellByTypeTransformer() { + return new TableCellByTypeTransformer() { + @Override + public T transform(String value, Class cellType) { + return (T) new Object(); + } + }; + } + + @Override + public String getLocation(boolean detail) { + return "mocked default data table cell transformer"; + } + } + + private static class MockedDefaultDataTableEntryTransformer implements DefaultDataTableEntryTransformerDefinition, ScenarioScoped { + boolean disposed; + + @Override + public void disposeScenarioScope() { + this.disposed = true; + } + + @Override + public TableEntryByTypeTransformer tableEntryByTypeTransformer() { + return new TableEntryByTypeTransformer() { + @Override + public T transform(Map entry, Class type, TableCellByTypeTransformer cellTransformer) { + return (T) new Object(); + } + }; + } + + @Override + public String getLocation(boolean detail) { + return "mocked default data table entry transformer"; + } + } } From ec3563c608d0cf8e2609ddea8efa11c8a66fef0e Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 21 Jul 2019 23:36:04 +0200 Subject: [PATCH 131/155] [Java] Add annotation for DefaultParameterTransformer hook --- java/README.md | 63 ++++++++++++++++ .../java/DefaultParameterTransformer.java | 21 ++++++ .../java/io/cucumber/java/JavaBackend.java | 2 + .../java/JavaDataTableTypeDefinition.java | 9 +++ ...DefaultParameterTransformerDefinition.java | 74 +++++++++++++++++++ .../java/JavaParameterTypeDefinition.java | 14 +++- .../java/io/cucumber/java/MethodScanner.java | 1 + 7 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 java/README.md create mode 100644 java/src/main/java/io/cucumber/java/DefaultParameterTransformer.java create mode 100644 java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java diff --git a/java/README.md b/java/README.md new file mode 100644 index 0000000000..fc14f8c1e3 --- /dev/null +++ b/java/README.md @@ -0,0 +1,63 @@ +Cucumber Java +============= + +Provides annotation based step definitions. To use add the `cucumber-java` dependency to your pom.xml: + +```xml + + [...] + + io.cucumber + cucumber-java + ${cucumber.version} + test + + [...] + +``` + +## Step Definitions + +Use annotations to mark methods as steps. For localized annotations import from `io.cucumber.java.` + + +```java +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; + +import static org.junit.Assert.assertEquals; + +public class CalculatorSteps{ + private RpnCalculator calc; + + @Given("a calculator I just turned on") + public void a_calculator_I_just_turned_on() { + calc = new RpnCalculator(); + } + + @When("I add {int} and {int}") + public void adding(int arg1, int arg2) { + calc.push(arg1); + calc.push(arg2); + calc.push("+"); + } + + @Then("the result is {int}") + public void the_result_is(double expected) { + assertEquals(expected, calc.value()); + } +} +``` + +## TODO: Hooks + * `@Before` + * `@After` + * `@BeforeStep` + * `@AfterStep` + +## TODO: Transformers + * `@DefaultParameterTransformer` + * `@DefaultDataTableEntryTransformer` + * `@DefaultDataTableCellTransformer` + \ No newline at end of file diff --git a/java/src/main/java/io/cucumber/java/DefaultParameterTransformer.java b/java/src/main/java/io/cucumber/java/DefaultParameterTransformer.java new file mode 100644 index 0000000000..a3349a8d54 --- /dev/null +++ b/java/src/main/java/io/cucumber/java/DefaultParameterTransformer.java @@ -0,0 +1,21 @@ +package io.cucumber.java; + +import org.apiguardian.api.API; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Allows a default transformer for all parameters to be registered. + *

        + * Supports ParameterByTypeTransformer: String,Type -> T + * Supports ParameterByTypeTransformer: Object,Type -> T + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@API(status = API.Status.STABLE) +public @interface DefaultParameterTransformer { + +} diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 228161794d..2c3f734487 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -96,6 +96,8 @@ void addHook(Annotation annotation, Method method) { glue.addParameterType(new JavaParameterTypeDefinition(name, pattern, method, useForSnippets, preferForRegexMatch, lookup)); } else if (annotation.annotationType().equals(DataTableType.class)) { glue.addDataTableType(new JavaDataTableTypeDefinition(method, lookup)); + }else if (annotation.annotationType().equals(DefaultParameterTransformer.class)) { + glue.addDefaultParameterTransformer(new JavaDefaultParameterTransformerDefinition(method, lookup)); } } } diff --git a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java index 62015a930e..59b40086b8 100644 --- a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java @@ -3,6 +3,7 @@ import io.cucumber.core.backend.DataTableTypeDefinition; import io.cucumber.core.backend.Lookup; import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.MethodFormat; import io.cucumber.core.runtime.Invoker; import io.cucumber.datatable.DataTable; import io.cucumber.datatable.DataTableType; @@ -22,11 +23,15 @@ class JavaDataTableTypeDefinition implements DataTableTypeDefinition { private final Method method; private final Lookup lookup; private final DataTableType dataTableType; + private final String shortFormat; + private final String fullFormat; JavaDataTableTypeDefinition(Method method, Lookup lookup) { this.method = method; this.lookup = lookup; this.dataTableType = createDataTableType(method); + this.shortFormat = MethodFormat.SHORT.format(method); + this.fullFormat = MethodFormat.FULL.format(method); } @SuppressWarnings("unchecked") @@ -114,6 +119,10 @@ public DataTableType dataTableType() { return dataTableType; } + @Override + public String getLocation(boolean detail) { + return detail ? fullFormat : shortFormat; + } private Object execute(Object arg) throws Throwable { return Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, 0, arg); diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java new file mode 100644 index 0000000000..8b5adb8c35 --- /dev/null +++ b/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java @@ -0,0 +1,74 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.DefaultParameterTransformerDefinition; +import io.cucumber.core.backend.Lookup; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.MethodFormat; +import io.cucumber.core.runtime.Invoker; +import io.cucumber.cucumberexpressions.ParameterByTypeTransformer; + +import java.lang.reflect.Method; +import java.lang.reflect.Type; + +class JavaDefaultParameterTransformerDefinition implements DefaultParameterTransformerDefinition { + + private final Method method; + + private final Lookup lookup; + private final ParameterByTypeTransformer transformer; + private final String shortFormat; + private final String fullFormat; + + JavaDefaultParameterTransformerDefinition(Method method, Lookup lookup) { + this.method = requireValidMethod(method); + this.lookup = lookup; + this.shortFormat = MethodFormat.SHORT.format(method); + this.fullFormat = MethodFormat.FULL.format(method); + this.transformer = this::execute; + } + + private Method requireValidMethod(Method method) { + Class returnType = method.getReturnType(); + if (Void.class.equals(returnType)) { + throw createInvalidSignatureException(); + } + + Class[] parameterTypes = method.getParameterTypes(); + if (parameterTypes.length != 2) { + throw createInvalidSignatureException(); + } + + if (!(String.class.equals(parameterTypes[0]) || Object.class.equals(parameterTypes[0]))) { + throw createInvalidSignatureException(); + } + + if (!Type.class.equals(parameterTypes[1])) { + throw createInvalidSignatureException(); + } + + return method; + } + + private CucumberException createInvalidSignatureException() { + return new CucumberException("" + + "A @DefaultParameterTransformer annotated method must have one of these signature:\n" + + " * public Object defaultParameter(String fromValue, Type toValueType)\n" + + " * public Object defaultParameter(Object fromValue, Type toValueType)\n" + ); + } + + @Override + public ParameterByTypeTransformer parameterByTypeTransformer() { + return transformer; + } + + @Override + public String getLocation(boolean detail) { + return detail ? fullFormat : shortFormat; + } + + private Object execute(String fromValue, Type toValueType) throws Throwable { + return Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, 0, fromValue, toValueType); + } + +} diff --git a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java index 08ad01a348..f6a90bfe1c 100644 --- a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java @@ -3,25 +3,32 @@ import io.cucumber.core.backend.Lookup; import io.cucumber.core.backend.ParameterTypeDefinition; import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.MethodFormat; import io.cucumber.core.runtime.Invoker; import io.cucumber.cucumberexpressions.ParameterType; import java.lang.reflect.Method; import java.util.Collections; +import static java.util.Collections.singletonList; + class JavaParameterTypeDefinition implements ParameterTypeDefinition { private final Method method; private final Lookup lookup; private final ParameterType parameterType; + private final String shortFormat; + private final String fullFormat; JavaParameterTypeDefinition(String name, String pattern, Method method, boolean useForSnippets, boolean preferForRegexpMatch, Lookup lookup) { this.method = requireValidMethod(method); this.lookup = lookup; + this.shortFormat = MethodFormat.SHORT.format(method); + this.fullFormat = MethodFormat.FULL.format(method); this.parameterType = new ParameterType<>( name.isEmpty() ? method.getName() : name, - Collections.singletonList(pattern), + singletonList(pattern), this.method.getReturnType(), this::execute, useForSnippets, @@ -64,6 +71,11 @@ public ParameterType parameterType() { return parameterType; } + @Override + public String getLocation(boolean detail) { + return detail ? fullFormat : shortFormat; + } + private Object execute(Object[] args) throws Throwable { return Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, 0, args); } diff --git a/java/src/main/java/io/cucumber/java/MethodScanner.java b/java/src/main/java/io/cucumber/java/MethodScanner.java index 6ff23e92f0..89cd5ef92a 100644 --- a/java/src/main/java/io/cucumber/java/MethodScanner.java +++ b/java/src/main/java/io/cucumber/java/MethodScanner.java @@ -85,6 +85,7 @@ private boolean isHookAnnotation(Annotation annotation) { || annotationClass.equals(AfterStep.class) || annotationClass.equals(ParameterType.class) || annotationClass.equals(DataTableType.class) + || annotationClass.equals(DefaultParameterTransformer.class) ; } From 508ac39d93be8d234a2ee51ad181de5a94558cc4 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Mon, 22 Jul 2019 17:51:19 +0200 Subject: [PATCH 132/155] [Core] Make methods more descriptive --- .../java/io/cucumber/core/runner/Runner.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/runner/Runner.java b/core/src/main/java/io/cucumber/core/runner/Runner.java index d62264971b..e95d01f647 100644 --- a/core/src/main/java/io/cucumber/core/runner/Runner.java +++ b/core/src/main/java/io/cucumber/core/runner/Runner.java @@ -94,13 +94,13 @@ private TestCase createTestCaseForPickle(PickleEvent pickleEvent) { return new TestCase(emptyList(), emptyList(), emptyList(), pickleEvent, runnerOptions.isDryRun()); } - List testSteps = addTestStepsForPickleSteps(pickleEvent); - List beforeHooks = addTestStepsForBeforeHooks(pickleEvent.pickle.getTags()); - List afterHooks = addTestStepsForAfterHooks(pickleEvent.pickle.getTags()); + List testSteps = createTestStepsForPickleSteps(pickleEvent); + List beforeHooks = createTestStepsForBeforeHooks(pickleEvent.pickle.getTags()); + List afterHooks = createTestStepsForAfterHooks(pickleEvent.pickle.getTags()); return new TestCase(testSteps, beforeHooks, afterHooks, pickleEvent, runnerOptions.isDryRun()); } - private List addTestStepsForPickleSteps(PickleEvent pickleEvent) { + private List createTestStepsForPickleSteps(PickleEvent pickleEvent) { List testSteps = new ArrayList<>(); for (PickleStep step : pickleEvent.pickle.getSteps()) { @@ -125,8 +125,8 @@ private List addTestStepsForPickleSteps(PickleEvent pickleEv } - List afterStepHookSteps = getAfterStepHooks(pickleEvent.pickle.getTags()); - List beforeStepHookSteps = getBeforeStepHooks(pickleEvent.pickle.getTags()); + List afterStepHookSteps = createAfterStepHooks(pickleEvent.pickle.getTags()); + List beforeStepHookSteps = createBeforeStepHooks(pickleEvent.pickle.getTags()); testSteps.add(new PickleStepTestStep(pickleEvent.uri, step, beforeStepHookSteps, afterStepHookSteps, match)); } @@ -139,27 +139,27 @@ private List locations(PickleStep step) { .collect(Collectors.toList()); } - private List addTestStepsForBeforeHooks(List tags) { - return addTestStepsForHooks(tags, glue.getBeforeHooks(), HookType.BEFORE); + private List createTestStepsForBeforeHooks(List tags) { + return createTestStepsForHooks(tags, glue.getBeforeHooks(), HookType.BEFORE); } - private List addTestStepsForAfterHooks(List tags) { - return addTestStepsForHooks(tags, glue.getAfterHooks(), HookType.AFTER); + private List createTestStepsForAfterHooks(List tags) { + return createTestStepsForHooks(tags, glue.getAfterHooks(), HookType.AFTER); } - private List addTestStepsForHooks(List tags, List hooks, HookType hookType) { + private List createTestStepsForHooks(List tags, Collection hooks, HookType hookType) { return hooks.stream() .filter(hook -> hook.matches(tags)) .map(hook -> new HookTestStep(hookType, new HookDefinitionMatch(hook))) .collect(Collectors.toList()); } - private List getAfterStepHooks(List tags) { - return addTestStepsForHooks(tags, glue.getAfterStepHooks(), HookType.AFTER_STEP); + private List createAfterStepHooks(List tags) { + return createTestStepsForHooks(tags, glue.getAfterStepHooks(), HookType.AFTER_STEP); } - private List getBeforeStepHooks(List tags) { - return addTestStepsForHooks(tags, glue.getBeforeStepHooks(), HookType.BEFORE_STEP); + private List createBeforeStepHooks(List tags) { + return createTestStepsForHooks(tags, glue.getBeforeStepHooks(), HookType.BEFORE_STEP); } private void buildBackendWorlds() { From f72d25ce870c7bd40c1e8b65ef4ca32633ba9c50 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Mon, 22 Jul 2019 17:53:58 +0200 Subject: [PATCH 133/155] [Core] Use sorted set to improve performance --- .../io/cucumber/core/runner/CachingGlue.java | 61 ++++++++----------- 1 file changed, 26 insertions(+), 35 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index dc80647e7a..9e212b7cb6 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -17,12 +17,7 @@ import io.cucumber.datatable.TableCellByTypeTransformer; import io.cucumber.datatable.TableEntryByTypeTransformer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; +import java.util.*; final class CachingGlue implements Glue { private static final HookComparator ASCENDING = new HookComparator(true); @@ -34,11 +29,11 @@ final class CachingGlue implements Glue { private final List defaultDataTableEntryTransformers = new ArrayList<>(); private final List defaultDataTableCellTransformers = new ArrayList<>(); - private final List beforeHooks = new ArrayList<>(); - private final List beforeStepHooks = new ArrayList<>(); + private final SortedSet beforeHooks = new TreeSet<>(ASCENDING); + private final SortedSet beforeStepHooks = new TreeSet<>(ASCENDING); private final List stepDefinitions = new ArrayList<>(); - private final List afterStepHooks = new ArrayList<>(); - private final List afterHooks = new ArrayList<>(); + private final SortedSet afterStepHooks = new TreeSet<>(DESCENDING); + private final SortedSet afterHooks = new TreeSet<>(DESCENDING); /* * Storing the pattern that matches the step text allows us to cache the rather slow @@ -64,25 +59,21 @@ public void addStepDefinition(StepDefinition stepDefinition) { @Override public void addBeforeHook(HookDefinition hookDefinition) { beforeHooks.add(hookDefinition); - beforeHooks.sort(ASCENDING); } @Override public void addBeforeStepHook(HookDefinition hookDefinition) { beforeStepHooks.add(hookDefinition); - beforeStepHooks.sort(ASCENDING); } @Override public void addAfterHook(HookDefinition hookDefinition) { afterHooks.add(hookDefinition); - afterHooks.sort(DESCENDING); } @Override public void addAfterStepHook(HookDefinition hookDefinition) { afterStepHooks.add(hookDefinition); - afterStepHooks.sort(DESCENDING); } @Override @@ -110,31 +101,31 @@ public void addDefaultDataTableCellTransformer(DefaultDataTableCellTransformerDe defaultDataTableCellTransformers.add(defaultDataTableCellTransformer); } - List getBeforeHooks() { - return new ArrayList<>(beforeHooks); + Collection getBeforeHooks() { + return beforeHooks; } - List getBeforeStepHooks() { - return new ArrayList<>(beforeStepHooks); + Collection getBeforeStepHooks() { + return beforeStepHooks; } - List getAfterHooks() { - return new ArrayList<>(afterHooks); + Collection getAfterHooks() { + return afterHooks; } - List getAfterStepHooks() { - return new ArrayList<>(afterStepHooks); + Collection getAfterStepHooks() { + return afterStepHooks; } - List getParameterTypeDefinitions() { + Collection getParameterTypeDefinitions() { return parameterTypeDefinitions; } - List getDataTableTypeDefinitions() { + Collection getDataTableTypeDefinitions() { return dataTableTypeDefinitions; } - List getStepDefinitions() { + Collection getStepDefinitions() { return stepDefinitions; } @@ -146,15 +137,15 @@ Map getStepDefinitionsByPattern() { return stepDefinitionsByPattern; } - List getDefaultParameterTransformers() { + Collection getDefaultParameterTransformers() { return defaultParameterTransformers; } - List getDefaultDataTableEntryTransformers() { + Collection getDefaultDataTableEntryTransformers() { return defaultDataTableEntryTransformers; } - List getDefaultDataTableCellTransformers() { + Collection getDefaultDataTableCellTransformers() { return defaultDataTableCellTransformers; } @@ -267,14 +258,14 @@ void removeScenarioScopedGlue() { removeScenarioScopedGlue(defaultDataTableCellTransformers); } - private void removeScenarioScopedGlue(List glue) { - Iterator hookIterator = glue.iterator(); - while (hookIterator.hasNext()) { - Object hook = hookIterator.next(); - if (hook instanceof ScenarioScoped) { - ScenarioScoped scenarioScopedHookDefinition = (ScenarioScoped) hook; + private void removeScenarioScopedGlue(Iterable glues) { + Iterator glueIterator = glues.iterator(); + while (glueIterator.hasNext()) { + Object glue = glueIterator.next(); + if (glue instanceof ScenarioScoped) { + ScenarioScoped scenarioScopedHookDefinition = (ScenarioScoped) glue; scenarioScopedHookDefinition.disposeScenarioScope(); - hookIterator.remove(); + glueIterator.remove(); } } } From 88700cc15720a66a5e328c80f8c17403e99ee9b6 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Wed, 24 Jul 2019 22:47:11 +0200 Subject: [PATCH 134/155] [Java] Add Cell and Entry transformer hooks --- .../io/cucumber/core/backend/Backend.java | 4 +- .../io/cucumber/core/backend/Container.java | 2 +- .../java/DefaultDataTableCellTransformer.java | 21 ++++ .../DefaultDataTableEntryTransformer.java | 23 +++++ .../java/InvalidMethodSignatureException.java | 81 ++++++++++++++++ .../java/io/cucumber/java/JavaBackend.java | 6 +- .../java/JavaDataTableTypeDefinition.java | 28 +++--- ...ultDataTableCellTransformerDefinition.java | 77 +++++++++++++++ ...ltDataTableEntryTransformerDefinition.java | 97 +++++++++++++++++++ ...DefaultParameterTransformerDefinition.java | 28 +++--- .../io/cucumber/java/JavaHookDefinition.java | 53 +++++++--- .../java/JavaParameterTypeDefinition.java | 26 ++--- .../java/io/cucumber/java/MethodScanner.java | 6 +- .../io/cucumber/java/JavaBackendTest.java | 13 +-- ...TableStepdefs.java => DataTableSteps.java} | 21 +++- ...eStepdefs.java => ParameterTypeSteps.java} | 2 +- ...enarioStepDefs.java => ScenarioSteps.java} | 2 +- .../annotation/{Stepdefs.java => Steps.java} | 7 +- ...onStepdefs.java => SubstitutionSteps.java} | 2 +- .../annotation/TypeRegistryConfiguration.java | 34 ------- .../SubclassesStepdefs.java | 6 -- .../SubclassesSteps.java | 6 ++ .../repeatable/{Stepdefs.java => Steps.java} | 2 +- .../Stepdefs.java => steps/Steps.java} | 4 +- .../io/cucumber/java8/Java8BackendTest.java | 2 +- 25 files changed, 427 insertions(+), 126 deletions(-) create mode 100644 java/src/main/java/io/cucumber/java/DefaultDataTableCellTransformer.java create mode 100644 java/src/main/java/io/cucumber/java/DefaultDataTableEntryTransformer.java create mode 100644 java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java create mode 100644 java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java create mode 100644 java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java rename java/src/test/java/io/cucumber/java/annotation/{DataTableStepdefs.java => DataTableSteps.java} (84%) rename java/src/test/java/io/cucumber/java/annotation/{ParameterTypeStepdefs.java => ParameterTypeSteps.java} (95%) rename java/src/test/java/io/cucumber/java/annotation/{ScenarioStepDefs.java => ScenarioSteps.java} (96%) rename java/src/test/java/io/cucumber/java/annotation/{Stepdefs.java => Steps.java} (78%) rename java/src/test/java/io/cucumber/java/annotation/{SubstitutionStepdefs.java => SubstitutionSteps.java} (97%) delete mode 100644 java/src/test/java/io/cucumber/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java create mode 100644 java/src/test/java/io/cucumber/java/incorrectlysubclassedsteps/SubclassesSteps.java rename java/src/test/java/io/cucumber/java/repeatable/{Stepdefs.java => Steps.java} (86%) rename java/src/test/java/io/cucumber/java/{stepdefs/Stepdefs.java => steps/Steps.java} (60%) diff --git a/core/src/main/java/io/cucumber/core/backend/Backend.java b/core/src/main/java/io/cucumber/core/backend/Backend.java index 8cd344ec87..d00ced1933 100644 --- a/core/src/main/java/io/cucumber/core/backend/Backend.java +++ b/core/src/main/java/io/cucumber/core/backend/Backend.java @@ -9,9 +9,9 @@ @API(status = API.Status.STABLE) public interface Backend { /** - * Invoked once before all features. This is where stepdefs and hooks should be loaded. + * Invoked once before all features. This is where steps and hooks should be loaded. * - * @param glue Glue that provides the stepdefs to be executed. + * @param glue Glue that provides the steps to be executed. * @param gluePaths The locations for the glue to be loaded. */ void loadGlue(Glue glue, List gluePaths); diff --git a/core/src/main/java/io/cucumber/core/backend/Container.java b/core/src/main/java/io/cucumber/core/backend/Container.java index 684993387b..b8c68a8088 100644 --- a/core/src/main/java/io/cucumber/core/backend/Container.java +++ b/core/src/main/java/io/cucumber/core/backend/Container.java @@ -8,7 +8,7 @@ public interface Container { * Collects glue classes in the classpath. Called once on init. * * @param glueClass Glue class containing cucumber.api annotations (Before, Given, When, ...) - * @return true if stepdefs and hooks in this class should be used, false if they should be ignored. + * @return true if steps and hook definitions in this class should be used, false if they should be ignored. */ boolean addClass(Class glueClass); } diff --git a/java/src/main/java/io/cucumber/java/DefaultDataTableCellTransformer.java b/java/src/main/java/io/cucumber/java/DefaultDataTableCellTransformer.java new file mode 100644 index 0000000000..4a44630125 --- /dev/null +++ b/java/src/main/java/io/cucumber/java/DefaultDataTableCellTransformer.java @@ -0,0 +1,21 @@ +package io.cucumber.java; + +import org.apiguardian.api.API; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Allows a default transformer for all parameters to be registered. + *

        + * Supports TableCellByTypeTransformer: String, Type -> T + * Supports TableCellByTypeTransformer: Object, Type -> T + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@API(status = API.Status.STABLE) +public @interface DefaultDataTableCellTransformer { + +} diff --git a/java/src/main/java/io/cucumber/java/DefaultDataTableEntryTransformer.java b/java/src/main/java/io/cucumber/java/DefaultDataTableEntryTransformer.java new file mode 100644 index 0000000000..50d7070056 --- /dev/null +++ b/java/src/main/java/io/cucumber/java/DefaultDataTableEntryTransformer.java @@ -0,0 +1,23 @@ +package io.cucumber.java; + +import org.apiguardian.api.API; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Allows a default transformer for all parameters to be registered. + *

        + * Supports TableEntryByTypeTransformer: Map>, Type -> T + * Supports TableEntryByTypeTransformer: Object, Type -> T + * Supports TableEntryByTypeTransformer: Map>, Type,TableCellByTypeTransformer -> T + * Supports TableEntryByTypeTransformer: Object, Type,TableCellByTypeTransformer -> T + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@API(status = API.Status.STABLE) +public @interface DefaultDataTableEntryTransformer { + +} diff --git a/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java b/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java new file mode 100644 index 0000000000..590d71b61c --- /dev/null +++ b/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java @@ -0,0 +1,81 @@ +package io.cucumber.java; + +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.MethodFormat; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +final class InvalidMethodSignatureExceptionBuilder { + + private Method method; + private final List> annotations = new ArrayList<>(); + private final List signatures = new ArrayList<>(); + private final List notes = new ArrayList<>(); + + static InvalidMethodSignatureExceptionBuilder builder(Method method) { + return new InvalidMethodSignatureExceptionBuilder(method); + } + + private InvalidMethodSignatureExceptionBuilder(Method method) { + this.method = method; + } + + InvalidMethodSignatureExceptionBuilder addAnnotation(Class annotation) { + annotations.add(annotation); + return this; + } + + + InvalidMethodSignatureExceptionBuilder addSignature(String signature) { + signatures.add(signature); + return this; + } + + InvalidMethodSignatureExceptionBuilder addNote(String note) { + this.notes.add(note); + return this; + } + + public CucumberException build() { + return new CucumberException("" + + describeAnnotations() + " must have one of these signatures:\n" + + " *" + describeAvailableSignature() + "\n" + + "at " + describeLocation() + "\n" + + describeNote() + "\n" + ); + } + + private String describeNote() { + return String.join("\n", notes); + } + + private Object describeLocation() { + return MethodFormat.FULL.format(method); + } + + private String describeAvailableSignature() { + return String.join("\n * ", signatures); + } + + private String describeAnnotations() { + if (annotations.size() == 1) { + return "A @" + annotations.get(0).getName() + " annotated method"; + } + + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < annotations.size(); i++) { + builder.append(annotations.get(i).getName()); + + if (i < annotations.size() - 2) { + builder.append(", "); + } else if (i < annotations.size() - 1) { + builder.append(" or "); + } + } + + return "A method annotated with " + builder.toString(); + } + +} diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 2c3f734487..65ca77ed6d 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -96,8 +96,12 @@ void addHook(Annotation annotation, Method method) { glue.addParameterType(new JavaParameterTypeDefinition(name, pattern, method, useForSnippets, preferForRegexMatch, lookup)); } else if (annotation.annotationType().equals(DataTableType.class)) { glue.addDataTableType(new JavaDataTableTypeDefinition(method, lookup)); - }else if (annotation.annotationType().equals(DefaultParameterTransformer.class)) { + } else if (annotation.annotationType().equals(DefaultParameterTransformer.class)) { glue.addDefaultParameterTransformer(new JavaDefaultParameterTransformerDefinition(method, lookup)); + } else if (annotation.annotationType().equals(DefaultDataTableEntryTransformer.class)) { + glue.addDefaultDataTableEntryTransformer(new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + } else if (annotation.annotationType().equals(DefaultDataTableCellTransformer.class)) { + glue.addDefaultDataTableCellTransformer(new JavaDefaultDataTableCellTransformerDefinition(method, lookup)); } } } diff --git a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java index 59b40086b8..9fb0128cae 100644 --- a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java @@ -18,6 +18,8 @@ import java.util.List; import java.util.Map; +import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; + class JavaDataTableTypeDefinition implements DataTableTypeDefinition { private final Method method; @@ -67,26 +69,26 @@ private DataTableType createDataTableType(Method method) { ); } - throw createInvalidSignatureException(); + throw createInvalidSignatureException(method); } - private static CucumberException createInvalidSignatureException() { - return new CucumberException("" + - "A @DataTableType annotated method must have one of these signatures:\n" + - " * public Author author(DataTable table)\n" + - " * public Author author(List row)\n" + - " * public Author author(Map entry)\n" + - " * public Author author(String cell)\n" + - "Note: Author is an example of the class you want to convert the table to" - ); + private static CucumberException createInvalidSignatureException(Method method) { + return builder(method) + .addAnnotation(DataTableType.class) + .addSignature("public Author author(DataTable table)") + .addSignature("public Author author(List row)") + .addSignature("public Author author(Map entry)") + .addSignature("public Author author(String cell)") + .addNote("Note: Author is an example of the class you want to convert the table to") + .build(); } private static Type requireValidParameterType(Method method) { Type[] parameterTypes = method.getGenericParameterTypes(); if (parameterTypes.length != 1) { - throw createInvalidSignatureException(); + throw createInvalidSignatureException(method); } Type parameterType = parameterTypes[0]; @@ -98,7 +100,7 @@ private static Type requireValidParameterType(Method method) { Type[] typeParameters = parameterizedType.getActualTypeArguments(); for (Type typeParameter : typeParameters) { if (!String.class.equals(typeParameter)) { - throw createInvalidSignatureException(); + throw createInvalidSignatureException(method); } } @@ -108,7 +110,7 @@ private static Type requireValidParameterType(Method method) { private static Class requireValidReturnType(Method method) { Class returnType = method.getReturnType(); if (Void.class.equals(returnType)) { - throw createInvalidSignatureException(); + throw createInvalidSignatureException(method); } return returnType; } diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java new file mode 100644 index 0000000000..4863fc1d1d --- /dev/null +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java @@ -0,0 +1,77 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.DefaultDataTableCellTransformerDefinition; +import io.cucumber.core.backend.Lookup; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.MethodFormat; +import io.cucumber.core.runtime.Invoker; +import io.cucumber.datatable.TableCellByTypeTransformer; + +import java.lang.reflect.Method; +import java.lang.reflect.Type; + +import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; + +class JavaDefaultDataTableCellTransformerDefinition implements DefaultDataTableCellTransformerDefinition { + + private final Method method; + + private final Lookup lookup; + private final TableCellByTypeTransformer transformer; + private final String shortFormat; + private final String fullFormat; + + JavaDefaultDataTableCellTransformerDefinition(Method method, Lookup lookup) { + this.method = requireValidMethod(method); + this.lookup = lookup; + this.shortFormat = MethodFormat.SHORT.format(method); + this.fullFormat = MethodFormat.FULL.format(method); + this.transformer = this::execute; + } + + private static Method requireValidMethod(Method method) { + Class returnType = method.getReturnType(); + if (Void.class.equals(returnType)) { + throw createInvalidSignatureException(method); + } + + Class[] parameterTypes = method.getParameterTypes(); + if (parameterTypes.length != 2) { + throw createInvalidSignatureException(method); + } + + if (!(Object.class.equals(parameterTypes[0]) || String.class.equals(parameterTypes[0]))) { + throw createInvalidSignatureException(method); + } + + if (!(Object.class.equals(parameterTypes[1]) || Type.class.equals(parameterTypes[1]))) { + throw createInvalidSignatureException(method); + } + + return method; + } + + private static CucumberException createInvalidSignatureException(Method method) { + return builder(method) + .addAnnotation(DefaultDataTableCellTransformer.class) + .addSignature("public Object defaultDataTableCell(String fromValue, Type toValueType)") + .addSignature("public Object defaultDataTableCell(Object fromValue, Type toValueType)") + .build(); + } + + @Override + public TableCellByTypeTransformer tableCellByTypeTransformer() { + return transformer; + } + + @Override + public String getLocation(boolean detail) { + return detail ? fullFormat : shortFormat; + } + + @SuppressWarnings("unchecked") + private T execute(String fromValue, Class toValueType) throws Throwable { + return (T) Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, 0, fromValue, toValueType); + } + +} diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java new file mode 100644 index 0000000000..74d13d4963 --- /dev/null +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java @@ -0,0 +1,97 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.DefaultDataTableEntryTransformerDefinition; +import io.cucumber.core.backend.Lookup; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.core.reflection.MethodFormat; +import io.cucumber.core.runtime.Invoker; +import io.cucumber.datatable.TableCellByTypeTransformer; +import io.cucumber.datatable.TableEntryByTypeTransformer; +import io.cucumber.datatable.TypeReference; + +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.util.Map; + +import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; + +class JavaDefaultDataTableEntryTransformerDefinition implements DefaultDataTableEntryTransformerDefinition { + + private static final Type mapStringStringType = new TypeReference>() { + }.getType(); + + private final Method method; + + private final Lookup lookup; + private final TableEntryByTypeTransformer transformer; + private final String shortFormat; + private final String fullFormat; + + JavaDefaultDataTableEntryTransformerDefinition(Method method, Lookup lookup) { + this.method = requireValidMethod(method); + this.lookup = lookup; + this.shortFormat = MethodFormat.SHORT.format(method); + this.fullFormat = MethodFormat.FULL.format(method); + this.transformer = this::execute; + } + + private static Method requireValidMethod(Method method) { + Class returnType = method.getReturnType(); + if (Void.class.equals(returnType)) { + throw createInvalidSignatureException(method); + } + + Class[] parameterTypes = method.getParameterTypes(); + if (parameterTypes.length < 2 || parameterTypes.length > 3) { + throw createInvalidSignatureException(method); + } + + if (!(Object.class.equals(parameterTypes[0]) || mapStringStringType.equals(parameterTypes[0]))) { + throw createInvalidSignatureException(method); + } + + if (!(Object.class.equals(parameterTypes[1]) || Type.class.equals(parameterTypes[1]))) { + throw createInvalidSignatureException(method); + } + + if (parameterTypes.length == 3) { + if (!(Object.class.equals(parameterTypes[2]) || TableCellByTypeTransformer.class.equals(parameterTypes[2]))) { + throw createInvalidSignatureException(method); + } + } + + return method; + } + + private static CucumberException createInvalidSignatureException(Method method) { + return builder(method) + .addAnnotation(DefaultDataTableEntryTransformer.class) + .addSignature("public Object defaultDataTableEntry(Map fromValue, Type toValueType)") + .addSignature("public Object defaultDataTableEntry(Object fromValue, Type toValueType)") + .addSignature("public Object defaultDataTableCell(Map fromValue, Type toValueType, TableCellByTypeTransformer cellTransformer)") + .addSignature("public Object defaultDataTableCell(Object fromValue, Type toValueType, TableCellByTypeTransformer cellTransformer)") + .build(); + } + + @Override + public TableEntryByTypeTransformer tableEntryByTypeTransformer() { + return transformer; + } + + @Override + public String getLocation(boolean detail) { + return detail ? fullFormat : shortFormat; + } + + @SuppressWarnings("unchecked") + private T execute(Map fromValue, Class toValueType, TableCellByTypeTransformer cellTransformer) throws Throwable { + Object[] args; + if (method.getParameterTypes().length == 3) { + args = new Object[]{fromValue, toValueType, cellTransformer}; + } else { + args = new Object[]{fromValue, toValueType}; + } + return (T) Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, 0, args); + } + +} diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java index 8b5adb8c35..bcbb9a99de 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java @@ -10,6 +10,8 @@ import java.lang.reflect.Method; import java.lang.reflect.Type; +import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; + class JavaDefaultParameterTransformerDefinition implements DefaultParameterTransformerDefinition { private final Method method; @@ -27,34 +29,34 @@ class JavaDefaultParameterTransformerDefinition implements DefaultParameterTrans this.transformer = this::execute; } - private Method requireValidMethod(Method method) { + private static Method requireValidMethod(Method method) { Class returnType = method.getReturnType(); if (Void.class.equals(returnType)) { - throw createInvalidSignatureException(); + throw createInvalidSignatureException(method); } Class[] parameterTypes = method.getParameterTypes(); if (parameterTypes.length != 2) { - throw createInvalidSignatureException(); + throw createInvalidSignatureException(method); } - if (!(String.class.equals(parameterTypes[0]) || Object.class.equals(parameterTypes[0]))) { - throw createInvalidSignatureException(); + if (!(Object.class.equals(parameterTypes[0]) || String.class.equals(parameterTypes[0]))) { + throw createInvalidSignatureException(method); } - if (!Type.class.equals(parameterTypes[1])) { - throw createInvalidSignatureException(); + if (!(Object.class.equals(parameterTypes[1]) || Type.class.equals(parameterTypes[1]))) { + throw createInvalidSignatureException(method); } return method; } - private CucumberException createInvalidSignatureException() { - return new CucumberException("" + - "A @DefaultParameterTransformer annotated method must have one of these signature:\n" + - " * public Object defaultParameter(String fromValue, Type toValueType)\n" + - " * public Object defaultParameter(Object fromValue, Type toValueType)\n" - ); + private static CucumberException createInvalidSignatureException(Method method) { + return builder(method) + .addAnnotation(DefaultParameterTransformer.class) + .addSignature("public Object defaultDataTableEntry(String fromValue, Type toValueType)") + .addSignature("public Object defaultDataTableEntry(Object fromValue, Type toValueType)") + .build(); } @Override diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index a46996d300..881b8036f8 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -1,17 +1,19 @@ package io.cucumber.java; +import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; +import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.Lookup; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.backend.HookDefinition; -import io.cucumber.core.reflection.MethodFormat; import io.cucumber.core.filter.TagPredicate; -import gherkin.pickles.PickleTag; +import io.cucumber.core.reflection.MethodFormat; import io.cucumber.core.runtime.Invoker; import java.lang.reflect.Method; import java.util.Collection; +import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; + final class JavaHookDefinition implements HookDefinition { private final Method method; @@ -21,7 +23,7 @@ final class JavaHookDefinition implements HookDefinition { private final Lookup lookup; JavaHookDefinition(Method method, String tagExpression, int order, long timeoutMillis, Lookup lookup) { - this.method = method; + this.method = requireValidMethod(method); this.timeoutMillis = timeoutMillis; this.tagPredicate = new TagPredicate(tagExpression); this.order = order; @@ -38,21 +40,40 @@ public String getLocation(boolean detail) { return format.format(method); } + + private static Method requireValidMethod(Method method) { + Class[] parameterTypes = method.getParameterTypes(); + if (parameterTypes.length > 2) { + throw createInvalidSignatureException(method); + } + + if (parameterTypes.length == 1) { + if (!(Object.class.equals(parameterTypes[0]) || Scenario.class.equals(parameterTypes[0]))) { + throw createInvalidSignatureException(method); + } + } + + return method; + } + + private static CucumberException createInvalidSignatureException(Method method) { + return builder(method) + .addAnnotation(Before.class) + .addAnnotation(After.class) + .addAnnotation(BeforeStep.class) + .addAnnotation(AfterStep.class) + .addSignature("public void before_or_after(Scenario scenario)") + .addSignature("public void before_or_after()") + .build(); + } + @Override public void execute(Scenario scenario) throws Throwable { Object[] args; - switch (method.getParameterTypes().length) { - case 0: - args = new Object[0]; - break; - case 1: - if (!Scenario.class.equals(method.getParameterTypes()[0])) { - throw new CucumberException("When a hook declares an argument it must be of type " + Scenario.class.getName() + ". " + method.toString()); - } - args = new Object[]{scenario}; - break; - default: - throw new CucumberException("Hooks must declare 0 or 1 arguments. " + method.toString()); + if (method.getParameterTypes().length == 1) { + args = new Object[]{scenario}; + } else { + args = new Object[0]; } Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); diff --git a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java index f6a90bfe1c..e7aac0d56b 100644 --- a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java @@ -8,8 +8,8 @@ import io.cucumber.cucumberexpressions.ParameterType; import java.lang.reflect.Method; -import java.util.Collections; +import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; import static java.util.Collections.singletonList; class JavaParameterTypeDefinition implements ParameterTypeDefinition { @@ -36,34 +36,34 @@ class JavaParameterTypeDefinition implements ParameterTypeDefinition { ); } - private Method requireValidMethod(Method method) { + private static Method requireValidMethod(Method method) { Class returnType = method.getReturnType(); if (Void.class.equals(returnType)) { - throw createInvalidSignatureException(); + throw createInvalidSignatureException(method); } Class[] parameterTypes = method.getParameterTypes(); if (parameterTypes.length < 1) { - throw createInvalidSignatureException(); + throw createInvalidSignatureException(method); } for (Class parameterType : parameterTypes) { if (!String.class.equals(parameterType)) { - throw createInvalidSignatureException(); + throw createInvalidSignatureException(method); } } return method; } - private CucumberException createInvalidSignatureException() { - return new CucumberException("" + - "A @ParameterType annotated method must have one of these signatures:\n" + - " * public Author parameterName(String all)\n" + - " * public Author parameterName(String captureGroup1, String captureGroup2, ...ect )\n" + - " * public Author parameterName(String... captureGroups)\n" + - "Note: Author is an example of the class you want to convert parameter name" - ); + private static CucumberException createInvalidSignatureException(Method method) { + return builder(method) + .addAnnotation(ParameterType.class) + .addSignature("public Author parameterName(String all)") + .addSignature("public Author parameterName(String captureGroup1, String captureGroup2, ...ect )") + .addSignature("public Author parameterName(String... captureGroups)") + .addNote("Note: Author is an example of the class you want to convert captureGroups to") + .build(); } @Override diff --git a/java/src/main/java/io/cucumber/java/MethodScanner.java b/java/src/main/java/io/cucumber/java/MethodScanner.java index 89cd5ef92a..294996cf99 100644 --- a/java/src/main/java/io/cucumber/java/MethodScanner.java +++ b/java/src/main/java/io/cucumber/java/MethodScanner.java @@ -21,7 +21,7 @@ final class MethodScanner { /** * Registers step definitions and hooks. * - * @param javaBackend the backend where stepdefs and hooks will be registered + * @param javaBackend the backend where steps and hooks will be registered * @param gluePaths where to look */ void scan(JavaBackend javaBackend, List gluePaths) { @@ -46,7 +46,7 @@ void scan(JavaBackend javaBackend, List gluePaths) { /** * Registers step definitions and hooks. * - * @param javaBackend the backend where stepdefs and hooks will be registered. + * @param javaBackend the backend where steps and hooks will be registered. * @param method a candidate for being a stepdef or hook. * @param glueCodeClass the class where the method is declared. */ @@ -86,6 +86,8 @@ private boolean isHookAnnotation(Annotation annotation) { || annotationClass.equals(ParameterType.class) || annotationClass.equals(DataTableType.class) || annotationClass.equals(DefaultParameterTransformer.class) + || annotationClass.equals(DefaultDataTableEntryTransformer.class) + || annotationClass.equals(DefaultDataTableCellTransformer.class) ; } diff --git a/java/src/test/java/io/cucumber/java/JavaBackendTest.java b/java/src/test/java/io/cucumber/java/JavaBackendTest.java index ec11dac401..5e4eaca549 100644 --- a/java/src/test/java/io/cucumber/java/JavaBackendTest.java +++ b/java/src/test/java/io/cucumber/java/JavaBackendTest.java @@ -6,8 +6,7 @@ import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.stepexpression.TypeRegistry; -import io.cucumber.java.stepdefs.Stepdefs; +import io.cucumber.java.steps.Steps; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -20,8 +19,6 @@ import java.net.URI; import java.util.List; -import java.util.Locale; -import java.util.function.Function; import static java.lang.Thread.currentThread; import static java.util.Arrays.asList; @@ -58,16 +55,16 @@ public void createBackend() { @Test public void finds_step_definitions_by_classpath_url() { - backend.loadGlue(glue, asList(URI.create("classpath:io/cucumber/java/stepdefs"))); + backend.loadGlue(glue, asList(URI.create("classpath:io/cucumber/java/steps"))); backend.buildWorld(); - verify(factory).addClass(Stepdefs.class); + verify(factory).addClass(Steps.class); } @Test public void detects_subclassed_glue_and_throws_exception() { - final Executable testMethod = () -> backend.loadGlue(glue, asList(URI.create("classpath:io/cucumber/java/stepdefs"), URI.create("classpath:io/cucumber/java/incorrectlysubclassedstepdefs"))); + final Executable testMethod = () -> backend.loadGlue(glue, asList(URI.create("classpath:io/cucumber/java/steps"), URI.create("classpath:io/cucumber/java/incorrectlysubclassedsteps"))); final CucumberException expectedThrown = assertThrows(CucumberException.class, testMethod); - assertThat(expectedThrown.getMessage(), is(equalTo("You're not allowed to extend classes that define Step Definitions or hooks. class io.cucumber.java.incorrectlysubclassedstepdefs.SubclassesStepdefs extends class io.cucumber.java.stepdefs.Stepdefs"))); + assertThat(expectedThrown.getMessage(), is(equalTo("You're not allowed to extend classes that define Step Definitions or hooks. class io.cucumber.java.incorrectlysubclassedsteps.SubclassesSteps extends class io.cucumber.java.steps.Steps"))); } @Test diff --git a/java/src/test/java/io/cucumber/java/annotation/DataTableStepdefs.java b/java/src/test/java/io/cucumber/java/annotation/DataTableSteps.java similarity index 84% rename from java/src/test/java/io/cucumber/java/annotation/DataTableStepdefs.java rename to java/src/test/java/io/cucumber/java/annotation/DataTableSteps.java index 88e348376b..c8bdaf5498 100644 --- a/java/src/test/java/io/cucumber/java/annotation/DataTableStepdefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/DataTableSteps.java @@ -1,5 +1,6 @@ package io.cucumber.java.annotation; +import io.cucumber.datatable.DataTable; import io.cucumber.java.DataTableType; import io.cucumber.java.Transpose; import io.cucumber.java.en.Given; @@ -9,14 +10,26 @@ import java.util.Objects; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; -public class DataTableStepdefs { +public class DataTableSteps { private final Author expectedAuthor = new Author("Annie M. G.", "Schmidt", "1911-03-20"); private final Person expectedPerson = new Person("Astrid", "Lindgren"); + @DataTableType + public Author authorEntryTransformer(Map entry) { + return new DataTableSteps.Author( + entry.get("firstName"), + entry.get("lastName"), + entry.get("birthDate")); + } + + @DataTableType + public Author singleAuthorTransformer(DataTable table) { + return authorEntryTransformer(table.asMaps().get(0)); + } + @Given("a list of authors in a table") public void aListOfAuthorsInATable(List authors) { assertTrue(authors.contains(expectedAuthor)); @@ -79,12 +92,12 @@ public int hashCode() { } @Given("a list of people in a table") - public void this_table_of_authors(List persons) { + public void this_table_of_authors(List persons) { assertTrue(persons.contains(expectedPerson)); } @DataTableType - public DataTableStepdefs.Person transform(Map tableEntry) { + public DataTableSteps.Person transform(Map tableEntry) { return new Person(tableEntry.get("first"), tableEntry.get("last")); } diff --git a/java/src/test/java/io/cucumber/java/annotation/ParameterTypeStepdefs.java b/java/src/test/java/io/cucumber/java/annotation/ParameterTypeSteps.java similarity index 95% rename from java/src/test/java/io/cucumber/java/annotation/ParameterTypeStepdefs.java rename to java/src/test/java/io/cucumber/java/annotation/ParameterTypeSteps.java index 461ddc5a97..a650b3a7bf 100644 --- a/java/src/test/java/io/cucumber/java/annotation/ParameterTypeStepdefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/ParameterTypeSteps.java @@ -6,7 +6,7 @@ import java.time.LocalDate; -public class ParameterTypeStepdefs { +public class ParameterTypeSteps { private final LocalDate expected = LocalDate.of(1907, 11, 14); diff --git a/java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java b/java/src/test/java/io/cucumber/java/annotation/ScenarioSteps.java similarity index 96% rename from java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java rename to java/src/test/java/io/cucumber/java/annotation/ScenarioSteps.java index 8f14e02aef..a3d3c3eac0 100644 --- a/java/src/test/java/io/cucumber/java/annotation/ScenarioStepDefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/ScenarioSteps.java @@ -8,7 +8,7 @@ import static org.junit.Assert.assertEquals; -public class ScenarioStepDefs { +public class ScenarioSteps { private String scenarioName = ""; diff --git a/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java b/java/src/test/java/io/cucumber/java/annotation/Steps.java similarity index 78% rename from java/src/test/java/io/cucumber/java/annotation/Stepdefs.java rename to java/src/test/java/io/cucumber/java/annotation/Steps.java index c9ccd045fb..5fb8caac2f 100644 --- a/java/src/test/java/io/cucumber/java/annotation/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/Steps.java @@ -2,15 +2,10 @@ import io.cucumber.java.en.Given; -import java.util.List; - -public class Stepdefs { +public class Steps { @Given("I have {int} cukes in the belly") public void I_have_cukes_in_the_belly(int arg1) { } - - - } diff --git a/java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java b/java/src/test/java/io/cucumber/java/annotation/SubstitutionSteps.java similarity index 97% rename from java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java rename to java/src/test/java/io/cucumber/java/annotation/SubstitutionSteps.java index c87293a36d..190a983cc7 100644 --- a/java/src/test/java/io/cucumber/java/annotation/SubstitutionStepdefs.java +++ b/java/src/test/java/io/cucumber/java/annotation/SubstitutionSteps.java @@ -9,7 +9,7 @@ import static org.junit.Assert.assertEquals; -public class SubstitutionStepdefs { +public class SubstitutionSteps { private static final Map ROLES = new HashMap() {{ put("Manager", "now able to manage your employee accounts"); put("Admin", "able to manage any user account on the system"); diff --git a/java/src/test/java/io/cucumber/java/annotation/TypeRegistryConfiguration.java b/java/src/test/java/io/cucumber/java/annotation/TypeRegistryConfiguration.java index 5654a53328..8e1740902f 100644 --- a/java/src/test/java/io/cucumber/java/annotation/TypeRegistryConfiguration.java +++ b/java/src/test/java/io/cucumber/java/annotation/TypeRegistryConfiguration.java @@ -4,30 +4,10 @@ import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.cucumberexpressions.CaptureGroupTransformer; import io.cucumber.cucumberexpressions.ParameterType; -import io.cucumber.datatable.DataTableType; -import io.cucumber.datatable.TableEntryTransformer; -import io.cucumber.datatable.TableTransformer; import java.time.LocalDate; -import java.util.Locale; -import java.util.Map; - -import static java.util.Locale.ENGLISH; public class TypeRegistryConfiguration implements TypeRegistryConfigurer { - - private final TableEntryTransformer authorEntryTransformer = - tableEntry -> new DataTableStepdefs.Author( - tableEntry.get("firstName"), - tableEntry.get("lastName"), - tableEntry.get("birthDate")); - - private final TableTransformer singleAuthorTransformer = - table -> { - Map tableEntry = table.asMaps().get(0); - return authorEntryTransformer.transform(tableEntry); - }; - private final CaptureGroupTransformer localDateParameterType = (String[] args) -> LocalDate.of( Integer.parseInt(args[0]), @@ -35,22 +15,8 @@ public class TypeRegistryConfiguration implements TypeRegistryConfigurer { Integer.parseInt(args[2]) ); - @Override - public Locale locale() { - return ENGLISH; - } - @Override public void configureTypeRegistry(TypeRegistry typeRegistry) { - typeRegistry.defineDataTableType(new DataTableType( - DataTableStepdefs.Author.class, - authorEntryTransformer)); - - typeRegistry.defineDataTableType(new DataTableType( - DataTableStepdefs.Author.class, - singleAuthorTransformer)); - - typeRegistry.defineParameterType(new ParameterType<>( "parameterTypeRegistryIso8601Date", "([0-9]{4})/([0-9]{2})/([0-9]{2})", diff --git a/java/src/test/java/io/cucumber/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java b/java/src/test/java/io/cucumber/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java deleted file mode 100644 index da629b3506..0000000000 --- a/java/src/test/java/io/cucumber/java/incorrectlysubclassedstepdefs/SubclassesStepdefs.java +++ /dev/null @@ -1,6 +0,0 @@ -package io.cucumber.java.incorrectlysubclassedstepdefs; - -import io.cucumber.java.stepdefs.Stepdefs; - -public class SubclassesStepdefs extends Stepdefs { -} diff --git a/java/src/test/java/io/cucumber/java/incorrectlysubclassedsteps/SubclassesSteps.java b/java/src/test/java/io/cucumber/java/incorrectlysubclassedsteps/SubclassesSteps.java new file mode 100644 index 0000000000..b13228ab28 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/incorrectlysubclassedsteps/SubclassesSteps.java @@ -0,0 +1,6 @@ +package io.cucumber.java.incorrectlysubclassedsteps; + +import io.cucumber.java.steps.Steps; + +public class SubclassesSteps extends Steps { +} diff --git a/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java b/java/src/test/java/io/cucumber/java/repeatable/Steps.java similarity index 86% rename from java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java rename to java/src/test/java/io/cucumber/java/repeatable/Steps.java index 7f25d583d7..7fa5f3081a 100644 --- a/java/src/test/java/io/cucumber/java/repeatable/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/repeatable/Steps.java @@ -2,7 +2,7 @@ import io.cucumber.java.en.Given; -public class Stepdefs { +public class Steps { @Given("test") @Given("test again") diff --git a/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java b/java/src/test/java/io/cucumber/java/steps/Steps.java similarity index 60% rename from java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java rename to java/src/test/java/io/cucumber/java/steps/Steps.java index e8e50648ab..109bdc4c89 100644 --- a/java/src/test/java/io/cucumber/java/stepdefs/Stepdefs.java +++ b/java/src/test/java/io/cucumber/java/steps/Steps.java @@ -1,8 +1,8 @@ -package io.cucumber.java.stepdefs; +package io.cucumber.java.steps; import io.cucumber.java.en.Given; -public class Stepdefs { +public class Steps { @Given("test") public void test() { diff --git a/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java b/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java index 656715fd7c..983dba2ca3 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java @@ -40,7 +40,7 @@ public void createBackend() { @Test public void finds_step_definitions_by_classpath_url() { - backend.loadGlue(glue, asList(URI.create("classpath:io/cucumber/java8/stepdefs"))); + backend.loadGlue(glue, asList(URI.create("classpath:io/cucumber/java8/steps"))); backend.buildWorld(); verify(factory).addClass(Stepdefs.class); } From 68b6d1419b46a464e77cad04566e9f42b7b275cf Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Wed, 24 Jul 2019 23:03:21 +0200 Subject: [PATCH 135/155] [Java] Extract method formatting from glue definitions --- .../cucumber/java/AbstractGlueDefinition.java | 34 +++++++++++++++++++ .../java/JavaDataTableTypeDefinition.java | 21 ++---------- ...ultDataTableCellTransformerDefinition.java | 14 ++------ ...ltDataTableEntryTransformerDefinition.java | 16 ++------- ...DefaultParameterTransformerDefinition.java | 16 ++------- .../io/cucumber/java/JavaHookDefinition.java | 13 ++----- .../java/JavaParameterTypeDefinition.java | 16 ++------- .../io/cucumber/java/JavaStepDefinition.java | 15 ++------ 8 files changed, 49 insertions(+), 96 deletions(-) create mode 100644 java/src/main/java/io/cucumber/java/AbstractGlueDefinition.java diff --git a/java/src/main/java/io/cucumber/java/AbstractGlueDefinition.java b/java/src/main/java/io/cucumber/java/AbstractGlueDefinition.java new file mode 100644 index 0000000000..344a8d7d17 --- /dev/null +++ b/java/src/main/java/io/cucumber/java/AbstractGlueDefinition.java @@ -0,0 +1,34 @@ +package io.cucumber.java; + +import io.cucumber.core.reflection.MethodFormat; + +import java.lang.reflect.Method; + +class AbstractGlueDefinition { + + protected final Method method; + private String shortFormat; + private String fullFormat; + + AbstractGlueDefinition(Method method) { + this.method = method; + } + + public final String getLocation(boolean detail) { + return detail ? getFullLocationLocation() : getShortFormatLocation(); + } + + private String getShortFormatLocation() { + if (shortFormat == null) { + shortFormat = MethodFormat.SHORT.format(method); + } + return shortFormat; + } + + private String getFullLocationLocation() { + if (fullFormat == null) { + fullFormat = MethodFormat.FULL.format(method); + } + return fullFormat; + } +} diff --git a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java index 9fb0128cae..b3b9abd871 100644 --- a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java @@ -3,14 +3,9 @@ import io.cucumber.core.backend.DataTableTypeDefinition; import io.cucumber.core.backend.Lookup; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.reflection.MethodFormat; import io.cucumber.core.runtime.Invoker; -import io.cucumber.datatable.DataTable; import io.cucumber.datatable.DataTableType; -import io.cucumber.datatable.TableCellTransformer; -import io.cucumber.datatable.TableEntryTransformer; -import io.cucumber.datatable.TableRowTransformer; -import io.cucumber.datatable.TableTransformer; +import io.cucumber.datatable.*; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; @@ -20,20 +15,15 @@ import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; -class JavaDataTableTypeDefinition implements DataTableTypeDefinition { +class JavaDataTableTypeDefinition extends AbstractGlueDefinition implements DataTableTypeDefinition { - private final Method method; private final Lookup lookup; private final DataTableType dataTableType; - private final String shortFormat; - private final String fullFormat; JavaDataTableTypeDefinition(Method method, Lookup lookup) { - this.method = method; + super(method); this.lookup = lookup; this.dataTableType = createDataTableType(method); - this.shortFormat = MethodFormat.SHORT.format(method); - this.fullFormat = MethodFormat.FULL.format(method); } @SuppressWarnings("unchecked") @@ -121,11 +111,6 @@ public DataTableType dataTableType() { return dataTableType; } - @Override - public String getLocation(boolean detail) { - return detail ? fullFormat : shortFormat; - } - private Object execute(Object arg) throws Throwable { return Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, 0, arg); } diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java index 4863fc1d1d..0f4af2aadb 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java @@ -3,7 +3,6 @@ import io.cucumber.core.backend.DefaultDataTableCellTransformerDefinition; import io.cucumber.core.backend.Lookup; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.reflection.MethodFormat; import io.cucumber.core.runtime.Invoker; import io.cucumber.datatable.TableCellByTypeTransformer; @@ -12,20 +11,15 @@ import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; -class JavaDefaultDataTableCellTransformerDefinition implements DefaultDataTableCellTransformerDefinition { +class JavaDefaultDataTableCellTransformerDefinition extends AbstractGlueDefinition implements DefaultDataTableCellTransformerDefinition { - private final Method method; private final Lookup lookup; private final TableCellByTypeTransformer transformer; - private final String shortFormat; - private final String fullFormat; JavaDefaultDataTableCellTransformerDefinition(Method method, Lookup lookup) { - this.method = requireValidMethod(method); + super(requireValidMethod(method)); this.lookup = lookup; - this.shortFormat = MethodFormat.SHORT.format(method); - this.fullFormat = MethodFormat.FULL.format(method); this.transformer = this::execute; } @@ -64,10 +58,6 @@ public TableCellByTypeTransformer tableCellByTypeTransformer() { return transformer; } - @Override - public String getLocation(boolean detail) { - return detail ? fullFormat : shortFormat; - } @SuppressWarnings("unchecked") private T execute(String fromValue, Class toValueType) throws Throwable { diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java index 74d13d4963..c592a20018 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java @@ -3,7 +3,6 @@ import io.cucumber.core.backend.DefaultDataTableEntryTransformerDefinition; import io.cucumber.core.backend.Lookup; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.reflection.MethodFormat; import io.cucumber.core.runtime.Invoker; import io.cucumber.datatable.TableCellByTypeTransformer; import io.cucumber.datatable.TableEntryByTypeTransformer; @@ -15,23 +14,17 @@ import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; -class JavaDefaultDataTableEntryTransformerDefinition implements DefaultDataTableEntryTransformerDefinition { +class JavaDefaultDataTableEntryTransformerDefinition extends AbstractGlueDefinition implements DefaultDataTableEntryTransformerDefinition { private static final Type mapStringStringType = new TypeReference>() { }.getType(); - private final Method method; - private final Lookup lookup; private final TableEntryByTypeTransformer transformer; - private final String shortFormat; - private final String fullFormat; JavaDefaultDataTableEntryTransformerDefinition(Method method, Lookup lookup) { - this.method = requireValidMethod(method); + super(requireValidMethod(method)); this.lookup = lookup; - this.shortFormat = MethodFormat.SHORT.format(method); - this.fullFormat = MethodFormat.FULL.format(method); this.transformer = this::execute; } @@ -78,11 +71,6 @@ public TableEntryByTypeTransformer tableEntryByTypeTransformer() { return transformer; } - @Override - public String getLocation(boolean detail) { - return detail ? fullFormat : shortFormat; - } - @SuppressWarnings("unchecked") private T execute(Map fromValue, Class toValueType, TableCellByTypeTransformer cellTransformer) throws Throwable { Object[] args; diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java index bcbb9a99de..8b481aef86 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java @@ -3,7 +3,6 @@ import io.cucumber.core.backend.DefaultParameterTransformerDefinition; import io.cucumber.core.backend.Lookup; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.reflection.MethodFormat; import io.cucumber.core.runtime.Invoker; import io.cucumber.cucumberexpressions.ParameterByTypeTransformer; @@ -12,20 +11,14 @@ import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; -class JavaDefaultParameterTransformerDefinition implements DefaultParameterTransformerDefinition { - - private final Method method; +class JavaDefaultParameterTransformerDefinition extends AbstractGlueDefinition implements DefaultParameterTransformerDefinition { private final Lookup lookup; private final ParameterByTypeTransformer transformer; - private final String shortFormat; - private final String fullFormat; JavaDefaultParameterTransformerDefinition(Method method, Lookup lookup) { - this.method = requireValidMethod(method); + super(requireValidMethod(method)); this.lookup = lookup; - this.shortFormat = MethodFormat.SHORT.format(method); - this.fullFormat = MethodFormat.FULL.format(method); this.transformer = this::execute; } @@ -64,11 +57,6 @@ public ParameterByTypeTransformer parameterByTypeTransformer() { return transformer; } - @Override - public String getLocation(boolean detail) { - return detail ? fullFormat : shortFormat; - } - private Object execute(String fromValue, Type toValueType) throws Throwable { return Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, 0, fromValue, toValueType); } diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index 881b8036f8..0c71446c94 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -6,7 +6,6 @@ import io.cucumber.core.backend.Lookup; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.filter.TagPredicate; -import io.cucumber.core.reflection.MethodFormat; import io.cucumber.core.runtime.Invoker; import java.lang.reflect.Method; @@ -14,16 +13,15 @@ import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; -final class JavaHookDefinition implements HookDefinition { +final class JavaHookDefinition extends AbstractGlueDefinition implements HookDefinition { - private final Method method; private final long timeoutMillis; private final TagPredicate tagPredicate; private final int order; private final Lookup lookup; JavaHookDefinition(Method method, String tagExpression, int order, long timeoutMillis, Lookup lookup) { - this.method = requireValidMethod(method); + super(requireValidMethod(method)); this.timeoutMillis = timeoutMillis; this.tagPredicate = new TagPredicate(tagExpression); this.order = order; @@ -34,13 +32,6 @@ Method getMethod() { return method; } - @Override - public String getLocation(boolean detail) { - MethodFormat format = detail ? MethodFormat.FULL : MethodFormat.SHORT; - return format.format(method); - } - - private static Method requireValidMethod(Method method) { Class[] parameterTypes = method.getParameterTypes(); if (parameterTypes.length > 2) { diff --git a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java index e7aac0d56b..b53044029c 100644 --- a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java @@ -3,7 +3,6 @@ import io.cucumber.core.backend.Lookup; import io.cucumber.core.backend.ParameterTypeDefinition; import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.reflection.MethodFormat; import io.cucumber.core.runtime.Invoker; import io.cucumber.cucumberexpressions.ParameterType; @@ -12,20 +11,14 @@ import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; import static java.util.Collections.singletonList; -class JavaParameterTypeDefinition implements ParameterTypeDefinition { - - private final Method method; +class JavaParameterTypeDefinition extends AbstractGlueDefinition implements ParameterTypeDefinition { private final Lookup lookup; private final ParameterType parameterType; - private final String shortFormat; - private final String fullFormat; JavaParameterTypeDefinition(String name, String pattern, Method method, boolean useForSnippets, boolean preferForRegexpMatch, Lookup lookup) { - this.method = requireValidMethod(method); + super(requireValidMethod(method)); this.lookup = lookup; - this.shortFormat = MethodFormat.SHORT.format(method); - this.fullFormat = MethodFormat.FULL.format(method); this.parameterType = new ParameterType<>( name.isEmpty() ? method.getName() : name, singletonList(pattern), @@ -71,11 +64,6 @@ public ParameterType parameterType() { return parameterType; } - @Override - public String getLocation(boolean detail) { - return detail ? fullFormat : shortFormat; - } - private Object execute(Object[] args) throws Throwable { return Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, 0, args); } diff --git a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java index 4a364fa55f..a881554a0b 100644 --- a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java @@ -3,33 +3,27 @@ import io.cucumber.core.backend.Lookup; import io.cucumber.core.backend.ParameterInfo; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.reflection.MethodFormat; import io.cucumber.core.runtime.Invoker; import java.lang.reflect.Method; import java.util.List; -final class JavaStepDefinition implements StepDefinition { - private final Method method; +final class JavaStepDefinition extends AbstractGlueDefinition implements StepDefinition { private final String expression; private final long timeoutMillis; private final Lookup lookup; - private final String shortFormat; - private final String fullFormat; private final List parameterInfos; JavaStepDefinition(Method method, String expression, long timeoutMillis, Lookup lookup) { - this.method = method; + super(method); this.timeoutMillis = timeoutMillis; this.lookup = lookup; this.parameterInfos = JavaParameterInfo.fromMethod(method); this.expression = expression; - this.shortFormat = MethodFormat.SHORT.format(method); - this.fullFormat = MethodFormat.FULL.format(method); } @Override @@ -37,11 +31,6 @@ public void execute(Object[] args) throws Throwable { Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, timeoutMillis, args); } - @Override - public String getLocation(boolean detail) { - return detail ? fullFormat : shortFormat; - } - @Override public boolean isDefinedAt(StackTraceElement e) { return e.getClassName().equals(method.getDeclaringClass().getName()) && e.getMethodName().equals(method.getName()); From fc14d77987f364d0517aff9918150fce55c0897d Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Wed, 24 Jul 2019 23:58:38 +0200 Subject: [PATCH 136/155] [Java] Test default table entry transformer definition --- .../java/InvalidMethodSignatureException.java | 2 +- ...ltDataTableEntryTransformerDefinition.java | 16 +-- ...taTableEntryTransformerDefinitionTest.java | 136 ++++++++++++++++++ 3 files changed, 142 insertions(+), 12 deletions(-) create mode 100644 java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java diff --git a/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java b/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java index 590d71b61c..d63449eaa3 100644 --- a/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java +++ b/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java @@ -41,7 +41,7 @@ InvalidMethodSignatureExceptionBuilder addNote(String note) { public CucumberException build() { return new CucumberException("" + describeAnnotations() + " must have one of these signatures:\n" + - " *" + describeAvailableSignature() + "\n" + + " * " + describeAvailableSignature() + "\n" + "at " + describeLocation() + "\n" + describeNote() + "\n" ); diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java index c592a20018..afa8679c03 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java @@ -6,7 +6,6 @@ import io.cucumber.core.runtime.Invoker; import io.cucumber.datatable.TableCellByTypeTransformer; import io.cucumber.datatable.TableEntryByTypeTransformer; -import io.cucumber.datatable.TypeReference; import java.lang.reflect.Method; import java.lang.reflect.Type; @@ -16,9 +15,6 @@ class JavaDefaultDataTableEntryTransformerDefinition extends AbstractGlueDefinition implements DefaultDataTableEntryTransformerDefinition { - private static final Type mapStringStringType = new TypeReference>() { - }.getType(); - private final Lookup lookup; private final TableEntryByTypeTransformer transformer; @@ -30,7 +26,7 @@ class JavaDefaultDataTableEntryTransformerDefinition extends AbstractGlueDefinit private static Method requireValidMethod(Method method) { Class returnType = method.getReturnType(); - if (Void.class.equals(returnType)) { + if (Void.class.equals(returnType) || void.class.equals(returnType)) { throw createInvalidSignatureException(method); } @@ -39,11 +35,11 @@ private static Method requireValidMethod(Method method) { throw createInvalidSignatureException(method); } - if (!(Object.class.equals(parameterTypes[0]) || mapStringStringType.equals(parameterTypes[0]))) { + if (!(Object.class.equals(parameterTypes[0]) || Map.class.equals(parameterTypes[0]))) { throw createInvalidSignatureException(method); } - if (!(Object.class.equals(parameterTypes[1]) || Type.class.equals(parameterTypes[1]))) { + if (!(Object.class.equals(parameterTypes[1]) || Type.class.equals(parameterTypes[1]) || Class.class.equals(parameterTypes[1]))) { throw createInvalidSignatureException(method); } @@ -59,10 +55,8 @@ private static Method requireValidMethod(Method method) { private static CucumberException createInvalidSignatureException(Method method) { return builder(method) .addAnnotation(DefaultDataTableEntryTransformer.class) - .addSignature("public Object defaultDataTableEntry(Map fromValue, Type toValueType)") - .addSignature("public Object defaultDataTableEntry(Object fromValue, Type toValueType)") - .addSignature("public Object defaultDataTableCell(Map fromValue, Type toValueType, TableCellByTypeTransformer cellTransformer)") - .addSignature("public Object defaultDataTableCell(Object fromValue, Type toValueType, TableCellByTypeTransformer cellTransformer)") + .addSignature("public T defaultDataTableEntry(Map fromValue, Class toValueType)") + .addSignature("public T defaultDataTableCell(Map fromValue, Class toValueType, TableCellByTypeTransformer cellTransformer)") .build(); } diff --git a/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java new file mode 100644 index 0000000000..0327cbb979 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java @@ -0,0 +1,136 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.Lookup; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.datatable.TableCellByTypeTransformer; +import org.junit.Test; + +import java.lang.reflect.Method; +import java.util.Map; +import java.util.stream.Collectors; + +import static java.util.Collections.singletonMap; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class JavaDefaultDataTableEntryTransformerDefinitionTest { + + private final Map fromValue = singletonMap("key", "value"); + private final Lookup lookup = new Lookup() { + + @Override + @SuppressWarnings("unchecked") + public T getInstance(Class glueClass) { + return (T) JavaDefaultDataTableEntryTransformerDefinitionTest.this; + } + }; + + private TableCellByTypeTransformer cellTransformer = new TableCellByTypeTransformer() { + @Override + public T transform(String value, Class cellType) { + throw new IllegalStateException(); + } + }; + + @Test + public void transforms_with_correct_method() throws Throwable { + Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("correct_method", Map.class, Class.class); + JavaDefaultDataTableEntryTransformerDefinition definition = + new JavaDefaultDataTableEntryTransformerDefinition(method, lookup); + + assertThat(definition.tableEntryByTypeTransformer() + .transform(fromValue, String.class, cellTransformer), is("key=value")); + + } + + public T correct_method(Map fromValue, Class toValue) { + return join(fromValue); + } + + + @Test + public void transforms_with_correct_method_with_cell_transformer() throws Throwable { + Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("correct_method_with_cell_transformer", Map.class, Class.class, TableCellByTypeTransformer.class); + JavaDefaultDataTableEntryTransformerDefinition definition = + new JavaDefaultDataTableEntryTransformerDefinition(method, lookup); + + assertThat(definition.tableEntryByTypeTransformer() + .transform(fromValue, String.class, cellTransformer), is("key=value")); + + } + + + public T correct_method_with_cell_transformer(Map fromValue, Class toValue, TableCellByTypeTransformer cellTransformer) { + return join(fromValue); + } + + @Test + public void method_must_have_2_or_3_arguments() throws Throwable { + Method toFew = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("one_argument", Map.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(toFew, lookup)); + Method toMany = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("four_arguments", Map.class, String.class, String.class, String.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(toMany, lookup)); + } + + public T one_argument(Map fromValue) { + return null; + } + + + public T four_arguments(Map fromValue, String one, String two, String three) { + return null; + } + + + @Test + public void method_must_have_return_type() throws Throwable { + Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("void_return_type", Map.class, Class.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + } + + public void void_return_type(Map fromValue, Class toValue) { + } + + + @Test + public void method_must_have_map_as_first_argument() throws Throwable { + Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_first_type", String.class, Class.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + } + + + public T invalid_first_type(String fromValue, Class toValue) { + return null; + } + + + @Test + public void method_must_have_class_as_second_argument() throws Throwable { + Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_second_type", Map.class, String.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + } + + public T invalid_second_type(Map fromValue, String toValue) { + return null; + } + + + @Test + public void method_must_have_cell_tranformer_as_optional_third_argument() throws Throwable { + Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_optional_third_type", Map.class, Class.class, String.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + } + + + public T invalid_optional_third_type(Map fromValue, Class toValue, String cellTransformer) { + return null; + } + + private static T join(Map fromValue) { + //noinspection unchecked + return (T) fromValue.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining()); + } + + +} \ No newline at end of file From f8ecd7bfb92a766f5ff45cd98b93b209ca2e3246 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Fri, 26 Jul 2019 23:49:43 +0200 Subject: [PATCH 137/155] [Java] Test hook definition definition --- .../core/reflection/MethodFormat.java | 2 +- .../java/InvalidMethodSignatureException.java | 4 +- .../java/JavaDataTableTypeDefinition.java | 2 +- .../io/cucumber/java/JavaHookDefinition.java | 2 +- .../java/io/cucumber/java/JavaHookTest.java | 172 ++++++++++++------ 5 files changed, 126 insertions(+), 56 deletions(-) diff --git a/core/src/main/java/io/cucumber/core/reflection/MethodFormat.java b/core/src/main/java/io/cucumber/core/reflection/MethodFormat.java index dd31929d51..c1eea722ae 100644 --- a/core/src/main/java/io/cucumber/core/reflection/MethodFormat.java +++ b/core/src/main/java/io/cucumber/core/reflection/MethodFormat.java @@ -13,7 +13,7 @@ */ public final class MethodFormat { private static final Pattern METHOD_PATTERN = Pattern.compile("((?:static\\s|public\\s)+)([^\\s]*)\\s\\.?(.*)\\.([^\\(]*)\\(([^\\)]*)\\)(?: throws )?(.*)"); - private static final Pattern PACKAGE_PATTERN = Pattern.compile("[^,]*\\."); + private static final Pattern PACKAGE_PATTERN = Pattern.compile("[^,<>]*\\."); private final MessageFormat format; public static final MethodFormat SHORT = new MethodFormat("%c.%m(%a)"); diff --git a/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java b/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java index d63449eaa3..54a46586ed 100644 --- a/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java +++ b/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java @@ -61,12 +61,12 @@ private String describeAvailableSignature() { private String describeAnnotations() { if (annotations.size() == 1) { - return "A @" + annotations.get(0).getName() + " annotated method"; + return "A @" + annotations.get(0).getSimpleName() + " annotated method"; } StringBuilder builder = new StringBuilder(); for (int i = 0; i < annotations.size(); i++) { - builder.append(annotations.get(i).getName()); + builder.append(annotations.get(i).getSimpleName()); if (i < annotations.size() - 2) { builder.append(", "); diff --git a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java index b3b9abd871..9648e66228 100644 --- a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java @@ -99,7 +99,7 @@ private static Type requireValidParameterType(Method method) { private static Class requireValidReturnType(Method method) { Class returnType = method.getReturnType(); - if (Void.class.equals(returnType)) { + if (Void.class.equals(returnType) || void.class.equals(returnType)) { throw createInvalidSignatureException(method); } return returnType; diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index 0c71446c94..e90ba13815 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -34,7 +34,7 @@ Method getMethod() { private static Method requireValidMethod(Method method) { Class[] parameterTypes = method.getParameterTypes(); - if (parameterTypes.length > 2) { + if (parameterTypes.length > 1) { throw createInvalidSignatureException(method); } diff --git a/java/src/test/java/io/cucumber/java/JavaHookTest.java b/java/src/test/java/io/cucumber/java/JavaHookTest.java index 65c41c40d6..cd1e7cc39a 100644 --- a/java/src/test/java/io/cucumber/java/JavaHookTest.java +++ b/java/src/test/java/io/cucumber/java/JavaHookTest.java @@ -4,27 +4,30 @@ import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.Glue; -import io.cucumber.core.backend.HookDefinition; +import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.stepexpression.TypeRegistry; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatcher; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import java.lang.reflect.Method; -import java.net.URI; import java.util.Collections; -import java.util.Locale; +import java.util.List; import static java.util.Arrays.asList; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.AdditionalMatchers.not; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.mock; @@ -46,6 +49,10 @@ public class JavaHookTest { private static final Method BEFORESTEP; private static final Method AFTERSTEP; private static final Method BAD_AFTER; + private static final Method BAD_GENERIC_AFTER; + private static final Method BAD_MULTIPLE; + private static final Method SINGLE_ARG; + private static final Method ZERO_ARG; static { try { @@ -54,6 +61,10 @@ public class JavaHookTest { BEFORESTEP = HasHooks.class.getMethod("beforeStep"); AFTERSTEP = HasHooks.class.getMethod("afterStep"); BAD_AFTER = BadHook.class.getMethod("after", String.class); + BAD_GENERIC_AFTER = BadGenericHook.class.getMethod("after", List.class); + BAD_MULTIPLE = BadHookMultipleArgs.class.getMethod("after", Scenario.class, String.class); + SINGLE_ARG = SingleArg.class.getMethod("after", Scenario.class); + ZERO_ARG = ZeroArg.class.getMethod("after"); } catch (NoSuchMethodException note) { throw new InternalError("dang"); } @@ -62,41 +73,32 @@ public class JavaHookTest { @Mock private Glue glue; - private JavaBackend backend; - - private SingletonFactory objectFactory = new SingletonFactory(); + private final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + private final ResourceLoader resourceLoader = new MultiLoader(classLoader); + private final ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); + private final SingletonFactory objectFactory = new SingletonFactory(); + private final JavaBackend backend = new JavaBackend(objectFactory, objectFactory, classFinder); @org.junit.Before public void createBackendAndLoadNoGlue() { - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - ResourceLoader resourceLoader = new MultiLoader(classLoader); - ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - this.backend = new JavaBackend(objectFactory, objectFactory, classFinder); - backend.loadGlue(glue, Collections.emptyList()); + backend.loadGlue(glue, Collections.emptyList()); } @Test public void before_hooks_get_registered() { objectFactory.setInstance(new HasHooks()); - backend.buildWorld(); backend.addHook(BEFORE.getAnnotation(Before.class), BEFORE); verify(glue).addBeforeHook(argThat(isHookFor(BEFORE))); } private static ArgumentMatcher isHookFor(final Method method) { - return new ArgumentMatcher() { - @Override - public boolean matches(JavaHookDefinition javaHookDefinition) { - return method.equals(javaHookDefinition.getMethod()); - } - }; + return javaHookDefinition -> method.equals(javaHookDefinition.getMethod()); } @Test public void before_step_hooks_get_registered() { objectFactory.setInstance(new HasHooks()); - backend.buildWorld(); backend.addHook(BEFORESTEP.getAnnotation(BeforeStep.class), BEFORESTEP); verify(glue).addBeforeStepHook(argThat(isHookFor(BEFORESTEP))); @@ -105,7 +107,6 @@ public void before_step_hooks_get_registered() { @Test public void after_step_hooks_get_registered() { objectFactory.setInstance(new HasHooks()); - backend.buildWorld(); backend.addHook(AFTERSTEP.getAnnotation(AfterStep.class), AFTERSTEP); verify(glue).addAfterStepHook(argThat(isHookFor(AFTERSTEP))); } @@ -122,19 +123,13 @@ public void after_hooks_get_registered() { @Test public void hook_order_gets_registered() { objectFactory.setInstance(new HasHooks()); - backend.buildWorld(); backend.addHook(AFTER.getAnnotation(After.class), AFTER); verify(glue).addAfterHook(argThat(isHookWithOrder(1))); } private static ArgumentMatcher isHookWithOrder(final int order) { - return new ArgumentMatcher() { - @Override - public boolean matches(JavaHookDefinition argument) { - return argument.getOrder() == order; - } - }; + return argument -> argument.getOrder() == order; } @Test @@ -148,42 +143,21 @@ public void hook_with_no_order_is_last() { @Test public void matches_matching_tags() { objectFactory.setInstance(new HasHooks()); - backend.buildWorld(); backend.addHook(BEFORE.getAnnotation(Before.class), BEFORE); verify(glue).addBeforeHook(argThat(isHookThatMatches(pickleTagBar, pickleTagZap))); } private static ArgumentMatcher isHookThatMatches(final PickleTag... pickleTag) { - return new ArgumentMatcher() { - @Override - public boolean matches(JavaHookDefinition argument) { - return argument.matches(asList(pickleTag)); - } - }; + return argument -> argument.matches(asList(pickleTag)); } @Test public void does_not_match_non_matching_tags() { objectFactory.setInstance(new HasHooks()); - backend.buildWorld(); backend.addHook(BEFORE.getAnnotation(Before.class), BEFORE); verify(glue).addBeforeHook(not(argThat(isHookThatMatches(pickleTagBar)))); } - @Test - public void fails_if_hook_argument_is_not_scenario_result() throws Throwable { - objectFactory.setInstance(new BadHook()); - backend.buildWorld(); - backend.addHook(BAD_AFTER.getAnnotation(After.class), BAD_AFTER); - - ArgumentCaptor javaHookDefinitionArgumentCaptor = ArgumentCaptor.forClass(JavaHookDefinition.class); - verify(glue).addAfterHook(javaHookDefinitionArgumentCaptor.capture()); - - HookDefinition bad = javaHookDefinitionArgumentCaptor.getValue(); - expectedException.expectMessage("When a hook declares an argument it must be of type io.cucumber.core.api.Scenario. public void io.cucumber.java.JavaHookTest$BadHook.after(java.lang.String)"); - bad.execute(mock(Scenario.class)); - } - public static class HasHooks { @Before("(@foo or @bar) and @zap") @@ -207,10 +181,106 @@ public void after() { } } + @Test + public void fails_if_hook_argument_is_not_scenario_result() { + objectFactory.setInstance(new BadHook()); + CucumberException cucumberException = assertThrows( + CucumberException.class, + () -> backend.addHook(BAD_AFTER.getAnnotation(After.class), BAD_AFTER) + ); + assertThat(cucumberException.getMessage(), startsWith("" + + "A method annotated with Before, After, BeforeStep or AfterStep must have one of these signatures:\n" + + " * public void before_or_after(Scenario scenario)\n" + + " * public void before_or_after()\n" + + "at io.cucumber.java.JavaHookTest$BadHook.after(String) in file:")); + } + public static class BadHook { @After public void after(String badType) { } } + + @Test + public void fails_if_generic_hook_argument_is_not_scenario_result() { + objectFactory.setInstance(new BadGenericHook()); + CucumberException cucumberException = assertThrows( + CucumberException.class, + () -> backend.addHook(BAD_GENERIC_AFTER.getAnnotation(After.class), BAD_GENERIC_AFTER) + ); + assertThat(cucumberException.getMessage(), startsWith("" + + "A method annotated with Before, After, BeforeStep or AfterStep must have one of these signatures:\n" + + " * public void before_or_after(Scenario scenario)\n" + + " * public void before_or_after()\n" + + "at io.cucumber.java.JavaHookTest$BadGenericHook.after(List) in file:")); + } + + public static class BadGenericHook { + @After + public void after(List badType) { + + } + } + + @Test + public void fails_if_too_many_arguments() { + objectFactory.setInstance(new BadGenericHook()); + CucumberException cucumberException = assertThrows( + CucumberException.class, + () -> backend.addHook(BAD_MULTIPLE.getAnnotation(After.class), BAD_MULTIPLE) + ); + assertThat(cucumberException.getMessage(), startsWith("" + + "A method annotated with Before, After, BeforeStep or AfterStep must have one of these signatures:\n" + + " * public void before_or_after(Scenario scenario)\n" + + " * public void before_or_after()\n" + + "at io.cucumber.java.JavaHookTest$BadHookMultipleArgs.after(Scenario,String) in file:")); + } + + public static class BadHookMultipleArgs { + @After + public void after(Scenario arg1, String arg2) { + + } + } + + @Test + public void invokes_hook_with_zero_arguments() throws Throwable { + ZeroArg singleArg = new ZeroArg(); + SingletonFactory objectFactory = new SingletonFactory(singleArg); + JavaHookDefinition hook = new JavaHookDefinition(ZERO_ARG, "", 0, 0, objectFactory); + Scenario scenario = Mockito.mock(Scenario.class); + hook.execute(scenario); + assertTrue(objectFactory.getInstance(ZeroArg.class).invoked); + } + + public static class ZeroArg { + + boolean invoked; + + @After + public void after() { + this.invoked = true; + } + } + + @Test + public void invokes_hook_with_one_arguments() throws Throwable { + SingleArg singleArg = new SingleArg(); + SingletonFactory objectFactory = new SingletonFactory(singleArg); + JavaHookDefinition hook = new JavaHookDefinition(SINGLE_ARG, "", 0, 0, objectFactory); + Scenario scenario = Mockito.mock(Scenario.class); + hook.execute(scenario); + assertThat(objectFactory.getInstance(SingleArg.class).scenario, is(scenario)); + } + + public static class SingleArg { + + Scenario scenario; + + @After + public void after(Scenario scenario) { + this.scenario = scenario; + } + } } From 9740217fb459f254d5142260fb73b74ae006baa8 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 27 Jul 2019 00:14:43 +0200 Subject: [PATCH 138/155] [Java] Check generics on default data table entry transformer definition --- ...ltDataTableEntryTransformerDefinition.java | 21 ++++++++++++++++--- ...taTableEntryTransformerDefinitionTest.java | 21 +++++++++---------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java index afa8679c03..56b6d9b55e 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java @@ -8,6 +8,7 @@ import io.cucumber.datatable.TableEntryByTypeTransformer; import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Map; @@ -30,16 +31,30 @@ private static Method requireValidMethod(Method method) { throw createInvalidSignatureException(method); } - Class[] parameterTypes = method.getParameterTypes(); + Type[] parameterTypes = method.getParameterTypes(); + Type[] genericParameterTypes = method.getGenericParameterTypes(); + if (parameterTypes.length < 2 || parameterTypes.length > 3) { throw createInvalidSignatureException(method); } - if (!(Object.class.equals(parameterTypes[0]) || Map.class.equals(parameterTypes[0]))) { + Type parameterType = genericParameterTypes[0]; + if (!(parameterType instanceof ParameterizedType)) { + throw createInvalidSignatureException(method); + } + ParameterizedType parameterizedType = (ParameterizedType) parameterType; + Type rawType = parameterizedType.getRawType(); + if (!(Object.class.equals(rawType) || Map.class.equals(rawType))) { throw createInvalidSignatureException(method); } + Type[] typeParameters = parameterizedType.getActualTypeArguments(); + for (Type typeParameter : typeParameters) { + if (!String.class.equals(typeParameter)) { + throw createInvalidSignatureException(method); + } + } - if (!(Object.class.equals(parameterTypes[1]) || Type.class.equals(parameterTypes[1]) || Class.class.equals(parameterTypes[1]))) { + if (!(Object.class.equals(parameterTypes[1]) || Class.class.equals(parameterTypes[1]))) { throw createInvalidSignatureException(method); } diff --git a/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java index 0327cbb979..eb45c2b7ad 100644 --- a/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java @@ -41,14 +41,12 @@ public void transforms_with_correct_method() throws Throwable { assertThat(definition.tableEntryByTypeTransformer() .transform(fromValue, String.class, cellTransformer), is("key=value")); - } public T correct_method(Map fromValue, Class toValue) { return join(fromValue); } - @Test public void transforms_with_correct_method_with_cell_transformer() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("correct_method_with_cell_transformer", Map.class, Class.class, TableCellByTypeTransformer.class); @@ -57,7 +55,6 @@ public void transforms_with_correct_method_with_cell_transformer() throws Throwa assertThat(definition.tableEntryByTypeTransformer() .transform(fromValue, String.class, cellTransformer), is("key=value")); - } @@ -82,7 +79,6 @@ public T four_arguments(Map fromValue, String one, String tw return null; } - @Test public void method_must_have_return_type() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("void_return_type", Map.class, Class.class); @@ -92,18 +88,25 @@ public void method_must_have_return_type() throws Throwable { public void void_return_type(Map fromValue, Class toValue) { } - @Test public void method_must_have_map_as_first_argument() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_first_type", String.class, Class.class); assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); } - public T invalid_first_type(String fromValue, Class toValue) { return null; } + @Test + public void method_must_have_map_of_string_to_string_as_first_argument() throws Throwable { + Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_first_type", Map.class, Class.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + } + + public T invalid_first_type(Map fromValue, Class toValue) { + return null; + } @Test public void method_must_have_class_as_second_argument() throws Throwable { @@ -115,14 +118,12 @@ public T invalid_second_type(Map fromValue, String toValue) return null; } - @Test - public void method_must_have_cell_tranformer_as_optional_third_argument() throws Throwable { + public void method_must_have_cell_transformer_as_optional_third_argument() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_optional_third_type", Map.class, Class.class, String.class); assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); } - public T invalid_optional_third_type(Map fromValue, Class toValue, String cellTransformer) { return null; } @@ -131,6 +132,4 @@ private static T join(Map fromValue) { //noinspection unchecked return (T) fromValue.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining()); } - - } \ No newline at end of file From 02fa5bfff0ccfe613fcdfd54ff3d63ec308d8a67 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 27 Jul 2019 13:01:56 +0200 Subject: [PATCH 139/155] [Java] Check generics on data table type definition --- .../java/JavaDataTableTypeDefinition.java | 9 +- .../java/JavaDataTableTypeDefinitionTest.java | 147 ++++++++++++++++++ 2 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 java/src/test/java/io/cucumber/java/JavaDataTableTypeDefinitionTest.java diff --git a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java index 9648e66228..8a4073cca6 100644 --- a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java @@ -98,11 +98,16 @@ private static Type requireValidParameterType(Method method) { } private static Class requireValidReturnType(Method method) { - Class returnType = method.getReturnType(); + Type returnType = method.getGenericReturnType(); if (Void.class.equals(returnType) || void.class.equals(returnType)) { throw createInvalidSignatureException(method); } - return returnType; + + if (!(returnType instanceof Class)) { + throw createInvalidSignatureException(method); + } + + return (Class) returnType; } diff --git a/java/src/test/java/io/cucumber/java/JavaDataTableTypeDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaDataTableTypeDefinitionTest.java new file mode 100644 index 0000000000..abe93fe93a --- /dev/null +++ b/java/src/test/java/io/cucumber/java/JavaDataTableTypeDefinitionTest.java @@ -0,0 +1,147 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.Lookup; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.datatable.DataTable; +import org.junit.Test; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class JavaDataTableTypeDefinitionTest { + + private final Lookup lookup = new Lookup() { + @Override + @SuppressWarnings("unchecked") + public T getInstance(Class glueClass) { + return (T) JavaDataTableTypeDefinitionTest.this; + } + }; + + private final DataTable dataTable = DataTable.create(asList( + asList("a", "b"), + asList("c", "d") + )); + + @Test + public void can_define_data_table_converter() throws NoSuchMethodException { + Method method = JavaDataTableTypeDefinitionTest.class.getMethod("convert_data_table_to_string", DataTable.class); + JavaDataTableTypeDefinition definition = new JavaDataTableTypeDefinition(method, lookup); + assertThat(definition.dataTableType().transform(dataTable.asLists()), is("convert_data_table_to_string")); + } + + public String convert_data_table_to_string(DataTable table) { + return "convert_data_table_to_string"; + } + + @Test + public void can_define_table_row_transformer() throws NoSuchMethodException { + Method method = JavaDataTableTypeDefinitionTest.class.getMethod("convert_table_row_to_string", List.class); + JavaDataTableTypeDefinition definition = new JavaDataTableTypeDefinition(method, lookup); + assertThat(definition.dataTableType().transform(dataTable.asLists()), + is(asList("convert_table_row_to_string", "convert_table_row_to_string"))); + } + + public String convert_table_row_to_string(List row) { + return "convert_table_row_to_string"; + } + + @Test + public void can_define_table_entry_transformer() throws NoSuchMethodException { + Method method = JavaDataTableTypeDefinitionTest.class.getMethod("converts_table_entry_to_string", Map.class); + JavaDataTableTypeDefinition definition = new JavaDataTableTypeDefinition(method, lookup); + assertThat(definition.dataTableType().transform(dataTable.asLists()), + is(singletonList("converts_table_entry_to_string"))); + } + + public String converts_table_entry_to_string(Map entry) { + return "converts_table_entry_to_string"; + } + + @Test + public void can_define_table_cell_transformer() throws NoSuchMethodException { + Method method = JavaDataTableTypeDefinitionTest.class.getMethod("converts_table_cell_to_string", String.class); + JavaDataTableTypeDefinition definition = new JavaDataTableTypeDefinition(method, lookup); + assertThat(definition.dataTableType().transform(dataTable.asLists()), is(asList( + asList("converts_table_cell_to_string", "converts_table_cell_to_string"), + asList("converts_table_cell_to_string", "converts_table_cell_to_string")) + )); + } + + public String converts_table_cell_to_string(String cell) { + return "converts_table_cell_to_string"; + } + + @Test + public void target_type_must_class_type() throws NoSuchMethodException { + Method method = JavaDataTableTypeDefinitionTest.class.getMethod("converts_datatable_to_optional_string", DataTable.class); + CucumberException exception = assertThrows(CucumberException.class, () -> new JavaDataTableTypeDefinition(method, lookup)); + assertThat(exception.getMessage(), startsWith("" + + "A @DataTableType annotated method must have one of these signatures:\n" + + " * public Author author(DataTable table)\n" + + " * public Author author(List row)\n" + + " * public Author author(Map entry)\n" + + " * public Author author(String cell)\n" + + "at io.cucumber.java.JavaDataTableTypeDefinitionTest.converts_datatable_to_optional_string(DataTable) in")); + } + + public Optional converts_datatable_to_optional_string(DataTable table) { + return Optional.of("converts_datatable_to_optional_string"); + } + + @Test + public void target_type_must_not_be_void() throws NoSuchMethodException { + Method method = JavaDataTableTypeDefinitionTest.class.getMethod("converts_data_table_to_void", DataTable.class); + assertThrows(CucumberException.class, () -> new JavaDataTableTypeDefinition(method, lookup)); + } + + public void converts_data_table_to_void(DataTable table) { + } + + @Test + public void must_have_exactly_one_argument() throws NoSuchMethodException { + Method noArgs = JavaDataTableTypeDefinitionTest.class.getMethod("converts_nothing_to_string"); + assertThrows(CucumberException.class, () -> new JavaDataTableTypeDefinition(noArgs, lookup)); + Method twoArgs = JavaDataTableTypeDefinitionTest.class.getMethod("converts_two_strings_to_string", String.class, String.class); + assertThrows(CucumberException.class, () -> new JavaDataTableTypeDefinition(twoArgs, lookup)); + } + + public String converts_nothing_to_string() { + return "converts_object_to_string"; + } + + public String converts_two_strings_to_string(String arg1, String arg2) { + return "converts_two_strings_to_string"; + } + + @Test + public void argument_must_match_existing_transformer() throws NoSuchMethodException { + Method method = JavaDataTableTypeDefinitionTest.class.getMethod("converts_object_to_string", Object.class); + assertThrows(CucumberException.class, () -> new JavaDataTableTypeDefinition(method, lookup)); + } + + public String converts_object_to_string(Object string) { + return "converts_object_to_string"; + } + + @Test + public void table_entry_transformer_must_have_map_of_strings() throws NoSuchMethodException { + Method method = JavaDataTableTypeDefinitionTest.class.getMethod("converts_map_of_objects_to_string", Map.class); + assertThrows(CucumberException.class, () -> new JavaDataTableTypeDefinition(method, lookup)); + } + + public String converts_map_of_objects_to_string(Map entry) { + return "converts_map_of_objects_to_string"; + } + + +} \ No newline at end of file From 79fc92743678e0284dd5c55e47b0e8bd6e07b01b Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 27 Jul 2019 13:55:03 +0200 Subject: [PATCH 140/155] [Java] Check generics on parameter type definition --- .../java/JavaParameterTypeDefinition.java | 31 +++- .../java/JavaParameterTypeDefinitionTest.java | 134 ++++++++++++++++++ 2 files changed, 159 insertions(+), 6 deletions(-) create mode 100644 java/src/test/java/io/cucumber/java/JavaParameterTypeDefinitionTest.java diff --git a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java index b53044029c..d94e956d12 100644 --- a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java @@ -7,6 +7,7 @@ import io.cucumber.cucumberexpressions.ParameterType; import java.lang.reflect.Method; +import java.lang.reflect.Type; import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; import static java.util.Collections.singletonList; @@ -30,17 +31,27 @@ class JavaParameterTypeDefinition extends AbstractGlueDefinition implements Para } private static Method requireValidMethod(Method method) { - Class returnType = method.getReturnType(); - if (Void.class.equals(returnType)) { + Type returnType = method.getGenericReturnType(); + if (Void.class.equals(returnType) || void.class.equals(returnType)) { + throw createInvalidSignatureException(method); + } + if (!(returnType instanceof Class)) { throw createInvalidSignatureException(method); } - Class[] parameterTypes = method.getParameterTypes(); - if (parameterTypes.length < 1) { + Type[] parameterTypes = method.getGenericParameterTypes(); + if (parameterTypes.length == 0) { throw createInvalidSignatureException(method); } - for (Class parameterType : parameterTypes) { + if (parameterTypes.length == 1) { + if (!(String.class.equals(parameterTypes[0]) || String[].class.equals(parameterTypes[0]))) { + throw createInvalidSignatureException(method); + } + return method; + } + + for (Type parameterType : parameterTypes) { if (!String.class.equals(parameterType)) { throw createInvalidSignatureException(method); } @@ -64,7 +75,15 @@ public ParameterType parameterType() { return parameterType; } - private Object execute(Object[] args) throws Throwable { + private Object execute(String[] captureGroups) throws Throwable { + Object[] args; + + if (String[].class.equals(method.getParameterTypes()[0])) { + args = new Object[][]{captureGroups}; + } else { + args = captureGroups; + } + return Invoker.invoke(lookup.getInstance(method.getDeclaringClass()), method, 0, args); } diff --git a/java/src/test/java/io/cucumber/java/JavaParameterTypeDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaParameterTypeDefinitionTest.java new file mode 100644 index 0000000000..6cd8fc2409 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/JavaParameterTypeDefinitionTest.java @@ -0,0 +1,134 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.Lookup; +import io.cucumber.core.exception.CucumberException; +import io.cucumber.cucumberexpressions.Argument; +import io.cucumber.cucumberexpressions.CucumberExpression; +import io.cucumber.cucumberexpressions.CucumberExpressionException; +import io.cucumber.cucumberexpressions.ParameterTypeRegistry; +import org.junit.Test; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Locale; +import java.util.Optional; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class JavaParameterTypeDefinitionTest { + + private final Lookup lookup = new Lookup() { + @Override + @SuppressWarnings("unchecked") + public T getInstance(Class glueClass) { + return (T) JavaParameterTypeDefinitionTest.this; + } + }; + + private final ParameterTypeRegistry registry = new ParameterTypeRegistry(Locale.ENGLISH); + + @Test + public void can_define_parameter_type_converters_with_one_capture_group() throws NoSuchMethodException { + Method method = JavaParameterTypeDefinitionTest.class.getMethod("convert_one_capture_group_to_string", String.class); + JavaParameterTypeDefinition definition = new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup); + registry.defineParameterType(definition.parameterType()); + CucumberExpression cucumberExpression = new CucumberExpression("{convert_one_capture_group_to_string}", registry); + List> test = cucumberExpression.match("test"); + assertThat(test.get(0).getValue(), equalTo("convert_one_capture_group_to_string")); + } + + public String convert_one_capture_group_to_string(String all) { + return "convert_one_capture_group_to_string"; + } + + @Test + public void can_define_parameter_type_converters_with_two_capture_groups() throws NoSuchMethodException { + Method method = JavaParameterTypeDefinitionTest.class.getMethod("convert_two_capture_group_to_string", String.class, String.class); + JavaParameterTypeDefinition definition = new JavaParameterTypeDefinition("", "([^ ]*) ([^ ]*)", method, false, false, lookup); + registry.defineParameterType(definition.parameterType()); + CucumberExpression cucumberExpression = new CucumberExpression("{convert_two_capture_group_to_string}", registry); + List> test = cucumberExpression.match("test test"); + assertThat(test.get(0).getValue(), equalTo("convert_two_capture_group_to_string")); + } + + public String convert_two_capture_group_to_string(String captureGroup1, String captureGroup2) { + return "convert_two_capture_group_to_string"; + } + + @Test + public void can_define_parameter_type_converters_with_var_args() throws NoSuchMethodException { + Method method = JavaParameterTypeDefinitionTest.class.getMethod("convert_varargs_capture_group_to_string", String[].class); + JavaParameterTypeDefinition definition = new JavaParameterTypeDefinition("", "([^ ]*) ([^ ]*)", method, false, false, lookup); + registry.defineParameterType(definition.parameterType()); + CucumberExpression cucumberExpression = new CucumberExpression("{convert_varargs_capture_group_to_string}", registry); + List> test = cucumberExpression.match("test test"); + assertThat(test.get(0).getValue(), equalTo("convert_varargs_capture_group_to_string")); + } + + public String convert_varargs_capture_group_to_string(String... captureGroups) { + return "convert_varargs_capture_group_to_string"; + } + + @Test + public void arguments_must_match_captured_groups() throws NoSuchMethodException { + Method method = JavaParameterTypeDefinitionTest.class.getMethod("convert_two_capture_group_to_string", String.class, String.class); + JavaParameterTypeDefinition definition = new JavaParameterTypeDefinition("", ".*", method, false, false, lookup); + registry.defineParameterType(definition.parameterType()); + CucumberExpression cucumberExpression = new CucumberExpression("{convert_two_capture_group_to_string}", registry); + List> test = cucumberExpression.match("test"); + assertThrows(CucumberExpressionException.class, () -> test.get(0).getValue()); + } + + + @Test + public void converter_must_have_return_type() throws NoSuchMethodException { + Method method = JavaParameterTypeDefinitionTest.class.getMethod("convert_capture_group_to_void", String.class); + assertThrows(CucumberException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); + } + + public void convert_capture_group_to_void(String all) { + } + + @Test + public void converter_must_have_non_generic_return_type() throws NoSuchMethodException { + Method method = JavaParameterTypeDefinitionTest.class.getMethod("convert_capture_group_to_optional_string", String.class); + assertThrows(CucumberException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); + } + + public Optional convert_capture_group_to_optional_string(String all) { + return Optional.of("convert_capture_group_to_optional_string"); + } + + @Test + public void converter_must_have_at_least_one_argument() throws NoSuchMethodException { + Method method = JavaParameterTypeDefinitionTest.class.getMethod("convert_nothing_to_string"); + assertThrows(CucumberException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); + } + + public String convert_nothing_to_string() { + return "convert_nothing_to_string"; + } + + @Test + public void converter_must_have_string_arguments() throws NoSuchMethodException { + Method method = JavaParameterTypeDefinitionTest.class.getMethod("converts_object_to_string", Object.class); + assertThrows(CucumberException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); + } + + public String converts_object_to_string(Object other) { + return "converts_object_to_string"; + } + + @Test + public void converter_must_have_all_string_arguments() throws NoSuchMethodException { + Method method = JavaParameterTypeDefinitionTest.class.getMethod("converts_objects_to_string", String.class, Object.class); + assertThrows(CucumberException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); + } + + public String converts_objects_to_string(String all, Object other) { + return "converts_object_to_string"; + } + +} \ No newline at end of file From 79ff73d398f83d0b34868ad4f86e155317b29ee9 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 27 Jul 2019 21:30:45 +0200 Subject: [PATCH 141/155] [Java] Check generics on default data table entry transformer --- ...ltDataTableEntryTransformerDefinition.java | 27 +++++++++++-------- ...taTableEntryTransformerDefinitionTest.java | 25 ++++++++++++----- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java index 56b6d9b55e..3a5a25eeae 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java @@ -39,19 +39,22 @@ private static Method requireValidMethod(Method method) { } Type parameterType = genericParameterTypes[0]; - if (!(parameterType instanceof ParameterizedType)) { - throw createInvalidSignatureException(method); - } - ParameterizedType parameterizedType = (ParameterizedType) parameterType; - Type rawType = parameterizedType.getRawType(); - if (!(Object.class.equals(rawType) || Map.class.equals(rawType))) { - throw createInvalidSignatureException(method); - } - Type[] typeParameters = parameterizedType.getActualTypeArguments(); - for (Type typeParameter : typeParameters) { - if (!String.class.equals(typeParameter)) { + + if (!Object.class.equals(parameterType)) { + if (!(parameterType instanceof ParameterizedType)) { + throw createInvalidSignatureException(method); + } + ParameterizedType parameterizedType = (ParameterizedType) parameterType; + Type rawType = parameterizedType.getRawType(); + if (!Map.class.equals(rawType)) { throw createInvalidSignatureException(method); } + Type[] typeParameters = parameterizedType.getActualTypeArguments(); + for (Type typeParameter : typeParameters) { + if (!String.class.equals(typeParameter)) { + throw createInvalidSignatureException(method); + } + } } if (!(Object.class.equals(parameterTypes[1]) || Class.class.equals(parameterTypes[1]))) { @@ -71,7 +74,9 @@ private static CucumberException createInvalidSignatureException(Method method) return builder(method) .addAnnotation(DefaultDataTableEntryTransformer.class) .addSignature("public T defaultDataTableEntry(Map fromValue, Class toValueType)") + .addSignature("public T defaultDataTableEntry(Object fromValue, Class toValueType)") .addSignature("public T defaultDataTableCell(Map fromValue, Class toValueType, TableCellByTypeTransformer cellTransformer)") + .addSignature("public T defaultDataTableCell(Object fromValue, Class toValueType, TableCellByTypeTransformer cellTransformer)") .build(); } diff --git a/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java index eb45c2b7ad..6f8ab48482 100644 --- a/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java @@ -6,6 +6,7 @@ import org.junit.Test; import java.lang.reflect.Method; +import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -41,12 +42,14 @@ public void transforms_with_correct_method() throws Throwable { assertThat(definition.tableEntryByTypeTransformer() .transform(fromValue, String.class, cellTransformer), is("key=value")); + } public T correct_method(Map fromValue, Class toValue) { return join(fromValue); } + @Test public void transforms_with_correct_method_with_cell_transformer() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("correct_method_with_cell_transformer", Map.class, Class.class, TableCellByTypeTransformer.class); @@ -55,6 +58,7 @@ public void transforms_with_correct_method_with_cell_transformer() throws Throwa assertThat(definition.tableEntryByTypeTransformer() .transform(fromValue, String.class, cellTransformer), is("key=value")); + } @@ -79,6 +83,7 @@ public T four_arguments(Map fromValue, String one, String tw return null; } + @Test public void method_must_have_return_type() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("void_return_type", Map.class, Class.class); @@ -88,23 +93,27 @@ public void method_must_have_return_type() throws Throwable { public void void_return_type(Map fromValue, Class toValue) { } + @Test public void method_must_have_map_as_first_argument() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_first_type", String.class, Class.class); assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + Method method2 = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_first_type", List.class, Class.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method2, lookup)); + Method method3 = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_first_type", Map.class, Class.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method3, lookup)); } + public T invalid_first_type(String fromValue, Class toValue) { return null; } - @Test - public void method_must_have_map_of_string_to_string_as_first_argument() throws Throwable { - Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_first_type", Map.class, Class.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + public T invalid_first_type(List fromValue, Class toValue) { + return null; } - public T invalid_first_type(Map fromValue, Class toValue) { + public T invalid_first_type(Map fromValue, Class toValue) { return null; } @@ -118,12 +127,14 @@ public T invalid_second_type(Map fromValue, String toValue) return null; } + @Test - public void method_must_have_cell_transformer_as_optional_third_argument() throws Throwable { + public void method_must_have_cell_tranformer_as_optional_third_argument() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_optional_third_type", Map.class, Class.class, String.class); assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); } + public T invalid_optional_third_type(Map fromValue, Class toValue, String cellTransformer) { return null; } @@ -132,4 +143,6 @@ private static T join(Map fromValue) { //noinspection unchecked return (T) fromValue.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining()); } + + } \ No newline at end of file From 720288e0751a139d0820d3c0b2fe697beb8ee27b Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 27 Jul 2019 22:04:17 +0200 Subject: [PATCH 142/155] [Core] Remove HookComparator --- .../io/cucumber/core/runner/CachingGlue.java | 16 +++++++++------ .../cucumber/core/runner/HookComparator.java | 20 ------------------- 2 files changed, 10 insertions(+), 26 deletions(-) delete mode 100644 core/src/main/java/io/cucumber/core/runner/HookComparator.java diff --git a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java index 9e212b7cb6..3db3379fa7 100644 --- a/core/src/main/java/io/cucumber/core/runner/CachingGlue.java +++ b/core/src/main/java/io/cucumber/core/runner/CachingGlue.java @@ -20,8 +20,8 @@ import java.util.*; final class CachingGlue implements Glue { - private static final HookComparator ASCENDING = new HookComparator(true); - private static final HookComparator DESCENDING = new HookComparator(false); + private static final Comparator ASCENDING = Comparator.comparing(HookDefinition::getOrder); + private static final Comparator DESCENDING = ASCENDING.reversed(); private final List parameterTypeDefinitions = new ArrayList<>(); private final List dataTableTypeDefinitions = new ArrayList<>(); @@ -29,11 +29,11 @@ final class CachingGlue implements Glue { private final List defaultDataTableEntryTransformers = new ArrayList<>(); private final List defaultDataTableCellTransformers = new ArrayList<>(); - private final SortedSet beforeHooks = new TreeSet<>(ASCENDING); - private final SortedSet beforeStepHooks = new TreeSet<>(ASCENDING); + private final List beforeHooks = new ArrayList<>(); + private final List beforeStepHooks = new ArrayList<>(); private final List stepDefinitions = new ArrayList<>(); - private final SortedSet afterStepHooks = new TreeSet<>(DESCENDING); - private final SortedSet afterHooks = new TreeSet<>(DESCENDING); + private final List afterStepHooks = new ArrayList<>(); + private final List afterHooks = new ArrayList<>(); /* * Storing the pattern that matches the step text allows us to cache the rather slow @@ -59,21 +59,25 @@ public void addStepDefinition(StepDefinition stepDefinition) { @Override public void addBeforeHook(HookDefinition hookDefinition) { beforeHooks.add(hookDefinition); + beforeHooks.sort(ASCENDING); } @Override public void addBeforeStepHook(HookDefinition hookDefinition) { beforeStepHooks.add(hookDefinition); + beforeStepHooks.sort(ASCENDING); } @Override public void addAfterHook(HookDefinition hookDefinition) { afterHooks.add(hookDefinition); + afterHooks.sort(DESCENDING); } @Override public void addAfterStepHook(HookDefinition hookDefinition) { afterStepHooks.add(hookDefinition); + afterStepHooks.sort(DESCENDING); } @Override diff --git a/core/src/main/java/io/cucumber/core/runner/HookComparator.java b/core/src/main/java/io/cucumber/core/runner/HookComparator.java deleted file mode 100644 index 735b716918..0000000000 --- a/core/src/main/java/io/cucumber/core/runner/HookComparator.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.cucumber.core.runner; - -import io.cucumber.core.backend.HookDefinition; - -import java.util.Comparator; - -final class HookComparator implements Comparator { - private final boolean ascending; - - HookComparator(boolean ascending) { - this.ascending = ascending; - } - - @Override - public int compare(HookDefinition hook1, HookDefinition hook2) { - int x = hook1.getOrder(); - int y = hook2.getOrder(); - return ascending ? Integer.compare(x, y) : Integer.compare(y, x); - } -} From 0345764226552fb14dc3de0b694882e159335d5e Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 27 Jul 2019 22:14:08 +0200 Subject: [PATCH 143/155] [Java] Pull up lookup --- .../main/java/io/cucumber/java/AbstractGlueDefinition.java | 5 ++++- .../java/io/cucumber/java/JavaDataTableTypeDefinition.java | 4 +--- .../java/JavaDefaultDataTableCellTransformerDefinition.java | 5 +---- .../java/JavaDefaultDataTableEntryTransformerDefinition.java | 4 +--- .../java/JavaDefaultParameterTransformerDefinition.java | 2 +- java/src/main/java/io/cucumber/java/JavaHookDefinition.java | 2 +- .../java/io/cucumber/java/JavaParameterTypeDefinition.java | 4 +--- java/src/main/java/io/cucumber/java/JavaStepDefinition.java | 4 +--- 8 files changed, 11 insertions(+), 19 deletions(-) diff --git a/java/src/main/java/io/cucumber/java/AbstractGlueDefinition.java b/java/src/main/java/io/cucumber/java/AbstractGlueDefinition.java index 344a8d7d17..e0d8c0a985 100644 --- a/java/src/main/java/io/cucumber/java/AbstractGlueDefinition.java +++ b/java/src/main/java/io/cucumber/java/AbstractGlueDefinition.java @@ -1,5 +1,6 @@ package io.cucumber.java; +import io.cucumber.core.backend.Lookup; import io.cucumber.core.reflection.MethodFormat; import java.lang.reflect.Method; @@ -7,11 +8,13 @@ class AbstractGlueDefinition { protected final Method method; + protected final Lookup lookup; private String shortFormat; private String fullFormat; - AbstractGlueDefinition(Method method) { + AbstractGlueDefinition(Method method, Lookup lookup) { this.method = method; + this.lookup = lookup; } public final String getLocation(boolean detail) { diff --git a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java index 8a4073cca6..bdd0ca6a60 100644 --- a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java @@ -17,12 +17,10 @@ class JavaDataTableTypeDefinition extends AbstractGlueDefinition implements DataTableTypeDefinition { - private final Lookup lookup; private final DataTableType dataTableType; JavaDataTableTypeDefinition(Method method, Lookup lookup) { - super(method); - this.lookup = lookup; + super(method, lookup); this.dataTableType = createDataTableType(method); } diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java index 0f4af2aadb..a339d1c6f6 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java @@ -13,13 +13,10 @@ class JavaDefaultDataTableCellTransformerDefinition extends AbstractGlueDefinition implements DefaultDataTableCellTransformerDefinition { - - private final Lookup lookup; private final TableCellByTypeTransformer transformer; JavaDefaultDataTableCellTransformerDefinition(Method method, Lookup lookup) { - super(requireValidMethod(method)); - this.lookup = lookup; + super(requireValidMethod(method), lookup); this.transformer = this::execute; } diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java index 3a5a25eeae..cb74f2726c 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java @@ -16,12 +16,10 @@ class JavaDefaultDataTableEntryTransformerDefinition extends AbstractGlueDefinition implements DefaultDataTableEntryTransformerDefinition { - private final Lookup lookup; private final TableEntryByTypeTransformer transformer; JavaDefaultDataTableEntryTransformerDefinition(Method method, Lookup lookup) { - super(requireValidMethod(method)); - this.lookup = lookup; + super(requireValidMethod(method), lookup); this.transformer = this::execute; } diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java index 8b481aef86..7976520716 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java @@ -17,7 +17,7 @@ class JavaDefaultParameterTransformerDefinition extends AbstractGlueDefinition i private final ParameterByTypeTransformer transformer; JavaDefaultParameterTransformerDefinition(Method method, Lookup lookup) { - super(requireValidMethod(method)); + super(requireValidMethod(method), lookup); this.lookup = lookup; this.transformer = this::execute; } diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index e90ba13815..c6dfdd51db 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -21,7 +21,7 @@ final class JavaHookDefinition extends AbstractGlueDefinition implements HookDef private final Lookup lookup; JavaHookDefinition(Method method, String tagExpression, int order, long timeoutMillis, Lookup lookup) { - super(requireValidMethod(method)); + super(requireValidMethod(method), lookup); this.timeoutMillis = timeoutMillis; this.tagPredicate = new TagPredicate(tagExpression); this.order = order; diff --git a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java index d94e956d12..0a25ebe68d 100644 --- a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java @@ -14,12 +14,10 @@ class JavaParameterTypeDefinition extends AbstractGlueDefinition implements ParameterTypeDefinition { - private final Lookup lookup; private final ParameterType parameterType; JavaParameterTypeDefinition(String name, String pattern, Method method, boolean useForSnippets, boolean preferForRegexpMatch, Lookup lookup) { - super(requireValidMethod(method)); - this.lookup = lookup; + super(requireValidMethod(method), lookup); this.parameterType = new ParameterType<>( name.isEmpty() ? method.getName() : name, singletonList(pattern), diff --git a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java index a881554a0b..65d2942148 100644 --- a/java/src/main/java/io/cucumber/java/JavaStepDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaStepDefinition.java @@ -11,7 +11,6 @@ final class JavaStepDefinition extends AbstractGlueDefinition implements StepDefinition { private final String expression; private final long timeoutMillis; - private final Lookup lookup; private final List parameterInfos; @@ -19,9 +18,8 @@ final class JavaStepDefinition extends AbstractGlueDefinition implements StepDef String expression, long timeoutMillis, Lookup lookup) { - super(method); + super(method, lookup); this.timeoutMillis = timeoutMillis; - this.lookup = lookup; this.parameterInfos = JavaParameterInfo.fromMethod(method); this.expression = expression; } From 4d2d8769ca8ba80ff09befd183bc090f84c07f4d Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 28 Jul 2019 10:13:40 +0200 Subject: [PATCH 144/155] [Java] Check generics in table cell and parameter transformer definitions --- ...ultDataTableCellTransformerDefinition.java | 4 +- ...ltDataTableEntryTransformerDefinition.java | 6 +- ...DefaultParameterTransformerDefinition.java | 4 +- ...ataTableCellTransformerDefinitionTest.java | 103 +++++++++++++++ ...taTableEntryTransformerDefinitionTest.java | 2 +- ...ultParameterTransformerDefinitionTest.java | 103 +++++++++++++++ .../defaultstransformer/DataTableSteps.java | 117 ++++++++++++++++++ .../defaultstransformer/RunCucumberTest.java | 8 ++ .../default-transformer.feature | 17 +++ 9 files changed, 356 insertions(+), 8 deletions(-) create mode 100644 java/src/test/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinitionTest.java create mode 100644 java/src/test/java/io/cucumber/java/JavaDefaultParameterTransformerDefinitionTest.java create mode 100644 java/src/test/java/io/cucumber/java/defaultstransformer/DataTableSteps.java create mode 100644 java/src/test/java/io/cucumber/java/defaultstransformer/RunCucumberTest.java create mode 100644 java/src/test/resources/io/cucumber/java/defaultstransformer/default-transformer.feature diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java index a339d1c6f6..5d1f898e6c 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java @@ -22,7 +22,7 @@ class JavaDefaultDataTableCellTransformerDefinition extends AbstractGlueDefiniti private static Method requireValidMethod(Method method) { Class returnType = method.getReturnType(); - if (Void.class.equals(returnType)) { + if (Void.class.equals(returnType) || void.class.equals(returnType)) { throw createInvalidSignatureException(method); } @@ -35,7 +35,7 @@ private static Method requireValidMethod(Method method) { throw createInvalidSignatureException(method); } - if (!(Object.class.equals(parameterTypes[1]) || Type.class.equals(parameterTypes[1]))) { + if (!Type.class.equals(parameterTypes[1])) { throw createInvalidSignatureException(method); } diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java index cb74f2726c..4a90526e64 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java @@ -55,7 +55,7 @@ private static Method requireValidMethod(Method method) { } } - if (!(Object.class.equals(parameterTypes[1]) || Class.class.equals(parameterTypes[1]))) { + if (!(Type.class.equals(parameterTypes[1]) || Class.class.equals(parameterTypes[1]))) { throw createInvalidSignatureException(method); } @@ -72,9 +72,9 @@ private static CucumberException createInvalidSignatureException(Method method) return builder(method) .addAnnotation(DefaultDataTableEntryTransformer.class) .addSignature("public T defaultDataTableEntry(Map fromValue, Class toValueType)") - .addSignature("public T defaultDataTableEntry(Object fromValue, Class toValueType)") .addSignature("public T defaultDataTableCell(Map fromValue, Class toValueType, TableCellByTypeTransformer cellTransformer)") - .addSignature("public T defaultDataTableCell(Object fromValue, Class toValueType, TableCellByTypeTransformer cellTransformer)") + .addSignature("public Object defaultDataTableEntry(Map fromValue, Type toValueType)") + .addSignature("public Object defaultDataTableEntry(Object fromValue, Type toValueType)") .build(); } diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java index 7976520716..b87c2728d8 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java @@ -24,7 +24,7 @@ class JavaDefaultParameterTransformerDefinition extends AbstractGlueDefinition i private static Method requireValidMethod(Method method) { Class returnType = method.getReturnType(); - if (Void.class.equals(returnType)) { + if (Void.class.equals(returnType) || void.class.equals(returnType)) { throw createInvalidSignatureException(method); } @@ -37,7 +37,7 @@ private static Method requireValidMethod(Method method) { throw createInvalidSignatureException(method); } - if (!(Object.class.equals(parameterTypes[1]) || Type.class.equals(parameterTypes[1]))) { + if (!Type.class.equals(parameterTypes[1])) { throw createInvalidSignatureException(method); } diff --git a/java/src/test/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinitionTest.java new file mode 100644 index 0000000000..e982a34dc0 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinitionTest.java @@ -0,0 +1,103 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.Lookup; +import io.cucumber.core.exception.CucumberException; +import org.junit.Test; + +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.util.Map; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class JavaDefaultDataTableCellTransformerDefinitionTest { + + private final Lookup lookup = new Lookup() { + + @Override + @SuppressWarnings("unchecked") + public T getInstance(Class glueClass) { + return (T) JavaDefaultDataTableCellTransformerDefinitionTest.this; + } + }; + + @Test + public void can_transform_string_to_type() throws Throwable { + Method method = JavaDefaultDataTableCellTransformerDefinitionTest.class.getMethod("transform_string_to_type", String.class, Type.class); + JavaDefaultDataTableCellTransformerDefinition definition = new JavaDefaultDataTableCellTransformerDefinition(method, lookup); + String transformed = definition.tableCellByTypeTransformer().transform("something", String.class); + assertThat(transformed, is("transform_string_to_type")); + } + + public Object transform_string_to_type(String fromValue, Type toValueType) { + return "transform_string_to_type"; + } + + @Test + public void can_transform_object_to_type() throws Throwable { + Method method = JavaDefaultDataTableCellTransformerDefinitionTest.class.getMethod("transform_object_to_type", Object.class, Type.class); + JavaDefaultDataTableCellTransformerDefinition definition = new JavaDefaultDataTableCellTransformerDefinition(method, lookup); + String transformed = definition.tableCellByTypeTransformer().transform("something", String.class); + assertThat(transformed, is("transform_object_to_type")); + } + + public Object transform_object_to_type(Object fromValue, Type toValueType) { + return "transform_object_to_type"; + } + + @Test + public void must_have_non_void_return() throws Throwable { + Method method = JavaDefaultDataTableCellTransformerDefinitionTest.class.getMethod("transforms_string_to_void", String.class, Type.class); + CucumberException exception = assertThrows(CucumberException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(method, lookup)); + assertThat(exception.getMessage(), startsWith("" + + "A @DefaultDataTableCellTransformer annotated method must have one of these signatures:\n" + + " * public Object defaultDataTableCell(String fromValue, Type toValueType)\n" + + " * public Object defaultDataTableCell(Object fromValue, Type toValueType)\n" + + "at io.cucumber.java.JavaDefaultDataTableCellTransformerDefinitionTest.transforms_string_to_void(String,Type) in" + )); + } + + public void transforms_string_to_void(String fromValue, Type toValueType) { + } + + @Test + public void must_have_two_arguments() throws Throwable { + Method oneArg = JavaDefaultDataTableCellTransformerDefinitionTest.class.getMethod("one_argument", String.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(oneArg, lookup)); + Method threeArg = JavaDefaultDataTableCellTransformerDefinitionTest.class.getMethod("three_arguments", String.class, Type.class, Object.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(threeArg, lookup)); + } + + public Object one_argument(String fromValue) { + return "one_arguments"; + } + + public Object three_arguments(String fromValue, Type toValueType, Object extra) { + return "three_arguments"; + } + + @Test + public void must_have_string_or_object_as_from_value() throws Throwable { + Method threeArg = JavaDefaultDataTableCellTransformerDefinitionTest.class.getMethod("map_as_from_value", Map.class, Type.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(threeArg, lookup)); + } + + + public Object map_as_from_value(Map fromValue, Type toValueType) { + return "map_as_from_value"; + } + + @Test + public void must_have_type_as_to_value_type() throws Throwable { + Method threeArg = JavaDefaultDataTableCellTransformerDefinitionTest.class.getMethod("object_as_to_value_type", String.class, Object.class); + assertThrows(CucumberException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(threeArg, lookup)); + } + + public Object object_as_to_value_type(String fromValue, Object toValueType) { + return "object_as_to_value_type"; + } + +} \ No newline at end of file diff --git a/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java index 6f8ab48482..1536548046 100644 --- a/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java @@ -129,7 +129,7 @@ public T invalid_second_type(Map fromValue, String toValue) @Test - public void method_must_have_cell_tranformer_as_optional_third_argument() throws Throwable { + public void method_must_have_cell_transformer_as_optional_third_argument() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_optional_third_type", Map.class, Class.class, String.class); assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); } diff --git a/java/src/test/java/io/cucumber/java/JavaDefaultParameterTransformerDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaDefaultParameterTransformerDefinitionTest.java new file mode 100644 index 0000000000..6d7d84db17 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/JavaDefaultParameterTransformerDefinitionTest.java @@ -0,0 +1,103 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.Lookup; +import io.cucumber.core.exception.CucumberException; +import org.junit.Test; + +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.util.Map; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class JavaDefaultParameterTransformerDefinitionTest { + + private final Lookup lookup = new Lookup() { + + @Override + @SuppressWarnings("unchecked") + public T getInstance(Class glueClass) { + return (T) JavaDefaultParameterTransformerDefinitionTest.this; + } + }; + + @Test + public void can_transform_string_to_type() throws Throwable { + Method method = JavaDefaultParameterTransformerDefinitionTest.class.getMethod("transform_string_to_type", String.class, Type.class); + JavaDefaultParameterTransformerDefinition definition = new JavaDefaultParameterTransformerDefinition(method, lookup); + Object transformed = definition.parameterByTypeTransformer().transform("something", String.class); + assertThat(transformed, is("transform_string_to_type")); + } + + public Object transform_string_to_type(String fromValue, Type toValueType) { + return "transform_string_to_type"; + } + + @Test + public void can_transform_object_to_type() throws Throwable { + Method method = JavaDefaultParameterTransformerDefinitionTest.class.getMethod("transform_object_to_type", Object.class, Type.class); + JavaDefaultParameterTransformerDefinition definition = new JavaDefaultParameterTransformerDefinition(method, lookup); + String transformed = (String) definition.parameterByTypeTransformer().transform("something", String.class); + assertThat(transformed, is("transform_object_to_type")); + } + + public Object transform_object_to_type(Object fromValue, Type toValueType) { + return "transform_object_to_type"; + } + + @Test + public void must_have_non_void_return() throws Throwable { + Method method = JavaDefaultParameterTransformerDefinitionTest.class.getMethod("transforms_string_to_void", String.class, Type.class); + CucumberException exception = assertThrows(CucumberException.class, () -> new JavaDefaultParameterTransformerDefinition(method, lookup)); + assertThat(exception.getMessage(), startsWith("" + + "A @DefaultParameterTransformer annotated method must have one of these signatures:\n" + + " * public Object defaultDataTableEntry(String fromValue, Type toValueType)\n" + + " * public Object defaultDataTableEntry(Object fromValue, Type toValueType)\n" + + "at io.cucumber.java.JavaDefaultParameterTransformerDefinitionTest.transforms_string_to_void(String,Type) in" + )); + } + + public void transforms_string_to_void(String fromValue, Type toValueType) { + } + + @Test + public void must_have_two_arguments() throws Throwable { + Method oneArg = JavaDefaultParameterTransformerDefinitionTest.class.getMethod("one_argument", String.class); + assertThrows(CucumberException.class, () -> new JavaDefaultParameterTransformerDefinition(oneArg, lookup)); + Method threeArg = JavaDefaultParameterTransformerDefinitionTest.class.getMethod("three_arguments", String.class, Type.class, Object.class); + assertThrows(CucumberException.class, () -> new JavaDefaultParameterTransformerDefinition(threeArg, lookup)); + } + + public Object one_argument(String fromValue) { + return "one_arguments"; + } + + public Object three_arguments(String fromValue, Type toValueType, Object extra) { + return "three_arguments"; + } + + @Test + public void must_have_string_or_object_as_from_value() throws Throwable { + Method threeArg = JavaDefaultParameterTransformerDefinitionTest.class.getMethod("map_as_from_value", Map.class, Type.class); + assertThrows(CucumberException.class, () -> new JavaDefaultParameterTransformerDefinition(threeArg, lookup)); + } + + + public Object map_as_from_value(Map fromValue, Type toValueType) { + return "map_as_from_value"; + } + + @Test + public void must_have_type_as_to_value_type() throws Throwable { + Method threeArg = JavaDefaultParameterTransformerDefinitionTest.class.getMethod("object_as_to_value_type", String.class, Object.class); + assertThrows(CucumberException.class, () -> new JavaDefaultParameterTransformerDefinition(threeArg, lookup)); + } + + public Object object_as_to_value_type(String fromValue, Object toValueType) { + return "object_as_to_value_type"; + } + +} \ No newline at end of file diff --git a/java/src/test/java/io/cucumber/java/defaultstransformer/DataTableSteps.java b/java/src/test/java/io/cucumber/java/defaultstransformer/DataTableSteps.java new file mode 100644 index 0000000000..11734da0b1 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/defaultstransformer/DataTableSteps.java @@ -0,0 +1,117 @@ +package io.cucumber.java.defaultstransformer; + +import io.cucumber.datatable.dependency.com.fasterxml.jackson.databind.ObjectMapper; +import io.cucumber.java.DefaultDataTableCellTransformer; +import io.cucumber.java.DefaultDataTableEntryTransformer; +import io.cucumber.java.DefaultParameterTransformer; +import io.cucumber.java.Transpose; +import io.cucumber.java.en.Given; +import org.hamcrest.CoreMatchers; + +import java.lang.reflect.Type; +import java.time.LocalDate; +import java.util.Currency; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.*; + +public class DataTableSteps { + + private final Author expectedAuthor = new Author("Annie M. G.", "Schmidt", "1911-03-20"); + private final ObjectMapper objectMapper = new ObjectMapper(); + + @DefaultParameterTransformer + @DefaultDataTableEntryTransformer + @DefaultDataTableCellTransformer + public Object defaultTransformer(Object fromValue, Type toValueType) { + return objectMapper.convertValue(fromValue, objectMapper.constructType(toValueType)); + } + + @Given("a list of authors in a table") + public void aListOfAuthorsInATable(List authors) { + assertTrue(authors.contains(expectedAuthor)); + } + + @Given("a single currency in a table") + public void aSingleCurrencyInATable(Currency currency) { + assertThat(currency, is(Currency.getInstance("EUR"))); + } + + @Given("a currency in a parameter {}") + public void aCurrencyInAParameter(Currency currency) { + assertThat(currency, is(Currency.getInstance("EUR"))); + } + + + public static class Author { + String firstName; + String lastName; + String birthDate; + + Author() { + } + + public Author(String firstName, String lastName, String birthDate) { + this.firstName = firstName; + this.lastName = lastName; + this.birthDate = birthDate; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getBirthDate() { + return birthDate; + } + + public void setBirthDate(String birthDate) { + this.birthDate = birthDate; + } + + @Override + public String toString() { + return "Author{" + + "firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", birthDate='" + birthDate + '\'' + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Author author = (Author) o; + + if (!firstName.equals(author.firstName)) return false; + if (!lastName.equals(author.lastName)) return false; + return birthDate.equals(author.birthDate); + } + + @Override + public int hashCode() { + int result = firstName.hashCode(); + result = 31 * result + lastName.hashCode(); + result = 31 * result + birthDate.hashCode(); + return result; + } + } + +} diff --git a/java/src/test/java/io/cucumber/java/defaultstransformer/RunCucumberTest.java b/java/src/test/java/io/cucumber/java/defaultstransformer/RunCucumberTest.java new file mode 100644 index 0000000000..91c08d3924 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/defaultstransformer/RunCucumberTest.java @@ -0,0 +1,8 @@ +package io.cucumber.java.defaultstransformer; + +import io.cucumber.junit.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +public class RunCucumberTest { +} diff --git a/java/src/test/resources/io/cucumber/java/defaultstransformer/default-transformer.feature b/java/src/test/resources/io/cucumber/java/defaultstransformer/default-transformer.feature new file mode 100644 index 0000000000..003d72051f --- /dev/null +++ b/java/src/test/resources/io/cucumber/java/defaultstransformer/default-transformer.feature @@ -0,0 +1,17 @@ +Feature: Datatable + + Scenario: Convert a table to a generic list via default transformer + Given a list of authors in a table + | firstName | lastName | birthDate | + | Annie M. G. | Schmidt | 1911-03-20 | + | Roald | Dahl | 1916-09-13 | + + + Scenario: Convert a table to a single object via the default transformer + + Given a single currency in a table + | EUR | + + Scenario: Convert an anonymous parameter to a single object via default transformer + + Given a currency in a parameter EUR From b7c54e1d7a3b050a1f1d0f578f7e11cb01248233 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 28 Jul 2019 10:44:23 +0200 Subject: [PATCH 145/155] [Java] Clean up exceptions --- .../cucumber/java/InvalidMethodException.java | 23 ++++ .../java/InvalidMethodSignatureException.java | 106 +++++++++--------- .../java/JavaDataTableTypeDefinition.java | 5 +- ...ultDataTableCellTransformerDefinition.java | 5 +- ...ltDataTableEntryTransformerDefinition.java | 5 +- ...DefaultParameterTransformerDefinition.java | 5 +- .../io/cucumber/java/JavaHookDefinition.java | 5 +- .../java/JavaParameterTypeDefinition.java | 5 +- .../java/io/cucumber/java/MethodScanner.java | 11 +- .../io/cucumber/java/JavaBackendTest.java | 3 +- .../java/JavaDataTableTypeDefinitionTest.java | 13 +-- ...ataTableCellTransformerDefinitionTest.java | 11 +- ...taTableEntryTransformerDefinitionTest.java | 17 ++- ...ultParameterTransformerDefinitionTest.java | 11 +- .../java/io/cucumber/java/JavaHookTest.java | 21 ++-- .../java/JavaParameterTypeDefinitionTest.java | 11 +- .../cucumber/java/JavaStepDefinitionTest.java | 19 +--- .../io/cucumber/java/MethodScannerTest.java | 31 +++-- 18 files changed, 155 insertions(+), 152 deletions(-) create mode 100644 java/src/main/java/io/cucumber/java/InvalidMethodException.java diff --git a/java/src/main/java/io/cucumber/java/InvalidMethodException.java b/java/src/main/java/io/cucumber/java/InvalidMethodException.java new file mode 100644 index 0000000000..e1765b524a --- /dev/null +++ b/java/src/main/java/io/cucumber/java/InvalidMethodException.java @@ -0,0 +1,23 @@ +package io.cucumber.java; + +import io.cucumber.core.exception.CucumberException; + +import java.lang.reflect.Method; + +final class InvalidMethodException extends CucumberException { + + private InvalidMethodException(String message) { + super(message); + } + + static InvalidMethodException createInvalidMethodException(Method method, Class glueCodeClass) { + return new InvalidMethodException( + "You're not allowed to extend classes that define Step Definitions or hooks. " + + glueCodeClass + " extends " + method.getDeclaringClass()); + } + + static InvalidMethodException createMethodDeclaringClassNotAssignableFromGlue(Method method, Class glueCodeClass) { + return new InvalidMethodException(method.getDeclaringClass() + " isn't assignable from " + glueCodeClass); + } + +} diff --git a/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java b/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java index 54a46586ed..66d481f268 100644 --- a/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java +++ b/java/src/main/java/io/cucumber/java/InvalidMethodSignatureException.java @@ -7,75 +7,81 @@ import java.util.ArrayList; import java.util.List; -final class InvalidMethodSignatureExceptionBuilder { +final class InvalidMethodSignatureException extends CucumberException { - private Method method; - private final List> annotations = new ArrayList<>(); - private final List signatures = new ArrayList<>(); - private final List notes = new ArrayList<>(); + private InvalidMethodSignatureException(String message) { + super(message); + } static InvalidMethodSignatureExceptionBuilder builder(Method method) { return new InvalidMethodSignatureExceptionBuilder(method); } - private InvalidMethodSignatureExceptionBuilder(Method method) { - this.method = method; - } + static class InvalidMethodSignatureExceptionBuilder { - InvalidMethodSignatureExceptionBuilder addAnnotation(Class annotation) { - annotations.add(annotation); - return this; - } + private Method method; + private final List> annotations = new ArrayList<>(); + private final List signatures = new ArrayList<>(); + private final List notes = new ArrayList<>(); + private InvalidMethodSignatureExceptionBuilder(Method method) { + this.method = method; + } - InvalidMethodSignatureExceptionBuilder addSignature(String signature) { - signatures.add(signature); - return this; - } + InvalidMethodSignatureExceptionBuilder addAnnotation(Class annotation) { + annotations.add(annotation); + return this; + } - InvalidMethodSignatureExceptionBuilder addNote(String note) { - this.notes.add(note); - return this; - } - public CucumberException build() { - return new CucumberException("" + - describeAnnotations() + " must have one of these signatures:\n" + - " * " + describeAvailableSignature() + "\n" + - "at " + describeLocation() + "\n" + - describeNote() + "\n" - ); - } + InvalidMethodSignatureExceptionBuilder addSignature(String signature) { + signatures.add(signature); + return this; + } - private String describeNote() { - return String.join("\n", notes); - } + InvalidMethodSignatureExceptionBuilder addNote(String note) { + this.notes.add(note); + return this; + } - private Object describeLocation() { - return MethodFormat.FULL.format(method); - } + public InvalidMethodSignatureException build() { + return new InvalidMethodSignatureException("" + + describeAnnotations() + " must have one of these signatures:\n" + + " * " + describeAvailableSignature() + "\n" + + "at " + describeLocation() + "\n" + + describeNote() + "\n" + ); + } - private String describeAvailableSignature() { - return String.join("\n * ", signatures); - } + private String describeNote() { + return String.join("\n", notes); + } - private String describeAnnotations() { - if (annotations.size() == 1) { - return "A @" + annotations.get(0).getSimpleName() + " annotated method"; + private Object describeLocation() { + return MethodFormat.FULL.format(method); } - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < annotations.size(); i++) { - builder.append(annotations.get(i).getSimpleName()); + private String describeAvailableSignature() { + return String.join("\n * ", signatures); + } - if (i < annotations.size() - 2) { - builder.append(", "); - } else if (i < annotations.size() - 1) { - builder.append(" or "); + private String describeAnnotations() { + if (annotations.size() == 1) { + return "A @" + annotations.get(0).getSimpleName() + " annotated method"; } - } - return "A method annotated with " + builder.toString(); - } + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < annotations.size(); i++) { + builder.append(annotations.get(i).getSimpleName()); + + if (i < annotations.size() - 2) { + builder.append(", "); + } else if (i < annotations.size() - 1) { + builder.append(" or "); + } + } + return "A method annotated with " + builder.toString(); + } + } } diff --git a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java index bdd0ca6a60..4f3484afb1 100644 --- a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java @@ -2,7 +2,6 @@ import io.cucumber.core.backend.DataTableTypeDefinition; import io.cucumber.core.backend.Lookup; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.runtime.Invoker; import io.cucumber.datatable.DataTableType; import io.cucumber.datatable.*; @@ -13,7 +12,7 @@ import java.util.List; import java.util.Map; -import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; +import static io.cucumber.java.InvalidMethodSignatureException.builder; class JavaDataTableTypeDefinition extends AbstractGlueDefinition implements DataTableTypeDefinition { @@ -61,7 +60,7 @@ private DataTableType createDataTableType(Method method) { } - private static CucumberException createInvalidSignatureException(Method method) { + private static InvalidMethodSignatureException createInvalidSignatureException(Method method) { return builder(method) .addAnnotation(DataTableType.class) .addSignature("public Author author(DataTable table)") diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java index 5d1f898e6c..af41ee4f47 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinition.java @@ -2,14 +2,13 @@ import io.cucumber.core.backend.DefaultDataTableCellTransformerDefinition; import io.cucumber.core.backend.Lookup; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.runtime.Invoker; import io.cucumber.datatable.TableCellByTypeTransformer; import java.lang.reflect.Method; import java.lang.reflect.Type; -import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; +import static io.cucumber.java.InvalidMethodSignatureException.builder; class JavaDefaultDataTableCellTransformerDefinition extends AbstractGlueDefinition implements DefaultDataTableCellTransformerDefinition { @@ -42,7 +41,7 @@ private static Method requireValidMethod(Method method) { return method; } - private static CucumberException createInvalidSignatureException(Method method) { + private static InvalidMethodSignatureException createInvalidSignatureException(Method method) { return builder(method) .addAnnotation(DefaultDataTableCellTransformer.class) .addSignature("public Object defaultDataTableCell(String fromValue, Type toValueType)") diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java index 4a90526e64..fe0f9d71ba 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinition.java @@ -2,7 +2,6 @@ import io.cucumber.core.backend.DefaultDataTableEntryTransformerDefinition; import io.cucumber.core.backend.Lookup; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.runtime.Invoker; import io.cucumber.datatable.TableCellByTypeTransformer; import io.cucumber.datatable.TableEntryByTypeTransformer; @@ -12,7 +11,7 @@ import java.lang.reflect.Type; import java.util.Map; -import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; +import static io.cucumber.java.InvalidMethodSignatureException.builder; class JavaDefaultDataTableEntryTransformerDefinition extends AbstractGlueDefinition implements DefaultDataTableEntryTransformerDefinition { @@ -68,7 +67,7 @@ private static Method requireValidMethod(Method method) { return method; } - private static CucumberException createInvalidSignatureException(Method method) { + private static InvalidMethodSignatureException createInvalidSignatureException(Method method) { return builder(method) .addAnnotation(DefaultDataTableEntryTransformer.class) .addSignature("public T defaultDataTableEntry(Map fromValue, Class toValueType)") diff --git a/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java b/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java index b87c2728d8..ed60aba099 100644 --- a/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDefaultParameterTransformerDefinition.java @@ -2,14 +2,13 @@ import io.cucumber.core.backend.DefaultParameterTransformerDefinition; import io.cucumber.core.backend.Lookup; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.runtime.Invoker; import io.cucumber.cucumberexpressions.ParameterByTypeTransformer; import java.lang.reflect.Method; import java.lang.reflect.Type; -import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; +import static io.cucumber.java.InvalidMethodSignatureException.builder; class JavaDefaultParameterTransformerDefinition extends AbstractGlueDefinition implements DefaultParameterTransformerDefinition { @@ -44,7 +43,7 @@ private static Method requireValidMethod(Method method) { return method; } - private static CucumberException createInvalidSignatureException(Method method) { + private static InvalidMethodSignatureException createInvalidSignatureException(Method method) { return builder(method) .addAnnotation(DefaultParameterTransformer.class) .addSignature("public Object defaultDataTableEntry(String fromValue, Type toValueType)") diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index c6dfdd51db..7d98921a92 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -4,14 +4,13 @@ import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.backend.Lookup; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.filter.TagPredicate; import io.cucumber.core.runtime.Invoker; import java.lang.reflect.Method; import java.util.Collection; -import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; +import static io.cucumber.java.InvalidMethodSignatureException.builder; final class JavaHookDefinition extends AbstractGlueDefinition implements HookDefinition { @@ -47,7 +46,7 @@ private static Method requireValidMethod(Method method) { return method; } - private static CucumberException createInvalidSignatureException(Method method) { + private static InvalidMethodSignatureException createInvalidSignatureException(Method method) { return builder(method) .addAnnotation(Before.class) .addAnnotation(After.class) diff --git a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java index 0a25ebe68d..f92f4c8d74 100644 --- a/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaParameterTypeDefinition.java @@ -2,14 +2,13 @@ import io.cucumber.core.backend.Lookup; import io.cucumber.core.backend.ParameterTypeDefinition; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.runtime.Invoker; import io.cucumber.cucumberexpressions.ParameterType; import java.lang.reflect.Method; import java.lang.reflect.Type; -import static io.cucumber.java.InvalidMethodSignatureExceptionBuilder.builder; +import static io.cucumber.java.InvalidMethodSignatureException.builder; import static java.util.Collections.singletonList; class JavaParameterTypeDefinition extends AbstractGlueDefinition implements ParameterTypeDefinition { @@ -58,7 +57,7 @@ private static Method requireValidMethod(Method method) { return method; } - private static CucumberException createInvalidSignatureException(Method method) { + private static InvalidMethodSignatureException createInvalidSignatureException(Method method) { return builder(method) .addAnnotation(ParameterType.class) .addSignature("public Author parameterName(String all)") diff --git a/java/src/main/java/io/cucumber/java/MethodScanner.java b/java/src/main/java/io/cucumber/java/MethodScanner.java index 294996cf99..a5305f54d7 100644 --- a/java/src/main/java/io/cucumber/java/MethodScanner.java +++ b/java/src/main/java/io/cucumber/java/MethodScanner.java @@ -10,6 +10,9 @@ import java.net.URI; import java.util.List; +import static io.cucumber.java.InvalidMethodException.createInvalidMethodException; +import static io.cucumber.java.InvalidMethodException.createMethodDeclaringClassNotAssignableFromGlue; + final class MethodScanner { private final ClassFinder classFinder; @@ -70,10 +73,10 @@ private void scan(JavaBackend javaBackend, Method method, Class glueCodeClass private void validateMethod(Method method, Class glueCodeClass) { if (!method.getDeclaringClass().isAssignableFrom(glueCodeClass)) { - throw new CucumberException(String.format("%s isn't assignable from %s", method.getDeclaringClass(), glueCodeClass)); + throw createMethodDeclaringClassNotAssignableFromGlue(method, glueCodeClass); } if (!glueCodeClass.equals(method.getDeclaringClass())) { - throw new CucumberException(String.format("You're not allowed to extend classes that define Step Definitions or hooks. %s extends %s", glueCodeClass, method.getDeclaringClass())); + throw createInvalidMethodException(method, glueCodeClass); } } @@ -102,10 +105,10 @@ private boolean isRepeatedStepdefAnnotation(Annotation annotation) { return annotationClass.getAnnotation(StepDefAnnotations.class) != null; } - private Annotation[] repeatedAnnotations(Annotation annotation) { + private Annotation[] repeatedAnnotations(Annotation annotation) { try { Method expressionMethod = annotation.getClass().getMethod("value"); - return ( Annotation[]) Invoker.invoke(annotation, expressionMethod, 0); + return (Annotation[]) Invoker.invoke(annotation, expressionMethod, 0); } catch (Throwable e) { throw new CucumberException(e); } diff --git a/java/src/test/java/io/cucumber/java/JavaBackendTest.java b/java/src/test/java/io/cucumber/java/JavaBackendTest.java index 5e4eaca549..c3f5835cfe 100644 --- a/java/src/test/java/io/cucumber/java/JavaBackendTest.java +++ b/java/src/test/java/io/cucumber/java/JavaBackendTest.java @@ -3,7 +3,6 @@ import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.java.steps.Steps; @@ -63,7 +62,7 @@ public void finds_step_definitions_by_classpath_url() { @Test public void detects_subclassed_glue_and_throws_exception() { final Executable testMethod = () -> backend.loadGlue(glue, asList(URI.create("classpath:io/cucumber/java/steps"), URI.create("classpath:io/cucumber/java/incorrectlysubclassedsteps"))); - final CucumberException expectedThrown = assertThrows(CucumberException.class, testMethod); + final InvalidMethodException expectedThrown = assertThrows(InvalidMethodException.class, testMethod); assertThat(expectedThrown.getMessage(), is(equalTo("You're not allowed to extend classes that define Step Definitions or hooks. class io.cucumber.java.incorrectlysubclassedsteps.SubclassesSteps extends class io.cucumber.java.steps.Steps"))); } diff --git a/java/src/test/java/io/cucumber/java/JavaDataTableTypeDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaDataTableTypeDefinitionTest.java index abe93fe93a..07914edf9f 100644 --- a/java/src/test/java/io/cucumber/java/JavaDataTableTypeDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaDataTableTypeDefinitionTest.java @@ -1,7 +1,6 @@ package io.cucumber.java; import io.cucumber.core.backend.Lookup; -import io.cucumber.core.exception.CucumberException; import io.cucumber.datatable.DataTable; import org.junit.Test; @@ -84,7 +83,7 @@ public String converts_table_cell_to_string(String cell) { @Test public void target_type_must_class_type() throws NoSuchMethodException { Method method = JavaDataTableTypeDefinitionTest.class.getMethod("converts_datatable_to_optional_string", DataTable.class); - CucumberException exception = assertThrows(CucumberException.class, () -> new JavaDataTableTypeDefinition(method, lookup)); + InvalidMethodSignatureException exception = assertThrows(InvalidMethodSignatureException.class, () -> new JavaDataTableTypeDefinition(method, lookup)); assertThat(exception.getMessage(), startsWith("" + "A @DataTableType annotated method must have one of these signatures:\n" + " * public Author author(DataTable table)\n" + @@ -101,7 +100,7 @@ public Optional converts_datatable_to_optional_string(DataTable table) { @Test public void target_type_must_not_be_void() throws NoSuchMethodException { Method method = JavaDataTableTypeDefinitionTest.class.getMethod("converts_data_table_to_void", DataTable.class); - assertThrows(CucumberException.class, () -> new JavaDataTableTypeDefinition(method, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDataTableTypeDefinition(method, lookup)); } public void converts_data_table_to_void(DataTable table) { @@ -110,9 +109,9 @@ public void converts_data_table_to_void(DataTable table) { @Test public void must_have_exactly_one_argument() throws NoSuchMethodException { Method noArgs = JavaDataTableTypeDefinitionTest.class.getMethod("converts_nothing_to_string"); - assertThrows(CucumberException.class, () -> new JavaDataTableTypeDefinition(noArgs, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDataTableTypeDefinition(noArgs, lookup)); Method twoArgs = JavaDataTableTypeDefinitionTest.class.getMethod("converts_two_strings_to_string", String.class, String.class); - assertThrows(CucumberException.class, () -> new JavaDataTableTypeDefinition(twoArgs, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDataTableTypeDefinition(twoArgs, lookup)); } public String converts_nothing_to_string() { @@ -126,7 +125,7 @@ public String converts_two_strings_to_string(String arg1, String arg2) { @Test public void argument_must_match_existing_transformer() throws NoSuchMethodException { Method method = JavaDataTableTypeDefinitionTest.class.getMethod("converts_object_to_string", Object.class); - assertThrows(CucumberException.class, () -> new JavaDataTableTypeDefinition(method, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDataTableTypeDefinition(method, lookup)); } public String converts_object_to_string(Object string) { @@ -136,7 +135,7 @@ public String converts_object_to_string(Object string) { @Test public void table_entry_transformer_must_have_map_of_strings() throws NoSuchMethodException { Method method = JavaDataTableTypeDefinitionTest.class.getMethod("converts_map_of_objects_to_string", Map.class); - assertThrows(CucumberException.class, () -> new JavaDataTableTypeDefinition(method, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDataTableTypeDefinition(method, lookup)); } public String converts_map_of_objects_to_string(Map entry) { diff --git a/java/src/test/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinitionTest.java index e982a34dc0..5ccadb0b0d 100644 --- a/java/src/test/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableCellTransformerDefinitionTest.java @@ -1,7 +1,6 @@ package io.cucumber.java; import io.cucumber.core.backend.Lookup; -import io.cucumber.core.exception.CucumberException; import org.junit.Test; import java.lang.reflect.Method; @@ -51,7 +50,7 @@ public Object transform_object_to_type(Object fromValue, Type toValueType) { @Test public void must_have_non_void_return() throws Throwable { Method method = JavaDefaultDataTableCellTransformerDefinitionTest.class.getMethod("transforms_string_to_void", String.class, Type.class); - CucumberException exception = assertThrows(CucumberException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(method, lookup)); + InvalidMethodSignatureException exception = assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(method, lookup)); assertThat(exception.getMessage(), startsWith("" + "A @DefaultDataTableCellTransformer annotated method must have one of these signatures:\n" + " * public Object defaultDataTableCell(String fromValue, Type toValueType)\n" + @@ -66,9 +65,9 @@ public void transforms_string_to_void(String fromValue, Type toValueType) { @Test public void must_have_two_arguments() throws Throwable { Method oneArg = JavaDefaultDataTableCellTransformerDefinitionTest.class.getMethod("one_argument", String.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(oneArg, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(oneArg, lookup)); Method threeArg = JavaDefaultDataTableCellTransformerDefinitionTest.class.getMethod("three_arguments", String.class, Type.class, Object.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(threeArg, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(threeArg, lookup)); } public Object one_argument(String fromValue) { @@ -82,7 +81,7 @@ public Object three_arguments(String fromValue, Type toValueType, Object extra) @Test public void must_have_string_or_object_as_from_value() throws Throwable { Method threeArg = JavaDefaultDataTableCellTransformerDefinitionTest.class.getMethod("map_as_from_value", Map.class, Type.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(threeArg, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(threeArg, lookup)); } @@ -93,7 +92,7 @@ public Object map_as_from_value(Map fromValue, Type toValueType) @Test public void must_have_type_as_to_value_type() throws Throwable { Method threeArg = JavaDefaultDataTableCellTransformerDefinitionTest.class.getMethod("object_as_to_value_type", String.class, Object.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(threeArg, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableCellTransformerDefinition(threeArg, lookup)); } public Object object_as_to_value_type(String fromValue, Object toValueType) { diff --git a/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java index 1536548046..066c3fe7ff 100644 --- a/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaDefaultDataTableEntryTransformerDefinitionTest.java @@ -1,7 +1,6 @@ package io.cucumber.java; import io.cucumber.core.backend.Lookup; -import io.cucumber.core.exception.CucumberException; import io.cucumber.datatable.TableCellByTypeTransformer; import org.junit.Test; @@ -69,9 +68,9 @@ public T correct_method_with_cell_transformer(Map fromValue, @Test public void method_must_have_2_or_3_arguments() throws Throwable { Method toFew = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("one_argument", Map.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(toFew, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(toFew, lookup)); Method toMany = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("four_arguments", Map.class, String.class, String.class, String.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(toMany, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(toMany, lookup)); } public T one_argument(Map fromValue) { @@ -87,7 +86,7 @@ public T four_arguments(Map fromValue, String one, String tw @Test public void method_must_have_return_type() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("void_return_type", Map.class, Class.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); } public void void_return_type(Map fromValue, Class toValue) { @@ -97,11 +96,11 @@ public void void_return_type(Map fromValue, Class toValue) { @Test public void method_must_have_map_as_first_argument() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_first_type", String.class, Class.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); Method method2 = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_first_type", List.class, Class.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method2, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method2, lookup)); Method method3 = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_first_type", Map.class, Class.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method3, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method3, lookup)); } @@ -120,7 +119,7 @@ public T invalid_first_type(Map fromValue, Class toValue) @Test public void method_must_have_class_as_second_argument() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_second_type", Map.class, String.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); } public T invalid_second_type(Map fromValue, String toValue) { @@ -131,7 +130,7 @@ public T invalid_second_type(Map fromValue, String toValue) @Test public void method_must_have_cell_transformer_as_optional_third_argument() throws Throwable { Method method = JavaDefaultDataTableEntryTransformerDefinitionTest.class.getMethod("invalid_optional_third_type", Map.class, Class.class, String.class); - assertThrows(CucumberException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); } diff --git a/java/src/test/java/io/cucumber/java/JavaDefaultParameterTransformerDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaDefaultParameterTransformerDefinitionTest.java index 6d7d84db17..0e029df54c 100644 --- a/java/src/test/java/io/cucumber/java/JavaDefaultParameterTransformerDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaDefaultParameterTransformerDefinitionTest.java @@ -1,7 +1,6 @@ package io.cucumber.java; import io.cucumber.core.backend.Lookup; -import io.cucumber.core.exception.CucumberException; import org.junit.Test; import java.lang.reflect.Method; @@ -51,7 +50,7 @@ public Object transform_object_to_type(Object fromValue, Type toValueType) { @Test public void must_have_non_void_return() throws Throwable { Method method = JavaDefaultParameterTransformerDefinitionTest.class.getMethod("transforms_string_to_void", String.class, Type.class); - CucumberException exception = assertThrows(CucumberException.class, () -> new JavaDefaultParameterTransformerDefinition(method, lookup)); + InvalidMethodSignatureException exception = assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultParameterTransformerDefinition(method, lookup)); assertThat(exception.getMessage(), startsWith("" + "A @DefaultParameterTransformer annotated method must have one of these signatures:\n" + " * public Object defaultDataTableEntry(String fromValue, Type toValueType)\n" + @@ -66,9 +65,9 @@ public void transforms_string_to_void(String fromValue, Type toValueType) { @Test public void must_have_two_arguments() throws Throwable { Method oneArg = JavaDefaultParameterTransformerDefinitionTest.class.getMethod("one_argument", String.class); - assertThrows(CucumberException.class, () -> new JavaDefaultParameterTransformerDefinition(oneArg, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultParameterTransformerDefinition(oneArg, lookup)); Method threeArg = JavaDefaultParameterTransformerDefinitionTest.class.getMethod("three_arguments", String.class, Type.class, Object.class); - assertThrows(CucumberException.class, () -> new JavaDefaultParameterTransformerDefinition(threeArg, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultParameterTransformerDefinition(threeArg, lookup)); } public Object one_argument(String fromValue) { @@ -82,7 +81,7 @@ public Object three_arguments(String fromValue, Type toValueType, Object extra) @Test public void must_have_string_or_object_as_from_value() throws Throwable { Method threeArg = JavaDefaultParameterTransformerDefinitionTest.class.getMethod("map_as_from_value", Map.class, Type.class); - assertThrows(CucumberException.class, () -> new JavaDefaultParameterTransformerDefinition(threeArg, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultParameterTransformerDefinition(threeArg, lookup)); } @@ -93,7 +92,7 @@ public Object map_as_from_value(Map fromValue, Type toValueType) @Test public void must_have_type_as_to_value_type() throws Throwable { Method threeArg = JavaDefaultParameterTransformerDefinitionTest.class.getMethod("object_as_to_value_type", String.class, Object.class); - assertThrows(CucumberException.class, () -> new JavaDefaultParameterTransformerDefinition(threeArg, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaDefaultParameterTransformerDefinition(threeArg, lookup)); } public Object object_as_to_value_type(String fromValue, Object toValueType) { diff --git a/java/src/test/java/io/cucumber/java/JavaHookTest.java b/java/src/test/java/io/cucumber/java/JavaHookTest.java index cd1e7cc39a..cbe20ae624 100644 --- a/java/src/test/java/io/cucumber/java/JavaHookTest.java +++ b/java/src/test/java/io/cucumber/java/JavaHookTest.java @@ -4,7 +4,6 @@ import gherkin.pickles.PickleTag; import io.cucumber.core.api.Scenario; import io.cucumber.core.backend.Glue; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; @@ -65,8 +64,8 @@ public class JavaHookTest { BAD_MULTIPLE = BadHookMultipleArgs.class.getMethod("after", Scenario.class, String.class); SINGLE_ARG = SingleArg.class.getMethod("after", Scenario.class); ZERO_ARG = ZeroArg.class.getMethod("after"); - } catch (NoSuchMethodException note) { - throw new InternalError("dang"); + } catch (NoSuchMethodException e) { + throw new IllegalStateException(e); } } @@ -184,8 +183,8 @@ public void after() { @Test public void fails_if_hook_argument_is_not_scenario_result() { objectFactory.setInstance(new BadHook()); - CucumberException cucumberException = assertThrows( - CucumberException.class, + InvalidMethodSignatureException cucumberException = assertThrows( + InvalidMethodSignatureException.class, () -> backend.addHook(BAD_AFTER.getAnnotation(After.class), BAD_AFTER) ); assertThat(cucumberException.getMessage(), startsWith("" + @@ -205,11 +204,11 @@ public void after(String badType) { @Test public void fails_if_generic_hook_argument_is_not_scenario_result() { objectFactory.setInstance(new BadGenericHook()); - CucumberException cucumberException = assertThrows( - CucumberException.class, + InvalidMethodSignatureException exception = assertThrows( + InvalidMethodSignatureException.class, () -> backend.addHook(BAD_GENERIC_AFTER.getAnnotation(After.class), BAD_GENERIC_AFTER) ); - assertThat(cucumberException.getMessage(), startsWith("" + + assertThat(exception.getMessage(), startsWith("" + "A method annotated with Before, After, BeforeStep or AfterStep must have one of these signatures:\n" + " * public void before_or_after(Scenario scenario)\n" + " * public void before_or_after()\n" + @@ -226,11 +225,11 @@ public void after(List badType) { @Test public void fails_if_too_many_arguments() { objectFactory.setInstance(new BadGenericHook()); - CucumberException cucumberException = assertThrows( - CucumberException.class, + InvalidMethodSignatureException exception = assertThrows( + InvalidMethodSignatureException.class, () -> backend.addHook(BAD_MULTIPLE.getAnnotation(After.class), BAD_MULTIPLE) ); - assertThat(cucumberException.getMessage(), startsWith("" + + assertThat(exception.getMessage(), startsWith("" + "A method annotated with Before, After, BeforeStep or AfterStep must have one of these signatures:\n" + " * public void before_or_after(Scenario scenario)\n" + " * public void before_or_after()\n" + diff --git a/java/src/test/java/io/cucumber/java/JavaParameterTypeDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaParameterTypeDefinitionTest.java index 6cd8fc2409..99d14d85b2 100644 --- a/java/src/test/java/io/cucumber/java/JavaParameterTypeDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaParameterTypeDefinitionTest.java @@ -1,7 +1,6 @@ package io.cucumber.java; import io.cucumber.core.backend.Lookup; -import io.cucumber.core.exception.CucumberException; import io.cucumber.cucumberexpressions.Argument; import io.cucumber.cucumberexpressions.CucumberExpression; import io.cucumber.cucumberexpressions.CucumberExpressionException; @@ -85,7 +84,7 @@ public void arguments_must_match_captured_groups() throws NoSuchMethodException @Test public void converter_must_have_return_type() throws NoSuchMethodException { Method method = JavaParameterTypeDefinitionTest.class.getMethod("convert_capture_group_to_void", String.class); - assertThrows(CucumberException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); } public void convert_capture_group_to_void(String all) { @@ -94,7 +93,7 @@ public void convert_capture_group_to_void(String all) { @Test public void converter_must_have_non_generic_return_type() throws NoSuchMethodException { Method method = JavaParameterTypeDefinitionTest.class.getMethod("convert_capture_group_to_optional_string", String.class); - assertThrows(CucumberException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); } public Optional convert_capture_group_to_optional_string(String all) { @@ -104,7 +103,7 @@ public Optional convert_capture_group_to_optional_string(String all) { @Test public void converter_must_have_at_least_one_argument() throws NoSuchMethodException { Method method = JavaParameterTypeDefinitionTest.class.getMethod("convert_nothing_to_string"); - assertThrows(CucumberException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); } public String convert_nothing_to_string() { @@ -114,7 +113,7 @@ public String convert_nothing_to_string() { @Test public void converter_must_have_string_arguments() throws NoSuchMethodException { Method method = JavaParameterTypeDefinitionTest.class.getMethod("converts_object_to_string", Object.class); - assertThrows(CucumberException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); } public String converts_object_to_string(Object other) { @@ -124,7 +123,7 @@ public String converts_object_to_string(Object other) { @Test public void converter_must_have_all_string_arguments() throws NoSuchMethodException { Method method = JavaParameterTypeDefinitionTest.class.getMethod("converts_objects_to_string", String.class, Object.class); - assertThrows(CucumberException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); + assertThrows(InvalidMethodSignatureException.class, () -> new JavaParameterTypeDefinition("", "(.*)", method, false, false, lookup)); } public String converts_objects_to_string(String all, Object other) { diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 4886bc59fd..034fb4d67e 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -1,11 +1,7 @@ package io.cucumber.java; import gherkin.events.PickleEvent; -import gherkin.pickles.Argument; -import gherkin.pickles.Pickle; -import gherkin.pickles.PickleLocation; -import gherkin.pickles.PickleStep; -import gherkin.pickles.PickleTag; +import gherkin.pickles.*; import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.event.Result; import io.cucumber.core.event.TestStepFinished; @@ -16,11 +12,7 @@ import io.cucumber.core.options.RuntimeOptions; import io.cucumber.core.runner.AmbiguousStepDefinitionsException; import io.cucumber.core.runner.Runner; -import io.cucumber.core.runtime.BackendSupplier; -import io.cucumber.core.runtime.ObjectFactorySupplier; -import io.cucumber.core.runtime.ThreadLocalRunnerSupplier; -import io.cucumber.core.runtime.TimeServiceEventBus; -import io.cucumber.core.runtime.TypeRegistryConfigurerSupplier; +import io.cucumber.core.runtime.*; import io.cucumber.java.en.Given; import org.junit.Before; import org.junit.Test; @@ -35,10 +27,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.StringStartsWith.startsWith; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; @@ -53,7 +42,7 @@ public class JavaStepDefinitionTest { THREE_DISABLED_MICE = Defs.class.getMethod("threeDisabledMice", String.class); THREE_BLIND_ANIMALS = Defs.class.getMethod("threeBlindAnimals", String.class); } catch (NoSuchMethodException e) { - throw new InternalError("dang"); + throw new IllegalStateException(e); } } diff --git a/java/src/test/java/io/cucumber/java/MethodScannerTest.java b/java/src/test/java/io/cucumber/java/MethodScannerTest.java index f2e69b7806..b2a69f8dd0 100644 --- a/java/src/test/java/io/cucumber/java/MethodScannerTest.java +++ b/java/src/test/java/io/cucumber/java/MethodScannerTest.java @@ -2,7 +2,6 @@ import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; @@ -18,11 +17,10 @@ import java.util.Collections; import static java.lang.Thread.currentThread; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; public class MethodScannerTest { @@ -59,23 +57,20 @@ public void loadGlue_registers_the_methods_declaring_class_in_the_object_factory @Test public void loadGlue_fails_when_class_is_not_method_declaring_class() throws NoSuchMethodException { MethodScanner methodScanner = new MethodScanner(classFinder); - try { - methodScanner.scan(backend, BaseStepDefs.class.getMethod("m"), Stepdefs2.class); - fail(); - } catch (CucumberException e) { - assertEquals("You're not allowed to extend classes that define Step Definitions or hooks. class io.cucumber.java.MethodScannerTest$Stepdefs2 extends class io.cucumber.java.MethodScannerTest$BaseStepDefs", e.getMessage()); - } + InvalidMethodException exception = assertThrows(InvalidMethodException.class, () -> methodScanner.scan(backend, BaseStepDefs.class.getMethod("m"), Stepdefs2.class)); + assertThat(exception.getMessage(), is( + "You're not allowed to extend classes that define Step Definitions or hooks. " + + "class io.cucumber.java.MethodScannerTest$Stepdefs2 extends class io.cucumber.java.MethodScannerTest$BaseStepDefs" + )); } @Test public void loadGlue_fails_when_class_is_not_subclass_of_declaring_class() throws NoSuchMethodException { MethodScanner methodScanner = new MethodScanner(classFinder); - try { - methodScanner.scan(backend, BaseStepDefs.class.getMethod("m"), String.class); - fail(); - } catch (CucumberException e) { - assertEquals("class io.cucumber.java.MethodScannerTest$BaseStepDefs isn't assignable from class java.lang.String", e.getMessage()); - } + InvalidMethodException exception = assertThrows(InvalidMethodException.class, () -> methodScanner.scan(backend, BaseStepDefs.class.getMethod("m"), String.class)); + assertThat(exception.getMessage(), is( + "class io.cucumber.java.MethodScannerTest$BaseStepDefs isn't assignable from class java.lang.String" + )); } public static class Stepdefs2 extends BaseStepDefs { From df95d7b651ac952c6aac0bf2f999375ce89e99e9 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 28 Jul 2019 11:20:15 +0200 Subject: [PATCH 146/155] [Java] Update README.md --- java/README.md | 110 +++++++++++++++++- .../src/main/java/io/cucumber/java/After.java | 5 +- .../main/java/io/cucumber/java/AfterStep.java | 3 + .../main/java/io/cucumber/java/Before.java | 3 + .../java/io/cucumber/java/BeforeStep.java | 5 +- .../java/io/cucumber/java/DataTableType.java | 2 +- 6 files changed, 120 insertions(+), 8 deletions(-) diff --git a/java/README.md b/java/README.md index fc14f8c1e3..c2f86a8d75 100644 --- a/java/README.md +++ b/java/README.md @@ -18,10 +18,12 @@ Provides annotation based step definitions. To use add the `cucumber-java` depen ## Step Definitions -Use annotations to mark methods as steps. For localized annotations import from `io.cucumber.java.` - +Declare a step definition by annotating a method. It is possible use the same method for multiple steps by repeating +the annotation. For localized annotations import the annotations from `io.cucumber.java..*` ```java +package com.example.app; + import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; @@ -50,14 +52,112 @@ public class CalculatorSteps{ } ``` -## TODO: Hooks +## Hooks + +Declare hooks that will be executed before/after each scenario/step by annotating a method. The method may declare an +argument of type `io.cucumber.core.api.Scenario`. + * `@Before` * `@After` * `@BeforeStep` * `@AfterStep` -## TODO: Transformers +## Transformers + +### Parameter Type + +Step definition parameter types can be declared by using `@ParameterType`. The name of the annotated method will be used +as the parameter name. + +```java +package com.example.app; + +import io.cucumber.java.ParameterType; +import io.cucumber.java.en.Given; + +import java.time.LocalDate; + +public class Steps { + + @ParameterType("([0-9]{4})-([0-9]{2})-([0-9]{2})") + public LocalDate iso8601Date(String year, String month, String day) { + return LocalDate.of(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day)); + } + + @Given("today is {iso8601Date}") + public void today_is(LocalDate date) { + + } +} +``` + +### Data Table Type + +Data table types can be declared by annotating a method with `@DataTableType`. Depending on the parameter type this +will be either a: + * `String` -> `io.cucumber.datatable.TableCellTranformer` + * `Map` -> `io.cucumber.datatable.TableEntry` + * `List `io.cucumber.datatable.TableRow` + * `DataTable` -> `io.cucumber.datatable.TableTransformer` + +```java +package com.example.app; + +import io.cucumber.datatable.DataTable; +import io.cucumber.java.DataTableType; + +import java.util.List; +import java.util.Map; + +public class Steps { + + @DataTableType + public Author authorEntryTransformer(Map entry) { + return new Author( + entry.get("firstName"), + entry.get("lastName"), + entry.get("birthDate")); + } + + @DataTableType + public Author authorEntryTransformer(List row) { + return new Author( + row.get(0), + row.get(0), + row.get(0)); + } +} + +``` + +### Default Transformers + +Default transformers allow you to specific a transformer that will be used when there is no transform defined. This can +be combined with an object mapper like Jackson to quickly transform well known string representations to Java objects. + * `@DefaultParameterTransformer` * `@DefaultDataTableEntryTransformer` * `@DefaultDataTableCellTransformer` - \ No newline at end of file + + ```java +package com.example.app; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.cucumber.java.DefaultDataTableCellTransformer; +import io.cucumber.java.DefaultDataTableEntryTransformer; +import io.cucumber.java.DefaultParameterTransformer; + +import java.lang.reflect.Type; + +public class DataTableSteps { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @DefaultParameterTransformer + @DefaultDataTableEntryTransformer + @DefaultDataTableCellTransformer + public Object defaultTransformer(Object fromValue, Type toValueType) { + return objectMapper.convertValue(fromValue, objectMapper.constructType(toValueType)); + } +} +``` \ No newline at end of file diff --git a/java/src/main/java/io/cucumber/java/After.java b/java/src/main/java/io/cucumber/java/After.java index dbef92d640..7e01be9477 100644 --- a/java/src/main/java/io/cucumber/java/After.java +++ b/java/src/main/java/io/cucumber/java/After.java @@ -7,6 +7,9 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * Execute method after each scenario. + */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @API(status = API.Status.STABLE) @@ -22,7 +25,7 @@ /** * Duration in milliseconds this hook is allowed to run. Cucumber * will mark the hook as failed when exceeded. - * + *

        * When the maximum duration is exceeded the thread will * receive an interrupt. Note: if the interrupt is ignored * Cucumber will wait for the this hook to finish. diff --git a/java/src/main/java/io/cucumber/java/AfterStep.java b/java/src/main/java/io/cucumber/java/AfterStep.java index 20b9e565e9..e06ee66df5 100644 --- a/java/src/main/java/io/cucumber/java/AfterStep.java +++ b/java/src/main/java/io/cucumber/java/AfterStep.java @@ -7,6 +7,9 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * Execute method after each step. + */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @API(status = API.Status.STABLE) diff --git a/java/src/main/java/io/cucumber/java/Before.java b/java/src/main/java/io/cucumber/java/Before.java index af13c88873..bd2312a366 100644 --- a/java/src/main/java/io/cucumber/java/Before.java +++ b/java/src/main/java/io/cucumber/java/Before.java @@ -7,6 +7,9 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * Execute method before each scenario. + */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @API(status = API.Status.STABLE) diff --git a/java/src/main/java/io/cucumber/java/BeforeStep.java b/java/src/main/java/io/cucumber/java/BeforeStep.java index eb626b54d3..5a4c56ebb2 100644 --- a/java/src/main/java/io/cucumber/java/BeforeStep.java +++ b/java/src/main/java/io/cucumber/java/BeforeStep.java @@ -7,6 +7,9 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * Execute method before each step. + */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @API(status = API.Status.STABLE) @@ -22,7 +25,7 @@ /** * Duration in milliseconds this hook is allowed to run. Cucumber * will mark the hook as failed when exceeded. - * + *

        * When the maximum duration is exceeded the thread will * receive an interrupt. Note: if the interrupt is ignored * Cucumber will wait for the this hook to finish. diff --git a/java/src/main/java/io/cucumber/java/DataTableType.java b/java/src/main/java/io/cucumber/java/DataTableType.java index b705e00fd0..54eaa7cc80 100644 --- a/java/src/main/java/io/cucumber/java/DataTableType.java +++ b/java/src/main/java/io/cucumber/java/DataTableType.java @@ -8,7 +8,7 @@ import java.lang.annotation.Target; /** - * Allows a DataTableType to be registered. + * Register a data table type. * * Supports TableCellTransformer: String -> T * Supports TableEntryTransformer: Map -> T From 6da0d19b63ee36f5aa6dfb6a16194a3176cedb41 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 28 Jul 2019 11:51:08 +0200 Subject: [PATCH 147/155] [Java] Update Javadoc --- .../java/io/cucumber/java/DataTableType.java | 15 +++-- .../java/DefaultDataTableCellTransformer.java | 12 +++- .../DefaultDataTableEntryTransformer.java | 16 ++++-- .../java/DefaultParameterTransformer.java | 14 ++++- .../java/JavaDataTableTypeDefinition.java | 2 +- .../java/io/cucumber/java/ParameterType.java | 55 ++++++++++++++++++- 6 files changed, 96 insertions(+), 18 deletions(-) diff --git a/java/src/main/java/io/cucumber/java/DataTableType.java b/java/src/main/java/io/cucumber/java/DataTableType.java index 54eaa7cc80..32bfb44b2f 100644 --- a/java/src/main/java/io/cucumber/java/DataTableType.java +++ b/java/src/main/java/io/cucumber/java/DataTableType.java @@ -9,11 +9,18 @@ /** * Register a data table type. + *

        + * The signature of the method is used to determine which data table type is registered: * - * Supports TableCellTransformer: String -> T - * Supports TableEntryTransformer: Map -> T - * Supports TableRowTransformer: List -> T - * Supports TableTransformer: DataTable -> T + *

          + *
        • {@code String -> Author} will register a {@link io.cucumber.datatable.TableCellTransformer}
        • + *
        • {@code Map -> Author} will register a {@link io.cucumber.datatable.TableEntryTransformer}
        • + *
        • {@code List -> Author} will register a {@link io.cucumber.datatable.TableRowTransformer}
        • + *
        • {@code DataTable -> Author} will register a {@link io.cucumber.datatable.TableTransformer}
        • + *
        + * NOTE: {@code Author} is an example of the class you want to convert the table to. + * + * @see io.cucumber.datatable.DataTableType */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) diff --git a/java/src/main/java/io/cucumber/java/DefaultDataTableCellTransformer.java b/java/src/main/java/io/cucumber/java/DefaultDataTableCellTransformer.java index 4a44630125..f8fc865081 100644 --- a/java/src/main/java/io/cucumber/java/DefaultDataTableCellTransformer.java +++ b/java/src/main/java/io/cucumber/java/DefaultDataTableCellTransformer.java @@ -8,10 +8,16 @@ import java.lang.annotation.Target; /** - * Allows a default transformer for all parameters to be registered. + * Register default data table cell transformer. *

        - * Supports TableCellByTypeTransformer: String, Type -> T - * Supports TableCellByTypeTransformer: Object, Type -> T + * Valid method signatures are: + *

          + *
        • {@code String, Type -> Object}
        • + *
        • {@code Object, Type -> Object}
        • + *
        + * + * @see io.cucumber.datatable.TableCellByTypeTransformer + * @see io.cucumber.datatable.DataTableType */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) diff --git a/java/src/main/java/io/cucumber/java/DefaultDataTableEntryTransformer.java b/java/src/main/java/io/cucumber/java/DefaultDataTableEntryTransformer.java index 50d7070056..9491c20418 100644 --- a/java/src/main/java/io/cucumber/java/DefaultDataTableEntryTransformer.java +++ b/java/src/main/java/io/cucumber/java/DefaultDataTableEntryTransformer.java @@ -8,12 +8,18 @@ import java.lang.annotation.Target; /** - * Allows a default transformer for all parameters to be registered. + * Register default data table entry transformer. *

        - * Supports TableEntryByTypeTransformer: Map>, Type -> T - * Supports TableEntryByTypeTransformer: Object, Type -> T - * Supports TableEntryByTypeTransformer: Map>, Type,TableCellByTypeTransformer -> T - * Supports TableEntryByTypeTransformer: Object, Type,TableCellByTypeTransformer -> T + * Valid method signatures are: + *

          + *
        • {@code Map, Type -> Object}
        • + *
        • {@code Object, Type -> Object}
        • + *
        • {@code Map, Type, TableCellByTypeTransformer -> Object}
        • + *
        • {@code Object, Type, TableCellByTypeTransformer -> Object}
        • + *
        + * + * @see io.cucumber.datatable.TableEntryByTypeTransformer + * @see io.cucumber.datatable.DataTableType */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) diff --git a/java/src/main/java/io/cucumber/java/DefaultParameterTransformer.java b/java/src/main/java/io/cucumber/java/DefaultParameterTransformer.java index a3349a8d54..5e8984611d 100644 --- a/java/src/main/java/io/cucumber/java/DefaultParameterTransformer.java +++ b/java/src/main/java/io/cucumber/java/DefaultParameterTransformer.java @@ -7,12 +7,20 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + /** - * Allows a default transformer for all parameters to be registered. + * Register default parameter type transformer. *

        - * Supports ParameterByTypeTransformer: String,Type -> T - * Supports ParameterByTypeTransformer: Object,Type -> T + * Valid method signatures are: + *

          + *
        • {@code String, Type -> Object}
        • + *
        • {@code Object, Type -> Object}
        • + *
        + * + * @see io.cucumber.cucumberexpressions.ParameterByTypeTransformer + * @see io.cucumber.cucumberexpressions.ParameterType */ + @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @API(status = API.Status.STABLE) diff --git a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java index 4f3484afb1..f10fa945c5 100644 --- a/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaDataTableTypeDefinition.java @@ -67,7 +67,7 @@ private static InvalidMethodSignatureException createInvalidSignatureException(M .addSignature("public Author author(List row)") .addSignature("public Author author(Map entry)") .addSignature("public Author author(String cell)") - .addNote("Note: Author is an example of the class you want to convert the table to") + .addNote("Note: Author is an example of the class you want to convert the table to.") .build(); } diff --git a/java/src/main/java/io/cucumber/java/ParameterType.java b/java/src/main/java/io/cucumber/java/ParameterType.java index 10846c038c..ee052c5d54 100644 --- a/java/src/main/java/io/cucumber/java/ParameterType.java +++ b/java/src/main/java/io/cucumber/java/ParameterType.java @@ -1,5 +1,7 @@ package io.cucumber.java; +import io.cucumber.cucumberexpressions.GeneratedExpression; +import io.cucumber.cucumberexpressions.RegularExpression; import org.apiguardian.api.API; import java.lang.annotation.ElementType; @@ -8,21 +10,70 @@ import java.lang.annotation.Target; /** - * Defines a parameter type. + * Register parameter type. + *

        + * The name of the method is used as the name of the {@link io.cucumber.cucumberexpressions.ParameterType}. + *

        + * The method must have one of these signatures. The number of {@code String} parameters must match the + * number of capture groups in the regular expression. * - * Method signature must have a String argument for each capture group + *

          + *
        • {@code String -> Author}
        • + *
        • {@code String, String -> Author}
        • + *
        • {@code String, String, ect -> Author}
        • + *
        • {@code String... -> Author}
        • + *
        + * NOTE: {@code Author} is an example of the type of the parameter type. {@link io.cucumber.cucumberexpressions.ParameterType#getType()} * + * @see io.cucumber.cucumberexpressions.ParameterType + * @see Cucumber Expressions */ + @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @API(status = API.Status.STABLE) public @interface ParameterType { + /** + * Regular expression. + *

        + * Describes which patterns match this parameter type. If the expression includes capture groups their captured + * strings will be provided as individual arguments. + * + * @return a regular expression. + * @see io.cucumber.cucumberexpressions.ParameterType#getRegexps() + */ String value(); + /** + * Name of the parameter type. + *

        + * This is used in the type name in typed expressions. When not provided this will default to the name of + * the annotated method. + * + * @return human readable type name + * @see io.cucumber.cucumberexpressions.ParameterType#getName() + */ String name() default ""; + /** + * Indicates whether or not this is a preferential parameter type when matching text + * against a {@link RegularExpression}. In case there are multiple parameter types + * with a regexp identical to the capture group's regexp, a preferential parameter type will + * win. If there are more than 1 preferential ones, an error will be thrown. + * + * @return true if this is a preferential type + * @see io.cucumber.cucumberexpressions.ParameterType#preferForRegexpMatch() + */ boolean preferForRegexMatch() default false; + /** + * Indicates whether or not this is a parameter type that should be used for generating + * {@link GeneratedExpression}s from text. Typically, parameter types with greedy regexps + * should return false. + * + * @return true is this parameter type is used for expression generation + * @see io.cucumber.cucumberexpressions.ParameterType#useForSnippets() + */ boolean useForSnippets() default false; } From ea91dd61d42fc2ca13be733d38dff4d43954834b Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 28 Jul 2019 12:21:03 +0200 Subject: [PATCH 148/155] [Java] Check locale based decimal/point conversion --- .../cucumber/java/annotation/FrenchSteps.java | 21 +++++++++++++++++++ .../french-iso-8859-1-cukes.feature | 7 ++++--- .../java/annotation/french-numbers.feature | 5 +++++ 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 java/src/test/java/io/cucumber/java/annotation/FrenchSteps.java create mode 100644 java/src/test/resources/io/cucumber/java/annotation/french-numbers.feature diff --git a/java/src/test/java/io/cucumber/java/annotation/FrenchSteps.java b/java/src/test/java/io/cucumber/java/annotation/FrenchSteps.java new file mode 100644 index 0000000000..5393743503 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/annotation/FrenchSteps.java @@ -0,0 +1,21 @@ +package io.cucumber.java.annotation; + +import io.cucumber.java.fr.Étantdonné; + +import java.math.BigDecimal; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +public class FrenchSteps { + + @Étantdonné("j'ai {bigdecimal} concombres fractionnaires") + public void jAiConcombresFractionnaires(BigDecimal arg0) { + assertThat(arg0, is(new BigDecimal("5.5"))); + } + + @Étantdonné("j'ai {int} concombres") + public void jAiConcombres(int arg0) { + assertThat(arg0, is(5)); + } +} diff --git a/java/src/test/resources/io/cucumber/java/annotation/french-iso-8859-1-cukes.feature b/java/src/test/resources/io/cucumber/java/annotation/french-iso-8859-1-cukes.feature index 91254aead4..8a270c523e 100644 --- a/java/src/test/resources/io/cucumber/java/annotation/french-iso-8859-1-cukes.feature +++ b/java/src/test/resources/io/cucumber/java/annotation/french-iso-8859-1-cukes.feature @@ -1,5 +1,6 @@ # language: fr # encoding: ISO-8859-1 -Fonctionnalité: Cukes - Scénario: in the belly - Étant donné I have 5 cukes in the belly +Fonctionnalité: Concombres dans ISO-8859-1 + + Scénario: dans la ventre + Étant donné j'ai 5 concombres diff --git a/java/src/test/resources/io/cucumber/java/annotation/french-numbers.feature b/java/src/test/resources/io/cucumber/java/annotation/french-numbers.feature new file mode 100644 index 0000000000..a85d3174bb --- /dev/null +++ b/java/src/test/resources/io/cucumber/java/annotation/french-numbers.feature @@ -0,0 +1,5 @@ +# language: fr +Fonctionnalité: Concombres fractionnaires + + Scénario: dans la ventre + Étant donné j'ai 5,5 concombres fractionnaires From 3e6da03d712521226d706f1011808ce05d12262f Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 28 Jul 2019 12:34:38 +0200 Subject: [PATCH 149/155] [Java] Mark StepDefAnnotation as internal --- java/src/main/java/io/cucumber/java/JavaSnippet.java | 2 +- java/src/main/java/io/cucumber/java/PendingException.java | 8 +++++++- .../src/main/java/io/cucumber/java/StepDefAnnotation.java | 3 +++ .../main/java/io/cucumber/java/StepDefAnnotations.java | 3 +++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/java/src/main/java/io/cucumber/java/JavaSnippet.java b/java/src/main/java/io/cucumber/java/JavaSnippet.java index db5a505f20..1c21f30187 100644 --- a/java/src/main/java/io/cucumber/java/JavaSnippet.java +++ b/java/src/main/java/io/cucumber/java/JavaSnippet.java @@ -10,7 +10,7 @@ public MessageFormat template() { "@{0}(\"{1}\")\n" + "public void {2}({3}) '{'\n" + " // {4}\n" + - "{5} throw new io.cucumber.java.PendingException();\n" + + "{5} throw new " + PendingException.class.getName() + "();\n" + "'}'\n"); } } diff --git a/java/src/main/java/io/cucumber/java/PendingException.java b/java/src/main/java/io/cucumber/java/PendingException.java index 2e1f11d51e..3858c999a2 100644 --- a/java/src/main/java/io/cucumber/java/PendingException.java +++ b/java/src/main/java/io/cucumber/java/PendingException.java @@ -1,9 +1,15 @@ package io.cucumber.java; import io.cucumber.core.backend.Pending; +import org.apiguardian.api.API; -// We're deliberately not extending CucumberException (which is used to signal fatal errors) +/** + * When thrown from a step marks it as not yet implemented. + * + * @see JavaSnippet + */ @Pending +@API(status = API.Status.STABLE) public final class PendingException extends RuntimeException { public PendingException() { this("TODO: implement me"); diff --git a/java/src/main/java/io/cucumber/java/StepDefAnnotation.java b/java/src/main/java/io/cucumber/java/StepDefAnnotation.java index c678bf299b..dbb8db8c8f 100644 --- a/java/src/main/java/io/cucumber/java/StepDefAnnotation.java +++ b/java/src/main/java/io/cucumber/java/StepDefAnnotation.java @@ -1,5 +1,7 @@ package io.cucumber.java; +import org.apiguardian.api.API; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -7,5 +9,6 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) +@API(status = API.Status.INTERNAL) public @interface StepDefAnnotation { } diff --git a/java/src/main/java/io/cucumber/java/StepDefAnnotations.java b/java/src/main/java/io/cucumber/java/StepDefAnnotations.java index cc7f48fe11..093fc599cd 100644 --- a/java/src/main/java/io/cucumber/java/StepDefAnnotations.java +++ b/java/src/main/java/io/cucumber/java/StepDefAnnotations.java @@ -1,5 +1,7 @@ package io.cucumber.java; +import org.apiguardian.api.API; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -7,5 +9,6 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) +@API(status = API.Status.INTERNAL) public @interface StepDefAnnotations { } From ae41ee7f85c831ba86e880f1e70e8278b22b766b Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 28 Jul 2019 13:29:49 +0200 Subject: [PATCH 150/155] [Java8] Extract abstract glue from step and hook definitions --- .../cucumber/java/AbstractGlueDefinition.java | 2 +- .../java8/AbstractGlueDefinition.java | 49 +++++++++++++++++++ .../cucumber/java8/Java8HookDefinition.java | 41 +++++----------- .../java/io/cucumber/java8/Java8Snippet.java | 2 +- .../cucumber/java8/Java8StepDefinition.java | 43 +--------------- .../io/cucumber/java8/PendingException.java | 8 ++- .../io/cucumber/java8/Java8BackendTest.java | 2 +- .../java8/{stepdefs => steps}/Stepdefs.java | 2 +- 8 files changed, 74 insertions(+), 75 deletions(-) create mode 100644 java8/src/main/java/io/cucumber/java8/AbstractGlueDefinition.java rename java8/src/test/java/io/cucumber/java8/{stepdefs => steps}/Stepdefs.java (80%) diff --git a/java/src/main/java/io/cucumber/java/AbstractGlueDefinition.java b/java/src/main/java/io/cucumber/java/AbstractGlueDefinition.java index e0d8c0a985..0c7b8f2529 100644 --- a/java/src/main/java/io/cucumber/java/AbstractGlueDefinition.java +++ b/java/src/main/java/io/cucumber/java/AbstractGlueDefinition.java @@ -5,7 +5,7 @@ import java.lang.reflect.Method; -class AbstractGlueDefinition { +abstract class AbstractGlueDefinition { protected final Method method; protected final Lookup lookup; diff --git a/java8/src/main/java/io/cucumber/java8/AbstractGlueDefinition.java b/java8/src/main/java/io/cucumber/java8/AbstractGlueDefinition.java new file mode 100644 index 0000000000..1df29ab2c3 --- /dev/null +++ b/java8/src/main/java/io/cucumber/java8/AbstractGlueDefinition.java @@ -0,0 +1,49 @@ +package io.cucumber.java8; + +import io.cucumber.core.runner.ScenarioScoped; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +import static java.lang.String.format; + +abstract class AbstractGlueDefinition implements ScenarioScoped { + + Object body; + final Method method; + final StackTraceElement location; + + AbstractGlueDefinition(Object body, StackTraceElement location) { + this.body = body; + this.method = getAcceptMethod(body.getClass()); + this.location = location; + } + + public final String getLocation(boolean detail) { + return location.getFileName() + ":" + location.getLineNumber(); + } + + public final boolean isDefinedAt(StackTraceElement stackTraceElement) { + return location.getFileName() != null && location.getFileName().equals(stackTraceElement.getFileName()); + } + + private Method getAcceptMethod(Class bodyClass) { + List acceptMethods = new ArrayList<>(); + for (Method method : bodyClass.getDeclaredMethods()) { + if (!method.isBridge() && !method.isSynthetic() && "accept".equals(method.getName())) { + acceptMethods.add(method); + } + } + if (acceptMethods.size() != 1) { + throw new IllegalStateException(format( + "Expected single 'accept' method on body class, found '%s'", acceptMethods)); + } + return acceptMethods.get(0); + } + + @Override + public final void disposeScenarioScope() { + this.body = null; + } +} diff --git a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java index 0667194b15..f7ad9730e7 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8HookDefinition.java @@ -5,51 +5,38 @@ import io.cucumber.core.backend.HookDefinition; import io.cucumber.core.filter.TagPredicate; import io.cucumber.core.runtime.Invoker; -import io.cucumber.core.runner.ScenarioScoped; import java.util.Collection; -final class Java8HookDefinition implements HookDefinition, ScenarioScoped { +final class Java8HookDefinition extends AbstractGlueDefinition implements HookDefinition { private final TagPredicate tagPredicate; private final int order; private final long timeoutMillis; - private final HookNoArgsBody hookNoArgsBody; - private HookBody hookBody; - private final StackTraceElement location; - private Java8HookDefinition(String tagExpressions, int order, long timeoutMillis, HookBody hookBody, HookNoArgsBody hookNoArgsBody) { + private Java8HookDefinition(String tagExpressions, int order, long timeoutMillis, Object body) { + super(body, new Exception().getStackTrace()[3]); this.order = order; this.timeoutMillis = timeoutMillis; this.tagPredicate = new TagPredicate(tagExpressions); - this.hookBody = hookBody; - this.hookNoArgsBody = hookNoArgsBody; - this.location = new Exception().getStackTrace()[3]; } Java8HookDefinition(String tagExpressions, int order, long timeoutMillis, HookBody hookBody) { - this(tagExpressions, order, timeoutMillis, hookBody, null); + this(tagExpressions, order, timeoutMillis, (Object) hookBody); } Java8HookDefinition(String tagExpressions, int order, long timeoutMillis, HookNoArgsBody hookNoArgsBody) { - this(tagExpressions, order, timeoutMillis, null, hookNoArgsBody); - } - - @Override - public String getLocation(boolean detail) { - return location.getFileName() + ":" + location.getLineNumber(); + this(tagExpressions, order, timeoutMillis, (Object) hookNoArgsBody); } @Override public void execute(final Scenario scenario) throws Throwable { - Invoker.timeout(() -> { - if (hookBody != null) { - hookBody.accept(scenario); - } else { - hookNoArgsBody.accept(); - } - return null; - - }, timeoutMillis); + Object[] args; + if (method.getParameterCount() == 0) { + args = new Object[0]; + } else { + args = new Object[]{scenario}; + } + Invoker.invoke(body, method, timeoutMillis, args); } @Override @@ -62,8 +49,4 @@ public int getOrder() { return order; } - @Override - public void disposeScenarioScope() { - this.hookBody = null; - } } diff --git a/java8/src/main/java/io/cucumber/java8/Java8Snippet.java b/java8/src/main/java/io/cucumber/java8/Java8Snippet.java index 170729affc..0b623f1f2b 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8Snippet.java +++ b/java8/src/main/java/io/cucumber/java8/Java8Snippet.java @@ -9,7 +9,7 @@ public MessageFormat template() { return new MessageFormat("" + "{0}(\"{1}\", ({3}) -> '{'\n" + " // {4}\n" + - "{5} throw new io.cucumber.java8.PendingException();\n" + + "{5} throw new " + PendingException.class.getName() + "();\n" + "'}');\n"); } } diff --git a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java index 5011a5dfa5..3c7055053e 100644 --- a/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java +++ b/java8/src/main/java/io/cucumber/java8/Java8StepDefinition.java @@ -2,18 +2,15 @@ import io.cucumber.core.backend.ParameterInfo; import io.cucumber.core.backend.StepDefinition; -import io.cucumber.core.runner.ScenarioScoped; import io.cucumber.core.runtime.Invoker; -import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; -import static java.lang.String.format; import static net.jodah.typetools.TypeResolver.resolveRawArguments; -final class Java8StepDefinition implements StepDefinition, ScenarioScoped { +final class Java8StepDefinition extends AbstractGlueDefinition implements StepDefinition { public static Java8StepDefinition create( String expression, Class bodyClass, T body) { @@ -26,9 +23,6 @@ public static StepDefinition create( } private final long timeoutMillis; - private StepdefBody body; - private final StackTraceElement location; - private final Method method; private final List parameterInfos; private final String expression; @@ -36,44 +30,17 @@ private Java8StepDefinition(String expression, long timeoutMillis, Class bodyClass, T body) { + super(body, new Exception().getStackTrace()[3]); this.timeoutMillis = timeoutMillis; - this.body = body; - this.location = new Exception().getStackTrace()[3]; - this.method = getAcceptMethod(body.getClass()); this.expression = expression; this.parameterInfos = fromTypes(expression, location, resolveRawArguments(bodyClass, body.getClass())); } - private Method getAcceptMethod(Class bodyClass) { - List acceptMethods = new ArrayList<>(); - for (Method method : bodyClass.getDeclaredMethods()) { - if (!method.isBridge() && !method.isSynthetic() && "accept".equals(method.getName())) { - acceptMethods.add(method); - } - } - if (acceptMethods.size() != 1) { - throw new IllegalStateException(format( - "Expected single 'accept' method on body class, found '%s'", acceptMethods)); - } - return acceptMethods.get(0); - } - - - @Override - public String getLocation(boolean detail) { - return location.getFileName() + ":" + location.getLineNumber(); - } - @Override public void execute(final Object[] args) throws Throwable { Invoker.invoke(body, method, timeoutMillis, args); } - @Override - public boolean isDefinedAt(StackTraceElement stackTraceElement) { - return location.getFileName() != null && location.getFileName().equals(stackTraceElement.getFileName()); - } - @Override public List parameterInfos() { return parameterInfos; @@ -84,12 +51,6 @@ public String getPattern() { return expression; } - - @Override - public void disposeScenarioScope() { - this.body = null; - } - private static List fromTypes(String expression, StackTraceElement location, Type[] genericParameterTypes) { List result = new ArrayList<>(); for (Type type : genericParameterTypes) { diff --git a/java8/src/main/java/io/cucumber/java8/PendingException.java b/java8/src/main/java/io/cucumber/java8/PendingException.java index 23f87c5fef..220e9dd9e8 100644 --- a/java8/src/main/java/io/cucumber/java8/PendingException.java +++ b/java8/src/main/java/io/cucumber/java8/PendingException.java @@ -1,9 +1,15 @@ package io.cucumber.java8; import io.cucumber.core.backend.Pending; +import org.apiguardian.api.API; -// We're deliberately not extending CucumberException (which is used to signal fatal errors) +/** + * When thrown from a step marks it as not yet implemented. + * + * @see Java8Snippet + */ @Pending +@API(status = API.Status.STABLE) public final class PendingException extends RuntimeException { public PendingException() { this("TODO: implement me"); diff --git a/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java b/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java index 983dba2ca3..547d047411 100644 --- a/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java +++ b/java8/src/test/java/io/cucumber/java8/Java8BackendTest.java @@ -4,7 +4,7 @@ import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.java8.stepdefs.Stepdefs; +import io.cucumber.java8.steps.Stepdefs; import org.junit.Before; import org.junit.Rule; import org.junit.Test; diff --git a/java8/src/test/java/io/cucumber/java8/stepdefs/Stepdefs.java b/java8/src/test/java/io/cucumber/java8/steps/Stepdefs.java similarity index 80% rename from java8/src/test/java/io/cucumber/java8/stepdefs/Stepdefs.java rename to java8/src/test/java/io/cucumber/java8/steps/Stepdefs.java index e6c80cbe41..5802b1edca 100644 --- a/java8/src/test/java/io/cucumber/java8/stepdefs/Stepdefs.java +++ b/java8/src/test/java/io/cucumber/java8/steps/Stepdefs.java @@ -1,4 +1,4 @@ -package io.cucumber.java8.stepdefs; +package io.cucumber.java8.steps; import io.cucumber.java8.En; From bd8d2b590945492777a1433338999a4e3106945e Mon Sep 17 00:00:00 2001 From: ralphkar Date: Tue, 30 Jul 2019 13:44:49 +0200 Subject: [PATCH 151/155] [Core] Add object-factory option to CLI and CucumberOptions (#1710) Summary In order to provide different test configurations it might be useful to use different object factories when working with a DI framework. This is described in issue #1690. Details The annotations for JUnit and TestNG now allow to specify the class to instantiate as object factory. A CLI flag has been added to allow the specification of an object factory on the command line (--object-factory). Some minor refactorings along the way. Motivation and Context It is now possible to use different object factories in a Cucumber test suite. Features need to be separated (using tags) and can be grouped as separate tests that are annotated with different CucumberOptions. For each specification of CucumberOptions a different objectFactory can be specified. That way different feature tests can e.g. use differently configured injectors. It is no longer necessary to specify an object factory in cucumber.properties. Object factories are loaded via the ServiceLoader and need to be specified in the file META-INF/services/io.cucumber.core.backend.ObjectFactory. Multiple implementations can be given here. --- .../CucumberOptionsAnnotationParser.java | 11 +++- .../core/options/CucumberProperties.java | 2 +- .../options/CucumberPropertiesParser.java | 4 +- .../core/options/RuntimeOptionsParser.java | 3 + .../cucumber/core/snippets/SnippetType.java | 3 - .../io/cucumber/core/options/USAGE.txt | 8 ++- .../core/options/CucumberOptions.java | 7 +++ .../CucumberOptionsAnnotationParserTest.java | 38 +++++++++++++ .../options/CucumberPropertiesParserTest.java | 6 +- .../core/options/NoObjectFactory.java | 30 ++++++++++ .../options/RuntimeOptionsParserTest.java | 52 +++++++++++++++++ .../io/cucumber/junit/CucumberOptions.java | 10 ++++ .../junit/JUnitCucumberOptionsProvider.java | 18 ++++-- .../io/cucumber/junit/NoObjectFactory.java | 30 ++++++++++ .../JUnitCucumberOptionsProviderTest.java | 57 +++++++++++++++++++ .../io/cucumber/testng/CucumberOptions.java | 10 ++++ .../io/cucumber/testng/NoObjectFactory.java | 30 ++++++++++ .../testng/TestNGCucumberOptionsProvider.java | 24 +++++--- .../TestNGCucumberOptionsProviderTest.java | 56 ++++++++++++++++++ 19 files changed, 372 insertions(+), 27 deletions(-) create mode 100644 core/src/test/java/io/cucumber/core/options/NoObjectFactory.java create mode 100644 core/src/test/java/io/cucumber/core/options/RuntimeOptionsParserTest.java create mode 100644 junit/src/main/java/io/cucumber/junit/NoObjectFactory.java create mode 100644 junit/src/test/java/io/cucumber/junit/JUnitCucumberOptionsProviderTest.java create mode 100644 testng/src/main/java/io/cucumber/testng/NoObjectFactory.java create mode 100644 testng/src/test/java/io/cucumber/testng/TestNGCucumberOptionsProviderTest.java diff --git a/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java b/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java index 63c9ea6915..a3b61b4e04 100644 --- a/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java +++ b/core/src/main/java/io/cucumber/core/options/CucumberOptionsAnnotationParser.java @@ -1,6 +1,7 @@ package io.cucumber.core.options; import io.cucumber.core.snippets.SnippetType; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.MultiLoader; import io.cucumber.core.io.ResourceLoader; @@ -50,6 +51,7 @@ public RuntimeOptionsBuilder parse(Class clazz) { addSnippets(options, args); addGlue(options, args); addFeatures(options, args); + addObjectFactory(options, args); } } addDefaultFeaturePathIfNoFeaturePathIsSpecified(args, clazz); @@ -146,13 +148,18 @@ private void addDefaultGlueIfNoOverridingGlueIsSpecified(RuntimeOptionsBuilder a } } - private void addStrict(CucumberOptions options, RuntimeOptionsBuilder args) { if (options.strict()) { args.setStrict(true); } } + private void addObjectFactory(CucumberOptions options, RuntimeOptionsBuilder args) { + if (options.objectFactory() != null) { + args.setObjectFactoryClass(options.objectFactory()); + } + } + private static String packagePath(Class clazz) { String packageName = packageName(clazz); @@ -204,5 +211,7 @@ public interface CucumberOptions { String[] name(); SnippetType snippets(); + + Class objectFactory(); } } diff --git a/core/src/main/java/io/cucumber/core/options/CucumberProperties.java b/core/src/main/java/io/cucumber/core/options/CucumberProperties.java index 587539c15c..aec262e7f7 100644 --- a/core/src/main/java/io/cucumber/core/options/CucumberProperties.java +++ b/core/src/main/java/io/cucumber/core/options/CucumberProperties.java @@ -121,4 +121,4 @@ public String get(Object key) { } } -} \ No newline at end of file +} diff --git a/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java b/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java index 93aa7b928f..97a4d7da9b 100644 --- a/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java +++ b/core/src/main/java/io/cucumber/core/options/CucumberPropertiesParser.java @@ -38,7 +38,7 @@ public RuntimeOptionsBuilder parse(Map properties) { String cucumberObjectFactory = properties.get(CUCUMBER_OBJECT_FACTORY_PROPERTY_NAME); if (cucumberObjectFactory != null) { - Class objectFactoryClass = parse(cucumberObjectFactory); + Class objectFactoryClass = parseObjectFactory(cucumberObjectFactory); builder.setObjectFactoryClass(objectFactoryClass); } @@ -46,7 +46,7 @@ public RuntimeOptionsBuilder parse(Map properties) { } @SuppressWarnings("unchecked") - private Class parse(String cucumberObjectFactory) { + static Class parseObjectFactory(String cucumberObjectFactory) { Class objectFactoryClass; try { objectFactoryClass = Class.forName(cucumberObjectFactory); diff --git a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java index fd65d0a451..dba3e8b63d 100644 --- a/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java +++ b/core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java @@ -105,6 +105,9 @@ RuntimeOptionsBuilder parse(List args) { throw new CucumberException("--count must be > 0"); } parsedOptions.setCount(count); + } else if (arg.equals("--object-factory")) { + String objectFactoryClassName = args.remove(0); + parsedOptions.setObjectFactoryClass(CucumberPropertiesParser.parseObjectFactory(objectFactoryClassName)); } else if (arg.startsWith("-")) { printUsage(); throw new CucumberException("Unknown option: " + arg); diff --git a/core/src/main/java/io/cucumber/core/snippets/SnippetType.java b/core/src/main/java/io/cucumber/core/snippets/SnippetType.java index 5c4f7384bc..813a617622 100644 --- a/core/src/main/java/io/cucumber/core/snippets/SnippetType.java +++ b/core/src/main/java/io/cucumber/core/snippets/SnippetType.java @@ -1,8 +1,5 @@ package io.cucumber.core.snippets; -import org.apiguardian.api.API; - -@API(status = API.Status.STABLE) public enum SnippetType { UNDERSCORE(new UnderscoreJoiner()), CAMELCASE(new CamelCaseJoiner()); diff --git a/core/src/main/resources/io/cucumber/core/options/USAGE.txt b/core/src/main/resources/io/cucumber/core/options/USAGE.txt index 82c6a3ddbd..70107638c4 100644 --- a/core/src/main/resources/io/cucumber/core/options/USAGE.txt +++ b/core/src/main/resources/io/cucumber/core/options/USAGE.txt @@ -1,4 +1,4 @@ -Usage: java cucumber.api.cli.Main [options] [ [DIR|DIR URI] | [ [FILE|FILE URI][:LINE]* ] | @[FILE|FILE URI] ]+ +Usage: java io.cucumber.core.cli.Main [options] [ [DIR|DIR URI] | [ [FILE|FILE URI][:LINE]* ] | @[FILE|FILE URI] ]+ Options: @@ -50,6 +50,12 @@ Options: --count Number of scenarios to be executed. If not specified all scenarios are run. + --object-factory CLASSNAME Uses the class specified by CLASSNAME as + object factory. Be aware that the class is + loaded through a service loader and therefore + also needs to be specified in: + META-INF/services/io.cucumber.core.backend.ObjectFactory + Feature path examples: Load the files with the extension ".feature" diff --git a/core/src/test/java/io/cucumber/core/options/CucumberOptions.java b/core/src/test/java/io/cucumber/core/options/CucumberOptions.java index 126b75f8b8..9d560b98d6 100644 --- a/core/src/test/java/io/cucumber/core/options/CucumberOptions.java +++ b/core/src/test/java/io/cucumber/core/options/CucumberOptions.java @@ -114,6 +114,13 @@ */ SnippetType snippets() default SnippetType.UNDERSCORE; + /** + * A custom ObjectFactory. + * + * @return The class of the custim ObjectFactory to use. + */ + Class objectFactory() default NoObjectFactory.class; + /** * Pass options to the JUnit runner. * diff --git a/core/src/test/java/io/cucumber/core/options/CucumberOptionsAnnotationParserTest.java b/core/src/test/java/io/cucumber/core/options/CucumberOptionsAnnotationParserTest.java index 200059ce6a..b5487fed4b 100644 --- a/core/src/test/java/io/cucumber/core/options/CucumberOptionsAnnotationParserTest.java +++ b/core/src/test/java/io/cucumber/core/options/CucumberOptionsAnnotationParserTest.java @@ -2,6 +2,7 @@ import io.cucumber.core.plugin.Plugin; import io.cucumber.core.snippets.SnippetType; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.exception.CucumberException; import io.cucumber.core.plugin.PluginFactory; import io.cucumber.core.plugin.Plugins; @@ -19,6 +20,7 @@ import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -48,6 +50,7 @@ public void create_without_options() { .addDefaultFormatterIfNotPresent() .build(); assertFalse(runtimeOptions.isStrict()); + assertNull(runtimeOptions.getObjectFactoryClass()); assertThat(runtimeOptions.getFeaturePaths(), contains(uri("classpath:io/cucumber/core/options"))); assertThat(runtimeOptions.getGlue(), contains(uri("classpath:io/cucumber/core/options"))); Plugins plugins = new Plugins(new PluginFactory(), runtimeOptions); @@ -100,6 +103,12 @@ public void create_with_multiple_names() { assertEquals("name2", getRegexpPattern(iterator.next())); } + @Test + public void testObjectFactory() { + RuntimeOptions runtimeOptions = parser().parse(ClassWithCustomObjectFactory.class).build(); + assertEquals(TestObjectFactory.class, runtimeOptions.getObjectFactoryClass()); + } + @Test public void create_with_snippets() { RuntimeOptions runtimeOptions = parser().parse(Snippets.class).build(); @@ -238,6 +247,11 @@ private static class BaseClassWithMonoChromeFalse { // empty } + @CucumberOptions(objectFactory = TestObjectFactory.class) + private static class ClassWithCustomObjectFactory { + // empty + } + @CucumberOptions(plugin = "io.cucumber.core.plugin.AnyStepDefinitionReporter") private static class ClassWithNoFormatterPlugin { // empty @@ -336,6 +350,10 @@ public SnippetType snippets() { return annotation.snippets(); } + @Override + public Class objectFactory() { + return (annotation.objectFactory() == NoObjectFactory.class) ? null : annotation.objectFactory(); + } } private static class CoreCucumberOptionsProvider implements CucumberOptionsAnnotationParser.OptionsProvider { @@ -348,4 +366,24 @@ public CucumberOptionsAnnotationParser.CucumberOptions getOptions(Class clazz return new CoreCucumberOptions(annotation); } } + + private static final class TestObjectFactory implements ObjectFactory { + + @Override + public boolean addClass(Class glueClass) { + return false; + } + + @Override + public T getInstance(Class glueClass) { + return null; + } + + @Override + public void start() {} + + @Override + public void stop() {} + + } } diff --git a/core/src/test/java/io/cucumber/core/options/CucumberPropertiesParserTest.java b/core/src/test/java/io/cucumber/core/options/CucumberPropertiesParserTest.java index c016283a02..996f5eef89 100644 --- a/core/src/test/java/io/cucumber/core/options/CucumberPropertiesParserTest.java +++ b/core/src/test/java/io/cucumber/core/options/CucumberPropertiesParserTest.java @@ -23,7 +23,6 @@ public void should_parse_cucumber_options(){ assertThat(options.getGlue(), equalTo(singletonList(URI.create("classpath:com/example")))); } - @Test public void should_parse_cucumber_object_factory(){ properties.put(Constants.CUCUMBER_OBJECT_FACTORY_PROPERTY_NAME, CustomObjectFactory.class.getName()); @@ -31,8 +30,8 @@ public void should_parse_cucumber_object_factory(){ assertThat(options.getObjectFactoryClass(), equalTo(CustomObjectFactory.class)); } - private static final class CustomObjectFactory implements ObjectFactory { + private static final class CustomObjectFactory implements ObjectFactory { @Override public boolean addClass(Class glueClass) { return false; @@ -53,5 +52,4 @@ public void stop() { } } - -} \ No newline at end of file +} diff --git a/core/src/test/java/io/cucumber/core/options/NoObjectFactory.java b/core/src/test/java/io/cucumber/core/options/NoObjectFactory.java new file mode 100644 index 0000000000..45d8ebcfbe --- /dev/null +++ b/core/src/test/java/io/cucumber/core/options/NoObjectFactory.java @@ -0,0 +1,30 @@ +package io.cucumber.core.options; + +import io.cucumber.core.backend.ObjectFactory; + +/** + * This object factory does nothing. It is solely needed for marking purposes. + */ +final class NoObjectFactory implements ObjectFactory { + + private NoObjectFactory() { + // No need for instantiation + } + + @Override + public boolean addClass(Class glueClass) { + return false; + } + + @Override + public T getInstance(Class glueClass) { + return null; + } + + @Override + public void start() {} + + @Override + public void stop() {} + +} diff --git a/core/src/test/java/io/cucumber/core/options/RuntimeOptionsParserTest.java b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsParserTest.java new file mode 100644 index 0000000000..d24d51cdab --- /dev/null +++ b/core/src/test/java/io/cucumber/core/options/RuntimeOptionsParserTest.java @@ -0,0 +1,52 @@ +package io.cucumber.core.options; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Arrays; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import io.cucumber.core.backend.ObjectFactory; +import io.cucumber.core.feature.RerunLoader; +import io.cucumber.core.io.MultiLoader; + +final class RuntimeOptionsParserTest { + + private RuntimeOptionsParser parser; + + @BeforeEach + void setUp() throws Exception { + this.parser = new RuntimeOptionsParser(new RerunLoader( new MultiLoader(this.getClass().getClassLoader()))); + } + + @Test + void testParseWithObjectFactoryArgument() { + RuntimeOptionsBuilder optionsBuilder = this.parser.parse(Arrays.asList("--object-factory", TestObjectFactory.class.getName())); + assertNotNull(optionsBuilder); + RuntimeOptions options = optionsBuilder.build(); + assertNotNull(options); + assertEquals(TestObjectFactory.class, options.getObjectFactoryClass()); + } + + + private static final class TestObjectFactory implements ObjectFactory { + + @Override + public boolean addClass(Class glueClass) { + return false; + } + + @Override + public T getInstance(Class glueClass) { + return null; + } + + @Override + public void start() {} + + @Override + public void stop() {} + + } +} diff --git a/junit/src/main/java/io/cucumber/junit/CucumberOptions.java b/junit/src/main/java/io/cucumber/junit/CucumberOptions.java index f928c6150d..7cca11be67 100644 --- a/junit/src/main/java/io/cucumber/junit/CucumberOptions.java +++ b/junit/src/main/java/io/cucumber/junit/CucumberOptions.java @@ -117,6 +117,16 @@ */ boolean stepNotifications() default false; + /** + * Specify a custom ObjectFactory. + *

        + * In case a custom ObjectFactory is needed, the class can be specified here. + * A custom ObjectFactory might be needed when more granular control is needed + * over the dependency injection mechanism. + */ + Class objectFactory() default NoObjectFactory.class; + + enum SnippetType { UNDERSCORE, CAMELCASE } diff --git a/junit/src/main/java/io/cucumber/junit/JUnitCucumberOptionsProvider.java b/junit/src/main/java/io/cucumber/junit/JUnitCucumberOptionsProvider.java index 8cc8db2100..2772915a3c 100644 --- a/junit/src/main/java/io/cucumber/junit/JUnitCucumberOptionsProvider.java +++ b/junit/src/main/java/io/cucumber/junit/JUnitCucumberOptionsProvider.java @@ -1,6 +1,7 @@ package io.cucumber.junit; import io.cucumber.core.snippets.SnippetType; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.options.CucumberOptionsAnnotationParser; final class JUnitCucumberOptionsProvider implements CucumberOptionsAnnotationParser.OptionsProvider { @@ -68,13 +69,18 @@ public String[] name() { @Override public SnippetType snippets() { switch (annotation.snippets()) { - case UNDERSCORE: - return SnippetType.UNDERSCORE; - case CAMELCASE: - return SnippetType.CAMELCASE; - default: - throw new IllegalArgumentException("" + annotation.snippets()); + case UNDERSCORE: + return SnippetType.UNDERSCORE; + case CAMELCASE: + return SnippetType.CAMELCASE; + default: + throw new IllegalArgumentException("" + annotation.snippets()); } } + + @Override + public Class objectFactory() { + return (annotation.objectFactory() == NoObjectFactory.class) ? null : annotation.objectFactory(); + } } } diff --git a/junit/src/main/java/io/cucumber/junit/NoObjectFactory.java b/junit/src/main/java/io/cucumber/junit/NoObjectFactory.java new file mode 100644 index 0000000000..c286963434 --- /dev/null +++ b/junit/src/main/java/io/cucumber/junit/NoObjectFactory.java @@ -0,0 +1,30 @@ +package io.cucumber.junit; + +import io.cucumber.core.backend.ObjectFactory; + +/** + * This object factory does nothing. It is solely needed for marking purposes. + */ +final class NoObjectFactory implements ObjectFactory { + + private NoObjectFactory() { + // No need for instantiation + } + + @Override + public boolean addClass(Class glueClass) { + return false; + } + + @Override + public T getInstance(Class glueClass) { + return null; + } + + @Override + public void start() {} + + @Override + public void stop() {} + +} diff --git a/junit/src/test/java/io/cucumber/junit/JUnitCucumberOptionsProviderTest.java b/junit/src/test/java/io/cucumber/junit/JUnitCucumberOptionsProviderTest.java new file mode 100644 index 0000000000..1f2748c5a2 --- /dev/null +++ b/junit/src/test/java/io/cucumber/junit/JUnitCucumberOptionsProviderTest.java @@ -0,0 +1,57 @@ +package io.cucumber.junit; + + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import io.cucumber.core.backend.ObjectFactory; + + +final class JUnitCucumberOptionsProviderTest { + + private JUnitCucumberOptionsProvider optionsProvider; + + @BeforeEach + void setUp() throws Exception { + this.optionsProvider = new JUnitCucumberOptionsProvider(); + } + + @Test + void testObjectFactoryWhenNotSpecified() { + io.cucumber.core.options.CucumberOptionsAnnotationParser.CucumberOptions options = this.optionsProvider.getOptions(ClassWithDefault.class); + assertNull(options.objectFactory()); + } + + @Test + void testObjectFactory() { + io.cucumber.core.options.CucumberOptionsAnnotationParser.CucumberOptions options = this.optionsProvider.getOptions(ClassWithCustomObjectFactory.class); + assertNotNull(options.objectFactory()); + assertEquals(TestObjectFactory.class, options.objectFactory()); + } + + @CucumberOptions() + private static final class ClassWithDefault {} + + @CucumberOptions(objectFactory = TestObjectFactory.class) + private static final class ClassWithCustomObjectFactory {} + + private static final class TestObjectFactory implements ObjectFactory { + @Override + public boolean addClass(Class glueClass) { + return false; + } + + @Override + public T getInstance(Class glueClass) { + return null; + } + + @Override + public void start() {} + + @Override + public void stop() {} + } +} diff --git a/testng/src/main/java/io/cucumber/testng/CucumberOptions.java b/testng/src/main/java/io/cucumber/testng/CucumberOptions.java index e1e41cd486..9ebe07a08d 100644 --- a/testng/src/main/java/io/cucumber/testng/CucumberOptions.java +++ b/testng/src/main/java/io/cucumber/testng/CucumberOptions.java @@ -95,6 +95,16 @@ */ SnippetType snippets() default SnippetType.UNDERSCORE; + /** + * Specify a custom ObjectFactory. + *

        + * In case a custom ObjectFactory is needed, the class can be specified here. + * A custom ObjectFactory might be needed when more granular control is needed + * over the dependency injection mechanism. + */ + Class objectFactory() default NoObjectFactory.class; + + enum SnippetType { UNDERSCORE, CAMELCASE } diff --git a/testng/src/main/java/io/cucumber/testng/NoObjectFactory.java b/testng/src/main/java/io/cucumber/testng/NoObjectFactory.java new file mode 100644 index 0000000000..5dbea2ddfb --- /dev/null +++ b/testng/src/main/java/io/cucumber/testng/NoObjectFactory.java @@ -0,0 +1,30 @@ +package io.cucumber.testng; + +import io.cucumber.core.backend.ObjectFactory; + +/** + * This object factory does nothing. It is solely needed for marking purposes. + */ +final class NoObjectFactory implements ObjectFactory { + + private NoObjectFactory() { + // No need for instantiation + } + + @Override + public boolean addClass(Class glueClass) { + return false; + } + + @Override + public T getInstance(Class glueClass) { + return null; + } + + @Override + public void start() {} + + @Override + public void stop() {} + +} diff --git a/testng/src/main/java/io/cucumber/testng/TestNGCucumberOptionsProvider.java b/testng/src/main/java/io/cucumber/testng/TestNGCucumberOptionsProvider.java index 159da70f1e..45cc41595a 100644 --- a/testng/src/main/java/io/cucumber/testng/TestNGCucumberOptionsProvider.java +++ b/testng/src/main/java/io/cucumber/testng/TestNGCucumberOptionsProvider.java @@ -1,6 +1,7 @@ package io.cucumber.testng; import io.cucumber.core.snippets.SnippetType; +import io.cucumber.core.backend.ObjectFactory; import io.cucumber.core.options.CucumberOptionsAnnotationParser; class TestNGCucumberOptionsProvider implements CucumberOptionsAnnotationParser.OptionsProvider { @@ -10,13 +11,13 @@ public CucumberOptionsAnnotationParser.CucumberOptions getOptions(Class clazz if (annotation == null) { return null; } - return new JunitCucumberOptions(annotation); + return new TestNGCucumberOptions(annotation); } - private static class JunitCucumberOptions implements CucumberOptionsAnnotationParser.CucumberOptions { + private static class TestNGCucumberOptions implements CucumberOptionsAnnotationParser.CucumberOptions { private final CucumberOptions annotation; - JunitCucumberOptions(CucumberOptions annotation) { + TestNGCucumberOptions(CucumberOptions annotation) { this.annotation = annotation; } @@ -68,13 +69,18 @@ public String[] name() { @Override public SnippetType snippets() { switch (annotation.snippets()) { - case UNDERSCORE: - return SnippetType.UNDERSCORE; - case CAMELCASE: - return SnippetType.CAMELCASE; - default: - throw new IllegalArgumentException("" + annotation.snippets()); + case UNDERSCORE: + return SnippetType.UNDERSCORE; + case CAMELCASE: + return SnippetType.CAMELCASE; + default: + throw new IllegalArgumentException("" + annotation.snippets()); } } + + @Override + public Class objectFactory() { + return (annotation.objectFactory() == NoObjectFactory.class) ? null : annotation.objectFactory(); + } } } diff --git a/testng/src/test/java/io/cucumber/testng/TestNGCucumberOptionsProviderTest.java b/testng/src/test/java/io/cucumber/testng/TestNGCucumberOptionsProviderTest.java new file mode 100644 index 0000000000..a2d8fdfd31 --- /dev/null +++ b/testng/src/test/java/io/cucumber/testng/TestNGCucumberOptionsProviderTest.java @@ -0,0 +1,56 @@ +package io.cucumber.testng; + + +import static org.testng.Assert.*; + +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import io.cucumber.core.backend.ObjectFactory; + + +final class TestNGCucumberOptionsProviderTest { + + private TestNGCucumberOptionsProvider optionsProvider; + + @BeforeTest + void setUp() throws Exception { + this.optionsProvider = new TestNGCucumberOptionsProvider(); + } + @Test + void testObjectFactoryWhenNotSpecified() { + io.cucumber.core.options.CucumberOptionsAnnotationParser.CucumberOptions options = this.optionsProvider.getOptions(ClassWithDefault.class); + assertNull(options.objectFactory()); + } + + @Test + void testObjectFactory() { + io.cucumber.core.options.CucumberOptionsAnnotationParser.CucumberOptions options = this.optionsProvider.getOptions(ClassWithCustomObjectFactory.class); + assertNotNull(options.objectFactory()); + assertEquals(TestObjectFactory.class, options.objectFactory()); + } + + @CucumberOptions() + private static final class ClassWithDefault {} + + @CucumberOptions(objectFactory = TestObjectFactory.class) + private static final class ClassWithCustomObjectFactory {} + + private static final class TestObjectFactory implements ObjectFactory { + @Override + public boolean addClass(Class glueClass) { + return false; + } + + @Override + public T getInstance(Class glueClass) { + return null; + } + + @Override + public void start() {} + + @Override + public void stop() {} + } +} From 73286a15c7dd0b62d6c18ce548457de1191570c2 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 30 Jul 2019 23:38:25 +0200 Subject: [PATCH 152/155] [Java] Clean up hook definition tests --- .../cucumber/java/JavaHookDefinitionTest.java | 114 +++++++ .../java/io/cucumber/java/JavaHookTest.java | 285 ------------------ 2 files changed, 114 insertions(+), 285 deletions(-) create mode 100644 java/src/test/java/io/cucumber/java/JavaHookDefinitionTest.java delete mode 100644 java/src/test/java/io/cucumber/java/JavaHookTest.java diff --git a/java/src/test/java/io/cucumber/java/JavaHookDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaHookDefinitionTest.java new file mode 100644 index 0000000000..4d8bdd1e68 --- /dev/null +++ b/java/src/test/java/io/cucumber/java/JavaHookDefinitionTest.java @@ -0,0 +1,114 @@ +package io.cucumber.java; + +import io.cucumber.core.api.Scenario; +import io.cucumber.core.backend.Lookup; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +import java.lang.reflect.Method; +import java.util.List; + +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.quality.Strictness.STRICT_STUBS; + +public class JavaHookDefinitionTest { + + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule().strictness(STRICT_STUBS); + + private final Lookup lookup = new Lookup() { + + @Override + @SuppressWarnings("unchecked") + public T getInstance(Class glueClass) { + return (T) JavaHookDefinitionTest.this; + } + }; + + @Mock + private Scenario scenario; + + private boolean invoked = false; + + @Test + public void can_create_with_no_argument() throws Throwable { + Method method = JavaHookDefinitionTest.class.getMethod("no_arguments"); + JavaHookDefinition definition = new JavaHookDefinition(method, "", 0, 0, lookup); + definition.execute(scenario); + assertTrue(invoked); + } + + + @Before + public void no_arguments() { + invoked = true; + } + + @Test + public void can_create_with_single_scenario_argument() throws Throwable { + Method method = JavaHookDefinitionTest.class.getMethod("single_argument", Scenario.class); + JavaHookDefinition definition = new JavaHookDefinition(method, "", 0, 0, lookup); + definition.execute(scenario); + assertTrue(invoked); + } + + @Before + public void single_argument(Scenario scenario) { + invoked = true; + } + + @Test + public void fails_if_hook_argument_is_not_scenario_result() throws NoSuchMethodException { + Method method = JavaHookDefinitionTest.class.getMethod("invalid_parameter", String.class); + InvalidMethodSignatureException exception = assertThrows( + InvalidMethodSignatureException.class, + () -> new JavaHookDefinition(method, "", 0, 0, lookup) + ); + assertThat(exception.getMessage(), startsWith("" + + "A method annotated with Before, After, BeforeStep or AfterStep must have one of these signatures:\n" + + " * public void before_or_after(Scenario scenario)\n" + + " * public void before_or_after()\n" + + "at io.cucumber.java.JavaHookTest.invalid_parameter(String) in file:")); + } + + + public void invalid_parameter(String badType) { + + } + + @Test + public void fails_if_generic_hook_argument_is_not_scenario_result() throws NoSuchMethodException { + Method method = JavaHookDefinitionTest.class.getMethod("invalid_generic_parameter", List.class); + assertThrows( + InvalidMethodSignatureException.class, + () -> new JavaHookDefinition(method, "", 0, 0, lookup) + ); + } + + + public void invalid_generic_parameter(List badType) { + + } + + @Test + public void fails_if_too_many_arguments() throws NoSuchMethodException { + Method method = JavaHookDefinitionTest.class.getMethod("too_many_parameters", Scenario.class, String.class); + assertThrows( + InvalidMethodSignatureException.class, + () -> new JavaHookDefinition(method, "", 0, 0, lookup) + ); + } + + + public void too_many_parameters(Scenario arg1, String arg2) { + + } + + +} diff --git a/java/src/test/java/io/cucumber/java/JavaHookTest.java b/java/src/test/java/io/cucumber/java/JavaHookTest.java deleted file mode 100644 index cbe20ae624..0000000000 --- a/java/src/test/java/io/cucumber/java/JavaHookTest.java +++ /dev/null @@ -1,285 +0,0 @@ -package io.cucumber.java; - -import gherkin.pickles.PickleLocation; -import gherkin.pickles.PickleTag; -import io.cucumber.core.api.Scenario; -import io.cucumber.core.backend.Glue; -import io.cucumber.core.io.ClassFinder; -import io.cucumber.core.io.MultiLoader; -import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.io.ResourceLoaderClassFinder; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.mockito.ArgumentMatcher; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -import java.lang.reflect.Method; -import java.util.Collections; -import java.util.List; - -import static java.util.Arrays.asList; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.startsWith; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.AdditionalMatchers.not; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.quality.Strictness.STRICT_STUBS; - -public class JavaHookTest { - - private final PickleTag pickleTagBar = new PickleTag(mock(PickleLocation.class), "@bar"); - private final PickleTag pickleTagZap = new PickleTag(mock(PickleLocation.class), "@zap"); - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule().strictness(STRICT_STUBS); - - @Rule - public ExpectedException expectedException = ExpectedException.none(); - - private static final Method BEFORE; - private static final Method AFTER; - private static final Method BEFORESTEP; - private static final Method AFTERSTEP; - private static final Method BAD_AFTER; - private static final Method BAD_GENERIC_AFTER; - private static final Method BAD_MULTIPLE; - private static final Method SINGLE_ARG; - private static final Method ZERO_ARG; - - static { - try { - BEFORE = HasHooks.class.getMethod("before"); - AFTER = HasHooks.class.getMethod("after"); - BEFORESTEP = HasHooks.class.getMethod("beforeStep"); - AFTERSTEP = HasHooks.class.getMethod("afterStep"); - BAD_AFTER = BadHook.class.getMethod("after", String.class); - BAD_GENERIC_AFTER = BadGenericHook.class.getMethod("after", List.class); - BAD_MULTIPLE = BadHookMultipleArgs.class.getMethod("after", Scenario.class, String.class); - SINGLE_ARG = SingleArg.class.getMethod("after", Scenario.class); - ZERO_ARG = ZeroArg.class.getMethod("after"); - } catch (NoSuchMethodException e) { - throw new IllegalStateException(e); - } - } - - @Mock - private Glue glue; - - private final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - private final ResourceLoader resourceLoader = new MultiLoader(classLoader); - private final ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - private final SingletonFactory objectFactory = new SingletonFactory(); - private final JavaBackend backend = new JavaBackend(objectFactory, objectFactory, classFinder); - - @org.junit.Before - public void createBackendAndLoadNoGlue() { - backend.loadGlue(glue, Collections.emptyList()); - } - - @Test - public void before_hooks_get_registered() { - objectFactory.setInstance(new HasHooks()); - backend.addHook(BEFORE.getAnnotation(Before.class), BEFORE); - - verify(glue).addBeforeHook(argThat(isHookFor(BEFORE))); - } - - private static ArgumentMatcher isHookFor(final Method method) { - return javaHookDefinition -> method.equals(javaHookDefinition.getMethod()); - } - - @Test - public void before_step_hooks_get_registered() { - objectFactory.setInstance(new HasHooks()); - backend.addHook(BEFORESTEP.getAnnotation(BeforeStep.class), BEFORESTEP); - - verify(glue).addBeforeStepHook(argThat(isHookFor(BEFORESTEP))); - } - - @Test - public void after_step_hooks_get_registered() { - objectFactory.setInstance(new HasHooks()); - backend.addHook(AFTERSTEP.getAnnotation(AfterStep.class), AFTERSTEP); - verify(glue).addAfterStepHook(argThat(isHookFor(AFTERSTEP))); - } - - @Test - public void after_hooks_get_registered() { - objectFactory.setInstance(new HasHooks()); - backend.buildWorld(); - backend.addHook(AFTER.getAnnotation(After.class), AFTER); - verify(glue).addAfterHook(argThat(isHookFor(AFTER))); - - } - - @Test - public void hook_order_gets_registered() { - objectFactory.setInstance(new HasHooks()); - backend.addHook(AFTER.getAnnotation(After.class), AFTER); - verify(glue).addAfterHook(argThat(isHookWithOrder(1))); - - } - - private static ArgumentMatcher isHookWithOrder(final int order) { - return argument -> argument.getOrder() == order; - } - - @Test - public void hook_with_no_order_is_last() { - objectFactory.setInstance(new HasHooks()); - backend.buildWorld(); - backend.addHook(BEFORE.getAnnotation(Before.class), BEFORE); - verify(glue).addBeforeHook(argThat(isHookWithOrder(10000))); - } - - @Test - public void matches_matching_tags() { - objectFactory.setInstance(new HasHooks()); - backend.addHook(BEFORE.getAnnotation(Before.class), BEFORE); - verify(glue).addBeforeHook(argThat(isHookThatMatches(pickleTagBar, pickleTagZap))); - } - - private static ArgumentMatcher isHookThatMatches(final PickleTag... pickleTag) { - return argument -> argument.matches(asList(pickleTag)); - } - - @Test - public void does_not_match_non_matching_tags() { - objectFactory.setInstance(new HasHooks()); - backend.addHook(BEFORE.getAnnotation(Before.class), BEFORE); - verify(glue).addBeforeHook(not(argThat(isHookThatMatches(pickleTagBar)))); - } - - public static class HasHooks { - - @Before("(@foo or @bar) and @zap") - public void before() { - - } - - @BeforeStep - public void beforeStep() { - - } - - @AfterStep - public void afterStep() { - - } - - @After(order = 1) - public void after() { - - } - } - - @Test - public void fails_if_hook_argument_is_not_scenario_result() { - objectFactory.setInstance(new BadHook()); - InvalidMethodSignatureException cucumberException = assertThrows( - InvalidMethodSignatureException.class, - () -> backend.addHook(BAD_AFTER.getAnnotation(After.class), BAD_AFTER) - ); - assertThat(cucumberException.getMessage(), startsWith("" + - "A method annotated with Before, After, BeforeStep or AfterStep must have one of these signatures:\n" + - " * public void before_or_after(Scenario scenario)\n" + - " * public void before_or_after()\n" + - "at io.cucumber.java.JavaHookTest$BadHook.after(String) in file:")); - } - - public static class BadHook { - @After - public void after(String badType) { - - } - } - - @Test - public void fails_if_generic_hook_argument_is_not_scenario_result() { - objectFactory.setInstance(new BadGenericHook()); - InvalidMethodSignatureException exception = assertThrows( - InvalidMethodSignatureException.class, - () -> backend.addHook(BAD_GENERIC_AFTER.getAnnotation(After.class), BAD_GENERIC_AFTER) - ); - assertThat(exception.getMessage(), startsWith("" + - "A method annotated with Before, After, BeforeStep or AfterStep must have one of these signatures:\n" + - " * public void before_or_after(Scenario scenario)\n" + - " * public void before_or_after()\n" + - "at io.cucumber.java.JavaHookTest$BadGenericHook.after(List) in file:")); - } - - public static class BadGenericHook { - @After - public void after(List badType) { - - } - } - - @Test - public void fails_if_too_many_arguments() { - objectFactory.setInstance(new BadGenericHook()); - InvalidMethodSignatureException exception = assertThrows( - InvalidMethodSignatureException.class, - () -> backend.addHook(BAD_MULTIPLE.getAnnotation(After.class), BAD_MULTIPLE) - ); - assertThat(exception.getMessage(), startsWith("" + - "A method annotated with Before, After, BeforeStep or AfterStep must have one of these signatures:\n" + - " * public void before_or_after(Scenario scenario)\n" + - " * public void before_or_after()\n" + - "at io.cucumber.java.JavaHookTest$BadHookMultipleArgs.after(Scenario,String) in file:")); - } - - public static class BadHookMultipleArgs { - @After - public void after(Scenario arg1, String arg2) { - - } - } - - @Test - public void invokes_hook_with_zero_arguments() throws Throwable { - ZeroArg singleArg = new ZeroArg(); - SingletonFactory objectFactory = new SingletonFactory(singleArg); - JavaHookDefinition hook = new JavaHookDefinition(ZERO_ARG, "", 0, 0, objectFactory); - Scenario scenario = Mockito.mock(Scenario.class); - hook.execute(scenario); - assertTrue(objectFactory.getInstance(ZeroArg.class).invoked); - } - - public static class ZeroArg { - - boolean invoked; - - @After - public void after() { - this.invoked = true; - } - } - - @Test - public void invokes_hook_with_one_arguments() throws Throwable { - SingleArg singleArg = new SingleArg(); - SingletonFactory objectFactory = new SingletonFactory(singleArg); - JavaHookDefinition hook = new JavaHookDefinition(SINGLE_ARG, "", 0, 0, objectFactory); - Scenario scenario = Mockito.mock(Scenario.class); - hook.execute(scenario); - assertThat(objectFactory.getInstance(SingleArg.class).scenario, is(scenario)); - } - - public static class SingleArg { - - Scenario scenario; - - @After - public void after(Scenario scenario) { - this.scenario = scenario; - } - } -} From 09cc6b78f5627a75bea321711c2a136031ca97bd Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 30 Jul 2019 23:40:27 +0200 Subject: [PATCH 153/155] [Java] Clean up step definition tests --- .../cucumber/java/JavaStepDefinitionTest.java | 131 ++++-------------- 1 file changed, 28 insertions(+), 103 deletions(-) diff --git a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java index 034fb4d67e..67f359eeae 100644 --- a/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaStepDefinitionTest.java @@ -1,130 +1,55 @@ package io.cucumber.java; -import gherkin.events.PickleEvent; -import gherkin.pickles.*; -import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.event.Result; -import io.cucumber.core.event.TestStepFinished; -import io.cucumber.core.eventbus.EventBus; -import io.cucumber.core.exception.CucumberException; -import io.cucumber.core.io.MultiLoader; -import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.options.RuntimeOptions; -import io.cucumber.core.runner.AmbiguousStepDefinitionsException; -import io.cucumber.core.runner.Runner; -import io.cucumber.core.runtime.*; -import io.cucumber.java.en.Given; -import org.junit.Before; +import io.cucumber.core.backend.Lookup; import org.junit.Test; -import org.junit.jupiter.api.function.Executable; import java.lang.reflect.Method; -import java.time.Clock; -import java.util.Collections; +import java.util.Optional; -import static java.lang.Thread.currentThread; -import static java.util.Arrays.asList; +import static java.util.Arrays.stream; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.StringStartsWith.startsWith; -import static org.junit.Assert.*; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.mock; public class JavaStepDefinitionTest { - private static final Method THREE_DISABLED_MICE; - private static final Method THREE_BLIND_ANIMALS; - private static final String ENGLISH = "en"; + private final Lookup lookup = new Lookup() { - static { - try { - THREE_DISABLED_MICE = Defs.class.getMethod("threeDisabledMice", String.class); - THREE_BLIND_ANIMALS = Defs.class.getMethod("threeBlindAnimals", String.class); - } catch (NoSuchMethodException e) { - throw new IllegalStateException(e); + @Override + @SuppressWarnings("unchecked") + public T getInstance(Class glueClass) { + return (T) JavaStepDefinitionTest.this; } - } - - private final Defs defs = new Defs(); - private JavaBackend backend; - private Result latestReceivedResult; - private Runner runner; + }; - @Before - public void createBackendAndLoadNoGlue() { - ClassLoader classLoader = currentThread().getContextClassLoader(); - ResourceLoader resourceLoader = new MultiLoader(classLoader); - ObjectFactory objectFactory = new SingletonFactory(defs); - this.backend = new JavaBackend(objectFactory, objectFactory, resourceLoader); - RuntimeOptions runtimeOptions = RuntimeOptions.defaultOptions(); - EventBus bus = new TimeServiceEventBus(Clock.systemUTC()); - BackendSupplier backendSupplier = () -> asList(backend); - ObjectFactorySupplier objectFactorySupplier = () -> objectFactory; - TypeRegistryConfigurerSupplier typeRegistryConfigurerSupplier = () -> typeRegistry -> { - }; - this.runner = new ThreadLocalRunnerSupplier(runtimeOptions, bus, backendSupplier, objectFactorySupplier, typeRegistryConfigurerSupplier).get(); - - bus.registerHandlerFor(TestStepFinished.class, event -> latestReceivedResult = event.getResult()); - } + private String argument; @Test - public void throws_duplicate_when_two_stepdefs_with_same_regexp_found() { - backend.addStepDefinition(THREE_BLIND_ANIMALS.getAnnotation(Given.class), THREE_DISABLED_MICE); - backend.addStepDefinition(THREE_BLIND_ANIMALS.getAnnotation(Given.class), THREE_BLIND_ANIMALS); - - PickleTag tag = new PickleTag(mock(PickleLocation.class), "@foo"); - PickleStep step = new PickleStep("three blind mice", Collections.emptyList(), asList(mock(PickleLocation.class))); - Pickle pickle = new Pickle("pickle name", ENGLISH, asList(step), asList(tag), asList(mock(PickleLocation.class))); - PickleEvent pickleEvent = new PickleEvent("uri", pickle); - - final Executable testMethod = () -> runner.runPickle(pickleEvent); - final CucumberException expectedThrown = assertThrows(CucumberException.class, testMethod); - assertThat(expectedThrown.getMessage(), is(startsWith("Duplicate step definitions in io.cucumber.java.JavaStepDefinitionTest$Defs.threeDisabledMice(String) in file:"))); + public void can_define_step() throws Throwable { + Method method = JavaStepDefinitionTest.class.getMethod("one_string_argument", String.class); + JavaStepDefinition definition = new JavaStepDefinition(method, "three (.*) mice", 0, lookup); + definition.execute(new Object[]{"one_string_argument"}); + assertThat(argument, is("one_string_argument")); } - @Test - public void throws_ambiguous_when_two_matches_are_found() throws Throwable { - backend.addStepDefinition(THREE_DISABLED_MICE.getAnnotation(Given.class), THREE_DISABLED_MICE); - backend.addStepDefinition(THREE_BLIND_ANIMALS.getAnnotation(Given.class), THREE_BLIND_ANIMALS); - - PickleTag tag = new PickleTag(mock(PickleLocation.class), "@foo"); - PickleStep step = new PickleStep("three blind mice", Collections.emptyList(), asList(mock(PickleLocation.class))); - Pickle pickle = new Pickle("pickle name", ENGLISH, asList(step), asList(tag), asList(mock(PickleLocation.class))); - PickleEvent pickleEvent = new PickleEvent("uri", pickle); - runner.runPickle(pickleEvent); - - assertEquals(AmbiguousStepDefinitionsException.class, latestReceivedResult.getError().getClass()); + public void one_string_argument(String argument) { + this.argument = argument; } @Test - public void does_not_throw_ambiguous_when_nothing_is_ambiguous() throws Throwable { - backend.addStepDefinition(THREE_DISABLED_MICE.getAnnotation(Given.class), THREE_DISABLED_MICE); - - PickleTag tag = new PickleTag(mock(PickleLocation.class), "@foo"); - PickleStep step = new PickleStep("three blind mice", Collections.emptyList(), asList(mock(PickleLocation.class))); - Pickle pickle = new Pickle("pickle name", ENGLISH, asList(step), asList(tag), asList(mock(PickleLocation.class))); - PickleEvent pickleEvent = new PickleEvent("uri", pickle); - runner.runPickle(pickleEvent); - - assertNull(latestReceivedResult.getError()); - assertTrue(defs.foo); - assertFalse(defs.bar); + public void can_provide_location_of_step() throws Throwable { + Method method = JavaStepDefinitionTest.class.getMethod("method_throws"); + JavaStepDefinition definition = new JavaStepDefinition(method, "three (.*) mice", 0, lookup); + PendingException exception = assertThrows(PendingException.class, () -> definition.execute(new Object[0])); + Optional match = stream(exception.getStackTrace()).filter(definition::isDefinedAt).findFirst(); + StackTraceElement stackTraceElement = match.get(); + assertThat(stackTraceElement.getMethodName(), is("method_throws")); + assertThat(stackTraceElement.getClassName(), is(JavaStepDefinitionTest.class.getName())); } - public static class Defs { - public boolean foo; - public boolean bar; - - @Given(value = "three (.*) mice") - public void threeDisabledMice(String disability) { - foo = true; - } - - @Given(value = "three blind (.*)") - public void threeBlindAnimals(String animals) { - bar = true; - } + public void method_throws() { + throw new PendingException(); } + } From ac6cc73dbedcbdae4b67211fabc8c0da7a24330e Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Wed, 31 Jul 2019 00:32:47 +0200 Subject: [PATCH 154/155] [Java] Remove circular dependency between method scanner and backend --- java/src/main/groovy/annotation.java.gsp | 8 +- .../java/io/cucumber/java/GlueAdaptor.java | 82 ++++++++ .../cucumber/java/InvalidMethodException.java | 4 - .../java/io/cucumber/java/JavaBackend.java | 89 ++------- .../java/JavaBackendProviderService.java | 1 - .../io/cucumber/java/JavaHookDefinition.java | 4 - .../io/cucumber/java/JavaParameterInfo.java | 5 - .../java/io/cucumber/java/MethodScanner.java | 95 ++++----- ...ion.java => StepDefinitionAnnotation.java} | 2 +- ...ns.java => StepDefinitionAnnotations.java} | 2 +- .../java/AbstractGlueDefinitionTest.java | 37 ++++ .../io/cucumber/java/GlueAdaptorTest.java | 186 ++++++++++++++++++ .../cucumber/java/JavaHookDefinitionTest.java | 2 +- .../io/cucumber/java/MethodScannerTest.java | 71 +++---- 14 files changed, 381 insertions(+), 207 deletions(-) create mode 100644 java/src/main/java/io/cucumber/java/GlueAdaptor.java rename java/src/main/java/io/cucumber/java/{StepDefAnnotation.java => StepDefinitionAnnotation.java} (88%) rename java/src/main/java/io/cucumber/java/{StepDefAnnotations.java => StepDefinitionAnnotations.java} (87%) create mode 100644 java/src/test/java/io/cucumber/java/AbstractGlueDefinitionTest.java create mode 100644 java/src/test/java/io/cucumber/java/GlueAdaptorTest.java diff --git a/java/src/main/groovy/annotation.java.gsp b/java/src/main/groovy/annotation.java.gsp index 4802adf989..f1ff53cd21 100644 --- a/java/src/main/groovy/annotation.java.gsp +++ b/java/src/main/groovy/annotation.java.gsp @@ -1,7 +1,7 @@ package io.cucumber.java.${lang}; -import io.cucumber.java.StepDefAnnotation; -import io.cucumber.java.StepDefAnnotations; +import io.cucumber.java.StepDefinitionAnnotations; +import io.cucumber.java.StepDefinitionAnnotation; import org.apiguardian.api.API; @@ -31,7 +31,7 @@ import java.lang.annotation.Target; */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) -@StepDefAnnotation +@StepDefinitionAnnotation @Documented @Repeatable(${kw}.${kw}s.class) @API(status = API.Status.STABLE) @@ -63,7 +63,7 @@ public @interface ${kw} { */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) - @StepDefAnnotations + @StepDefinitionAnnotations @Documented @interface ${kw}s { ${kw}[] value(); diff --git a/java/src/main/java/io/cucumber/java/GlueAdaptor.java b/java/src/main/java/io/cucumber/java/GlueAdaptor.java new file mode 100644 index 0000000000..523f7ac651 --- /dev/null +++ b/java/src/main/java/io/cucumber/java/GlueAdaptor.java @@ -0,0 +1,82 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.Glue; +import io.cucumber.core.backend.Lookup; +import io.cucumber.core.runtime.Invoker; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; + +final class GlueAdaptor { + + private final Lookup lookup; + private final Glue glue; + + GlueAdaptor(Lookup lookup, Glue glue) { + this.lookup = lookup; + this.glue = glue; + } + + void addDefinition(Method method, Annotation annotation) { + if (annotation.annotationType().getAnnotation(StepDefinitionAnnotation.class) != null) { + String expression = expression(annotation); + long timeoutMillis = timeoutMillis(annotation); + glue.addStepDefinition(new JavaStepDefinition(method, expression, timeoutMillis, lookup)); + } else if (annotation.annotationType().equals(Before.class)) { + Before before = (Before) annotation; + String tagExpression = before.value(); + long timeout = before.timeout(); + glue.addBeforeHook(new JavaHookDefinition(method, tagExpression, before.order(), timeout, lookup)); + } else if (annotation.annotationType().equals(After.class)) { + After after = (After) annotation; + String tagExpression = after.value(); + long timeout = after.timeout(); + glue.addAfterHook(new JavaHookDefinition(method, tagExpression, after.order(), timeout, lookup)); + } else if (annotation.annotationType().equals(BeforeStep.class)) { + BeforeStep beforeStep = (BeforeStep) annotation; + String tagExpression = beforeStep.value(); + long timeout = beforeStep.timeout(); + glue.addBeforeStepHook(new JavaHookDefinition(method, tagExpression, beforeStep.order(), timeout, lookup)); + } else if (annotation.annotationType().equals(AfterStep.class)) { + AfterStep afterStep = (AfterStep) annotation; + String tagExpression = afterStep.value(); + long timeout = afterStep.timeout(); + glue.addAfterStepHook(new JavaHookDefinition(method, tagExpression, afterStep.order(), timeout, lookup)); + } else if (annotation.annotationType().equals(ParameterType.class)) { + ParameterType parameterType = (ParameterType) annotation; + String pattern = parameterType.value(); + String name = parameterType.name(); + boolean useForSnippets = parameterType.useForSnippets(); + boolean preferForRegexMatch = parameterType.preferForRegexMatch(); + glue.addParameterType(new JavaParameterTypeDefinition(name, pattern, method, useForSnippets, preferForRegexMatch, lookup)); + } else if (annotation.annotationType().equals(DataTableType.class)) { + glue.addDataTableType(new JavaDataTableTypeDefinition(method, lookup)); + } else if (annotation.annotationType().equals(DefaultParameterTransformer.class)) { + glue.addDefaultParameterTransformer(new JavaDefaultParameterTransformerDefinition(method, lookup)); + } else if (annotation.annotationType().equals(DefaultDataTableEntryTransformer.class)) { + glue.addDefaultDataTableEntryTransformer(new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); + } else if (annotation.annotationType().equals(DefaultDataTableCellTransformer.class)) { + glue.addDefaultDataTableCellTransformer(new JavaDefaultDataTableCellTransformerDefinition(method, lookup)); + } + } + + private static String expression(Annotation annotation) { + try { + Method expressionMethod = annotation.getClass().getMethod("value"); + return (String) Invoker.invoke(annotation, expressionMethod, 0); + } catch (Throwable e) { + throw new IllegalStateException(e); + } + } + + private static long timeoutMillis(Annotation annotation) { + try { + Method regexpMethod = annotation.getClass().getMethod("timeout"); + return (Long) Invoker.invoke(annotation, regexpMethod, 0); + } catch (Throwable throwable) { + throw new IllegalStateException(throwable); + } + } + + +} diff --git a/java/src/main/java/io/cucumber/java/InvalidMethodException.java b/java/src/main/java/io/cucumber/java/InvalidMethodException.java index e1765b524a..a5b3f16a1d 100644 --- a/java/src/main/java/io/cucumber/java/InvalidMethodException.java +++ b/java/src/main/java/io/cucumber/java/InvalidMethodException.java @@ -16,8 +16,4 @@ static InvalidMethodException createInvalidMethodException(Method method, Class< + glueCodeClass + " extends " + method.getDeclaringClass()); } - static InvalidMethodException createMethodDeclaringClassNotAssignableFromGlue(Method method, Class glueCodeClass) { - return new InvalidMethodException(method.getDeclaringClass() + " isn't assignable from " + glueCodeClass); - } - } diff --git a/java/src/main/java/io/cucumber/java/JavaBackend.java b/java/src/main/java/io/cucumber/java/JavaBackend.java index 65ca77ed6d..85558eed8b 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackend.java +++ b/java/src/main/java/io/cucumber/java/JavaBackend.java @@ -4,15 +4,11 @@ import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Glue; import io.cucumber.core.backend.Lookup; -import io.cucumber.core.exception.CucumberException; import io.cucumber.core.io.ClassFinder; import io.cucumber.core.io.ResourceLoader; import io.cucumber.core.io.ResourceLoaderClassFinder; -import io.cucumber.core.runtime.Invoker; import io.cucumber.core.snippets.Snippet; -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; import java.net.URI; import java.util.List; @@ -22,9 +18,7 @@ final class JavaBackend implements Backend { private final Lookup lookup; private final Container container; - - private final MethodScanner methodScanner; - private Glue glue; + private final ClassFinder classFinder; JavaBackend(Lookup lookup, Container container, ResourceLoader resourceLoader) { this(lookup, container, new ResourceLoaderClassFinder(resourceLoader, currentThread().getContextClassLoader())); @@ -33,14 +27,20 @@ final class JavaBackend implements Backend { JavaBackend(Lookup lookup, Container container, ClassFinder classFinder) { this.lookup = lookup; this.container = container; - this.methodScanner = new MethodScanner(classFinder); + this.classFinder = classFinder; } @Override public void loadGlue(Glue glue, List gluePaths) { - this.glue = glue; - // Scan for Java7 style glue (annotated methods) - methodScanner.scan(this, gluePaths); + GlueAdaptor glueAdaptor = new GlueAdaptor(lookup, glue); + for (URI gluePath : gluePaths) { + for (Class glueCodeClass : classFinder.getDescendants(Object.class, gluePath)) { + MethodScanner.scan(glueCodeClass, (method, annotation) -> { + container.addClass(method.getDeclaringClass()); + glueAdaptor.addDefinition(method, annotation); + }); + } + } } @Override @@ -57,71 +57,4 @@ public void disposeWorld() { public Snippet getSnippet() { return new JavaSnippet(); } - - void addStepDefinition(Annotation annotation, Method method) { - String expression = expression(annotation); - long timeoutMillis = timeoutMillis(annotation); - container.addClass(method.getDeclaringClass()); - glue.addStepDefinition(new JavaStepDefinition(method, expression, timeoutMillis, lookup)); - } - - void addHook(Annotation annotation, Method method) { - if (container.addClass(method.getDeclaringClass())) { - if (annotation.annotationType().equals(Before.class)) { - Before before = (Before) annotation; - String tagExpression = before.value(); - long timeout = before.timeout(); - glue.addBeforeHook(new JavaHookDefinition(method, tagExpression, before.order(), timeout, lookup)); - } else if (annotation.annotationType().equals(After.class)) { - After after = (After) annotation; - String tagExpression = after.value(); - long timeout = after.timeout(); - glue.addAfterHook(new JavaHookDefinition(method, tagExpression, after.order(), timeout, lookup)); - } else if (annotation.annotationType().equals(BeforeStep.class)) { - BeforeStep beforeStep = (BeforeStep) annotation; - String tagExpression = beforeStep.value(); - long timeout = beforeStep.timeout(); - glue.addBeforeStepHook(new JavaHookDefinition(method, tagExpression, beforeStep.order(), timeout, lookup)); - } else if (annotation.annotationType().equals(AfterStep.class)) { - AfterStep afterStep = (AfterStep) annotation; - String tagExpression = afterStep.value(); - long timeout = afterStep.timeout(); - glue.addAfterStepHook(new JavaHookDefinition(method, tagExpression, afterStep.order(), timeout, lookup)); - } else if (annotation.annotationType().equals(ParameterType.class)) { - ParameterType parameterType = (ParameterType) annotation; - String pattern = parameterType.value(); - String name = parameterType.name(); - boolean useForSnippets = parameterType.useForSnippets(); - boolean preferForRegexMatch = parameterType.preferForRegexMatch(); - glue.addParameterType(new JavaParameterTypeDefinition(name, pattern, method, useForSnippets, preferForRegexMatch, lookup)); - } else if (annotation.annotationType().equals(DataTableType.class)) { - glue.addDataTableType(new JavaDataTableTypeDefinition(method, lookup)); - } else if (annotation.annotationType().equals(DefaultParameterTransformer.class)) { - glue.addDefaultParameterTransformer(new JavaDefaultParameterTransformerDefinition(method, lookup)); - } else if (annotation.annotationType().equals(DefaultDataTableEntryTransformer.class)) { - glue.addDefaultDataTableEntryTransformer(new JavaDefaultDataTableEntryTransformerDefinition(method, lookup)); - } else if (annotation.annotationType().equals(DefaultDataTableCellTransformer.class)) { - glue.addDefaultDataTableCellTransformer(new JavaDefaultDataTableCellTransformerDefinition(method, lookup)); - } - } - } - - private String expression(Annotation annotation) { - try { - Method expressionMethod = annotation.getClass().getMethod("value"); - return (String) Invoker.invoke(annotation, expressionMethod, 0); - } catch (Throwable e) { - throw new CucumberException(e); - } - } - - private long timeoutMillis(Annotation annotation) { - try { - Method regexpMethod = annotation.getClass().getMethod("timeout"); - return (Long) Invoker.invoke(annotation, regexpMethod, 0); - } catch (Throwable throwable) { - throw new CucumberException(throwable); - } - } - } diff --git a/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java b/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java index 8e34c771ef..80d811203d 100644 --- a/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java +++ b/java/src/main/java/io/cucumber/java/JavaBackendProviderService.java @@ -5,7 +5,6 @@ import io.cucumber.core.backend.Container; import io.cucumber.core.backend.Lookup; import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.stepexpression.TypeRegistry; public final class JavaBackendProviderService implements BackendProviderService { diff --git a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java index 7d98921a92..6b825d7aea 100644 --- a/java/src/main/java/io/cucumber/java/JavaHookDefinition.java +++ b/java/src/main/java/io/cucumber/java/JavaHookDefinition.java @@ -27,10 +27,6 @@ final class JavaHookDefinition extends AbstractGlueDefinition implements HookDef this.lookup = lookup; } - Method getMethod() { - return method; - } - private static Method requireValidMethod(Method method) { Class[] parameterTypes = method.getParameterTypes(); if (parameterTypes.length > 1) { diff --git a/java/src/main/java/io/cucumber/java/JavaParameterInfo.java b/java/src/main/java/io/cucumber/java/JavaParameterInfo.java index 51064a9ccf..2754be58e1 100644 --- a/java/src/main/java/io/cucumber/java/JavaParameterInfo.java +++ b/java/src/main/java/io/cucumber/java/JavaParameterInfo.java @@ -50,9 +50,4 @@ public TypeResolver getTypeResolver() { return () -> type; } - @Override - public String toString() { - return type.toString(); - } - } diff --git a/java/src/main/java/io/cucumber/java/MethodScanner.java b/java/src/main/java/io/cucumber/java/MethodScanner.java index a5305f54d7..e93deeb9c7 100644 --- a/java/src/main/java/io/cucumber/java/MethodScanner.java +++ b/java/src/main/java/io/cucumber/java/MethodScanner.java @@ -1,86 +1,59 @@ package io.cucumber.java; -import io.cucumber.core.reflection.Reflections; import io.cucumber.core.runtime.Invoker; -import io.cucumber.core.io.ClassFinder; -import io.cucumber.core.exception.CucumberException; import java.lang.annotation.Annotation; import java.lang.reflect.Method; -import java.net.URI; -import java.util.List; +import java.util.function.BiConsumer; +import static io.cucumber.core.reflection.Reflections.isInstantiable; import static io.cucumber.java.InvalidMethodException.createInvalidMethodException; -import static io.cucumber.java.InvalidMethodException.createMethodDeclaringClassNotAssignableFromGlue; final class MethodScanner { - private final ClassFinder classFinder; - - MethodScanner(ClassFinder classFinder) { - this.classFinder = classFinder; + private MethodScanner() { } - /** - * Registers step definitions and hooks. - * - * @param javaBackend the backend where steps and hooks will be registered - * @param gluePaths where to look - */ - void scan(JavaBackend javaBackend, List gluePaths) { - for (URI gluePath : gluePaths) { - for (Class glueCodeClass : classFinder.getDescendants(Object.class, gluePath)) { - while (glueCodeClass != null && glueCodeClass != Object.class && !Reflections.isInstantiable(glueCodeClass)) { - // those can't be instantiated without container class present. - glueCodeClass = glueCodeClass.getSuperclass(); - } - //prevent unnecessary checking of Object methods - if (glueCodeClass != null && glueCodeClass != Object.class) { - for (Method method : glueCodeClass.getMethods()) { - if (method.getDeclaringClass() != Object.class) { - scan(javaBackend, method, glueCodeClass); - } - } - } - } + static void scan(Class aClass, BiConsumer consumer) { + // prevent unnecessary checking of Object methods + if (Object.class.equals(aClass)) { + return; + } + + if (!isInstantiable(aClass)) { + return; + } + for (Method method : aClass.getMethods()) { + scan(consumer, aClass, method); } } - /** - * Registers step definitions and hooks. - * - * @param javaBackend the backend where steps and hooks will be registered. - * @param method a candidate for being a stepdef or hook. - * @param glueCodeClass the class where the method is declared. - */ - void scan(JavaBackend javaBackend, Method method, Class glueCodeClass) { - scan(javaBackend, method, glueCodeClass, method.getAnnotations()); + private static void scan(BiConsumer consumer, Class aClass, Method method) { + //prevent unnecessary checking of Object methods + if (Object.class.equals(method.getDeclaringClass())) { + return; + } + scan(consumer, aClass, method, method.getAnnotations()); } - private void scan(JavaBackend javaBackend, Method method, Class glueCodeClass, Annotation[] methodAnnotations) { + private static void scan(BiConsumer consumer, Class aClass, Method method, Annotation[] methodAnnotations) { for (Annotation annotation : methodAnnotations) { - if (isHookAnnotation(annotation)) { - validateMethod(method, glueCodeClass); - javaBackend.addHook(annotation, method); - } else if (isStepdefAnnotation(annotation)) { - validateMethod(method, glueCodeClass); - javaBackend.addStepDefinition(annotation, method); - } else if (isRepeatedStepdefAnnotation(annotation)) { - scan(javaBackend, method, glueCodeClass, repeatedAnnotations(annotation)); + if (isHookAnnotation(annotation) || isStepDefinitionAnnotation(annotation)) { + validateMethod(aClass, method); + consumer.accept(method, annotation); + } else if (isRepeatedStepDefinitionAnnotation(annotation)) { + scan(consumer, aClass, method, repeatedAnnotations(annotation)); } } } - private void validateMethod(Method method, Class glueCodeClass) { - if (!method.getDeclaringClass().isAssignableFrom(glueCodeClass)) { - throw createMethodDeclaringClassNotAssignableFromGlue(method, glueCodeClass); - } + private static void validateMethod(Class glueCodeClass, Method method) { if (!glueCodeClass.equals(method.getDeclaringClass())) { throw createInvalidMethodException(method, glueCodeClass); } } - private boolean isHookAnnotation(Annotation annotation) { + private static boolean isHookAnnotation(Annotation annotation) { Class annotationClass = annotation.annotationType(); return annotationClass.equals(Before.class) || annotationClass.equals(After.class) @@ -94,23 +67,23 @@ private boolean isHookAnnotation(Annotation annotation) { ; } - private boolean isStepdefAnnotation(Annotation annotation) { + private static boolean isStepDefinitionAnnotation(Annotation annotation) { Class annotationClass = annotation.annotationType(); - return annotationClass.getAnnotation(StepDefAnnotation.class) != null; + return annotationClass.getAnnotation(StepDefinitionAnnotation.class) != null; } - private boolean isRepeatedStepdefAnnotation(Annotation annotation) { + private static boolean isRepeatedStepDefinitionAnnotation(Annotation annotation) { Class annotationClass = annotation.annotationType(); - return annotationClass.getAnnotation(StepDefAnnotations.class) != null; + return annotationClass.getAnnotation(StepDefinitionAnnotations.class) != null; } - private Annotation[] repeatedAnnotations(Annotation annotation) { + private static Annotation[] repeatedAnnotations(Annotation annotation) { try { Method expressionMethod = annotation.getClass().getMethod("value"); return (Annotation[]) Invoker.invoke(annotation, expressionMethod, 0); } catch (Throwable e) { - throw new CucumberException(e); + throw new IllegalStateException(e); } } diff --git a/java/src/main/java/io/cucumber/java/StepDefAnnotation.java b/java/src/main/java/io/cucumber/java/StepDefinitionAnnotation.java similarity index 88% rename from java/src/main/java/io/cucumber/java/StepDefAnnotation.java rename to java/src/main/java/io/cucumber/java/StepDefinitionAnnotation.java index dbb8db8c8f..ca63b55e78 100644 --- a/java/src/main/java/io/cucumber/java/StepDefAnnotation.java +++ b/java/src/main/java/io/cucumber/java/StepDefinitionAnnotation.java @@ -10,5 +10,5 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) @API(status = API.Status.INTERNAL) -public @interface StepDefAnnotation { +public @interface StepDefinitionAnnotation { } diff --git a/java/src/main/java/io/cucumber/java/StepDefAnnotations.java b/java/src/main/java/io/cucumber/java/StepDefinitionAnnotations.java similarity index 87% rename from java/src/main/java/io/cucumber/java/StepDefAnnotations.java rename to java/src/main/java/io/cucumber/java/StepDefinitionAnnotations.java index 093fc599cd..69c2b1a5c4 100644 --- a/java/src/main/java/io/cucumber/java/StepDefAnnotations.java +++ b/java/src/main/java/io/cucumber/java/StepDefinitionAnnotations.java @@ -10,5 +10,5 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) @API(status = API.Status.INTERNAL) -public @interface StepDefAnnotations { +public @interface StepDefinitionAnnotations { } diff --git a/java/src/test/java/io/cucumber/java/AbstractGlueDefinitionTest.java b/java/src/test/java/io/cucumber/java/AbstractGlueDefinitionTest.java new file mode 100644 index 0000000000..fd26f2d99e --- /dev/null +++ b/java/src/test/java/io/cucumber/java/AbstractGlueDefinitionTest.java @@ -0,0 +1,37 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.Lookup; +import org.junit.Test; + +import java.lang.reflect.Method; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertThat; + +public class AbstractGlueDefinitionTest { + private final Lookup lookup = new Lookup() { + + @Override + @SuppressWarnings("unchecked") + public T getInstance(Class glueClass) { + return (T) AbstractGlueDefinitionTest.this; + } + }; + + @Test + public void test() throws NoSuchMethodException { + Method method = AbstractGlueDefinitionTest.class.getMethod("method"); + + AbstractGlueDefinition definition = new AbstractGlueDefinition(method, lookup) { + }; + + assertThat(definition.getLocation(false), is("AbstractGlueDefinitionTest.method()")); + assertThat(definition.getLocation(true), startsWith("io.cucumber.java.AbstractGlueDefinitionTest.method() in ")); + + } + + public void method() { + + } +} \ No newline at end of file diff --git a/java/src/test/java/io/cucumber/java/GlueAdaptorTest.java b/java/src/test/java/io/cucumber/java/GlueAdaptorTest.java new file mode 100644 index 0000000000..cb5872675b --- /dev/null +++ b/java/src/test/java/io/cucumber/java/GlueAdaptorTest.java @@ -0,0 +1,186 @@ +package io.cucumber.java; + +import io.cucumber.core.backend.*; +import io.cucumber.java.en.Given; +import org.hamcrest.CustomTypeSafeMatcher; +import org.hamcrest.Matcher; +import org.junit.Test; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static java.util.Collections.singletonList; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; +import static org.junit.Assert.assertThat; + +public class GlueAdaptorTest { + + private final Lookup lookup = new Lookup() { + + @Override + @SuppressWarnings("unchecked") + public T getInstance(Class glueClass) { + return (T) GlueAdaptorTest.this; + } + }; + + + private final Glue container = new Glue() { + @Override + public void addStepDefinition(StepDefinition stepDefinition) { + GlueAdaptorTest.this.stepDefinitions.add(stepDefinition); + } + + @Override + public void addBeforeHook(HookDefinition beforeHook) { + GlueAdaptorTest.this.beforeHook = beforeHook; + + } + + @Override + public void addAfterHook(HookDefinition afterHook) { + GlueAdaptorTest.this.afterHook = afterHook; + + } + + @Override + public void addBeforeStepHook(HookDefinition beforeStepHook) { + GlueAdaptorTest.this.beforeStepHook = beforeStepHook; + + } + + @Override + public void addAfterStepHook(HookDefinition afterStepHook) { + GlueAdaptorTest.this.afterStepHook = afterStepHook; + + } + + @Override + public void addParameterType(ParameterTypeDefinition parameterTypeDefinition) { + GlueAdaptorTest.this.parameterTypeDefinition = parameterTypeDefinition; + + } + + @Override + public void addDataTableType(DataTableTypeDefinition dataTableTypeDefinition) { + GlueAdaptorTest.this.dataTableTypeDefinition = dataTableTypeDefinition; + + } + + @Override + public void addDefaultParameterTransformer(DefaultParameterTransformerDefinition defaultParameterTransformer) { + GlueAdaptorTest.this.defaultParameterTransformer = defaultParameterTransformer; + + } + + @Override + public void addDefaultDataTableEntryTransformer(DefaultDataTableEntryTransformerDefinition defaultDataTableEntryTransformer) { + GlueAdaptorTest.this.defaultDataTableEntryTransformer = defaultDataTableEntryTransformer; + + } + + @Override + public void addDefaultDataTableCellTransformer(DefaultDataTableCellTransformerDefinition defaultDataTableCellTransformer) { + GlueAdaptorTest.this.defaultDataTableCellTransformer = defaultDataTableCellTransformer; + + } + }; + private final GlueAdaptor adaptor = new GlueAdaptor(lookup, container); + + private final List stepDefinitions = new ArrayList<>(); + private DefaultDataTableCellTransformerDefinition defaultDataTableCellTransformer; + private DefaultDataTableEntryTransformerDefinition defaultDataTableEntryTransformer; + private DefaultParameterTransformerDefinition defaultParameterTransformer; + private DataTableTypeDefinition dataTableTypeDefinition; + private ParameterTypeDefinition parameterTypeDefinition; + private HookDefinition afterStepHook; + private HookDefinition beforeStepHook; + private HookDefinition afterHook; + private HookDefinition beforeHook; + + private final Matcher aStep = new CustomTypeSafeMatcher("a step") { + @Override + protected boolean matchesSafely(StepDefinition item) { + return item.getPattern().equals("a step"); + } + }; + private final Matcher repeated = new CustomTypeSafeMatcher("repeated") { + @Override + protected boolean matchesSafely(StepDefinition item) { + return item.getPattern().equals("repeated"); + } + }; + + @Test + public void creates_all_glue_steps() { + MethodScanner.scan(GlueAdaptorTest.class, adaptor::addDefinition); + + assertThat(stepDefinitions, containsInAnyOrder(aStep, repeated)); + assertThat(defaultDataTableCellTransformer, notNullValue()); + assertThat(defaultDataTableEntryTransformer, notNullValue()); + assertThat(defaultParameterTransformer, notNullValue()); + assertThat(dataTableTypeDefinition, notNullValue()); + assertThat(parameterTypeDefinition.parameterType().getRegexps(), is(singletonList("pattern"))); + assertThat(parameterTypeDefinition.parameterType().getName(), is("name")); + assertThat(afterStepHook, notNullValue()); + assertThat(beforeStepHook, notNullValue()); + assertThat(afterHook, notNullValue()); + assertThat(beforeHook, notNullValue()); + } + + @Given(value = "a step", timeout = 100) + @Given("repeated") + public void step_definition() { + + } + + @DefaultDataTableCellTransformer + public String default_data_table_cell_transformer(String fromValue, Type toValueType) { + return "default_data_table_cell_transformer"; + } + + @DefaultDataTableEntryTransformer + public String default_data_table_entry_transformer(Map fromValue, Type toValueType) { + return "default_data_table_entry_transformer"; + } + + @DefaultParameterTransformer + public String default_parameter_transformer(String fromValue, Type toValueTYpe) { + return "default_parameter_transformer"; + } + + @DataTableType + public String data_table_type(String fromValue) { + return "data_table_type"; + } + + @ParameterType(value = "pattern", name = "name") + public String parameter_type(String fromValue) { + return "parameter_type"; + } + + @AfterStep + public void after_step() { + + } + + @BeforeStep + public void before_step() { + + } + + @After + public void after() { + + } + + @Before + public void before() { + + } + +} \ No newline at end of file diff --git a/java/src/test/java/io/cucumber/java/JavaHookDefinitionTest.java b/java/src/test/java/io/cucumber/java/JavaHookDefinitionTest.java index 4d8bdd1e68..e3d4cdf546 100644 --- a/java/src/test/java/io/cucumber/java/JavaHookDefinitionTest.java +++ b/java/src/test/java/io/cucumber/java/JavaHookDefinitionTest.java @@ -74,7 +74,7 @@ public void fails_if_hook_argument_is_not_scenario_result() throws NoSuchMethodE "A method annotated with Before, After, BeforeStep or AfterStep must have one of these signatures:\n" + " * public void before_or_after(Scenario scenario)\n" + " * public void before_or_after()\n" + - "at io.cucumber.java.JavaHookTest.invalid_parameter(String) in file:")); + "at io.cucumber.java.JavaHookDefinitionTest.invalid_parameter(String) in file:")); } diff --git a/java/src/test/java/io/cucumber/java/MethodScannerTest.java b/java/src/test/java/io/cucumber/java/MethodScannerTest.java index b2a69f8dd0..17ce95c497 100644 --- a/java/src/test/java/io/cucumber/java/MethodScannerTest.java +++ b/java/src/test/java/io/cucumber/java/MethodScannerTest.java @@ -1,75 +1,52 @@ package io.cucumber.java; -import io.cucumber.core.backend.Glue; -import io.cucumber.core.backend.ObjectFactory; -import io.cucumber.core.io.MultiLoader; -import io.cucumber.core.io.ResourceLoader; -import io.cucumber.core.io.ResourceLoaderClassFinder; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; -import java.net.URI; -import java.util.Collections; +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.AbstractMap.SimpleEntry; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; -import static java.lang.Thread.currentThread; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.collection.IsEmptyCollection.empty; +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.junit.Assert.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; public class MethodScannerTest { - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Mock - private ObjectFactory factory; - - private ResourceLoaderClassFinder classFinder; - private JavaBackend backend; + private final List> scanResult = new ArrayList<>(); + private BiConsumer backend = (method, annotation) -> + scanResult.add(new SimpleEntry<>(method, annotation)); @Before public void createBackend() { - ClassLoader classLoader = currentThread().getContextClassLoader(); - ResourceLoader resourceLoader = new MultiLoader(classLoader); - this.classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader); - this.backend = new JavaBackend(factory, factory, classFinder); + } @Test - public void loadGlue_registers_the_methods_declaring_class_in_the_object_factory() throws NoSuchMethodException { - MethodScanner methodScanner = new MethodScanner(classFinder); - Glue world = Mockito.mock(Glue.class); - backend.loadGlue(world, Collections.emptyList()); - - // this delegates to methodScanner.scan which we test - methodScanner.scan(backend, BaseStepDefs.class.getMethod("m"), BaseStepDefs.class); - - verify(factory, times(1)).addClass(BaseStepDefs.class); - verifyNoMoreInteractions(factory); + public void scan_finds_annotated_methods() throws NoSuchMethodException { + Method method = BaseStepDefs.class.getMethod("m"); + MethodScanner.scan(BaseStepDefs.class, backend); + assertThat(scanResult, contains(new SimpleEntry<>(method, method.getAnnotations()[0]))); } @Test - public void loadGlue_fails_when_class_is_not_method_declaring_class() throws NoSuchMethodException { - MethodScanner methodScanner = new MethodScanner(classFinder); - InvalidMethodException exception = assertThrows(InvalidMethodException.class, () -> methodScanner.scan(backend, BaseStepDefs.class.getMethod("m"), Stepdefs2.class)); - assertThat(exception.getMessage(), is( - "You're not allowed to extend classes that define Step Definitions or hooks. " + - "class io.cucumber.java.MethodScannerTest$Stepdefs2 extends class io.cucumber.java.MethodScannerTest$BaseStepDefs" - )); + public void scan_ignores_object() throws NoSuchMethodException { + MethodScanner.scan(Object.class, backend); + assertThat(scanResult, empty()); } @Test - public void loadGlue_fails_when_class_is_not_subclass_of_declaring_class() throws NoSuchMethodException { - MethodScanner methodScanner = new MethodScanner(classFinder); - InvalidMethodException exception = assertThrows(InvalidMethodException.class, () -> methodScanner.scan(backend, BaseStepDefs.class.getMethod("m"), String.class)); + public void loadGlue_fails_when_class_is_not_method_declaring_class() { + InvalidMethodException exception = assertThrows(InvalidMethodException.class, () -> MethodScanner.scan(Stepdefs2.class, backend)); assertThat(exception.getMessage(), is( - "class io.cucumber.java.MethodScannerTest$BaseStepDefs isn't assignable from class java.lang.String" + "You're not allowed to extend classes that define Step Definitions or hooks. " + + "class io.cucumber.java.MethodScannerTest$Stepdefs2 extends class io.cucumber.java.MethodScannerTest$BaseStepDefs" )); } From 6289e7a8580697322ddcb01487254d88f44a25c2 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Wed, 31 Jul 2019 22:26:25 +0200 Subject: [PATCH 155/155] [All] Set version to 5.0.0-SNAPSHOT --- cdi2/pom.xml | 2 +- core/pom.xml | 2 +- examples/java-calculator-testng/pom.xml | 2 +- examples/java-calculator/pom.xml | 2 +- examples/java-wicket/java-wicket-main/pom.xml | 2 +- examples/java-wicket/java-wicket-test/pom.xml | 2 +- examples/java-wicket/pom.xml | 2 +- examples/java8-calculator/pom.xml | 2 +- examples/pom.xml | 2 +- examples/spring-txn/pom.xml | 2 +- guice/pom.xml | 2 +- java/pom.xml | 2 +- java8/pom.xml | 2 +- junit/pom.xml | 2 +- kotlin-java8/pom.xml | 2 +- needle/pom.xml | 2 +- openejb/pom.xml | 2 +- picocontainer/pom.xml | 2 +- pom.xml | 2 +- spring/pom.xml | 2 +- testng/pom.xml | 2 +- weld/pom.xml | 2 +- 22 files changed, 22 insertions(+), 22 deletions(-) diff --git a/cdi2/pom.xml b/cdi2/pom.xml index 4ed887f167..0cd9e81d71 100644 --- a/cdi2/pom.xml +++ b/cdi2/pom.xml @@ -8,7 +8,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-cdi2 diff --git a/core/pom.xml b/core/pom.xml index 4472be4869..f232c4da65 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-core diff --git a/examples/java-calculator-testng/pom.xml b/examples/java-calculator-testng/pom.xml index 88306ad008..85040c9d62 100644 --- a/examples/java-calculator-testng/pom.xml +++ b/examples/java-calculator-testng/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT java-calculator-testng diff --git a/examples/java-calculator/pom.xml b/examples/java-calculator/pom.xml index cf447080f1..253c79523e 100644 --- a/examples/java-calculator/pom.xml +++ b/examples/java-calculator/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT java-calculator diff --git a/examples/java-wicket/java-wicket-main/pom.xml b/examples/java-wicket/java-wicket-main/pom.xml index bd0ff98bd3..733198c24e 100644 --- a/examples/java-wicket/java-wicket-main/pom.xml +++ b/examples/java-wicket/java-wicket-main/pom.xml @@ -3,7 +3,7 @@ io.cucumber java-wicket - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT java-wicket-main Examples: Wicket application diff --git a/examples/java-wicket/java-wicket-test/pom.xml b/examples/java-wicket/java-wicket-test/pom.xml index 83b8bc626c..3f1ef4bc61 100644 --- a/examples/java-wicket/java-wicket-test/pom.xml +++ b/examples/java-wicket/java-wicket-test/pom.xml @@ -3,7 +3,7 @@ io.cucumber java-wicket - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT java-wicket-test Examples: Wicket application tested with Selenium diff --git a/examples/java-wicket/pom.xml b/examples/java-wicket/pom.xml index b1200ac7cd..202600c6a4 100644 --- a/examples/java-wicket/pom.xml +++ b/examples/java-wicket/pom.xml @@ -3,7 +3,7 @@ io.cucumber cucumber-examples - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT java-wicket pom diff --git a/examples/java8-calculator/pom.xml b/examples/java8-calculator/pom.xml index 62d968d66d..50083f5bc4 100644 --- a/examples/java8-calculator/pom.xml +++ b/examples/java8-calculator/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT java8-calculator diff --git a/examples/pom.xml b/examples/pom.xml index 7cdfbc4293..971b1bf0bb 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-examples diff --git a/examples/spring-txn/pom.xml b/examples/spring-txn/pom.xml index ada6da064f..7469261bd4 100644 --- a/examples/spring-txn/pom.xml +++ b/examples/spring-txn/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-examples - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT spring-txn diff --git a/guice/pom.xml b/guice/pom.xml index 6367afae89..6feac67cd0 100644 --- a/guice/pom.xml +++ b/guice/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-guice diff --git a/java/pom.xml b/java/pom.xml index 852c2373c8..4c3c6cde8d 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-java diff --git a/java8/pom.xml b/java8/pom.xml index f3f9f3d29f..d3f991d9e8 100644 --- a/java8/pom.xml +++ b/java8/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-java8 diff --git a/junit/pom.xml b/junit/pom.xml index 84857266e4..59655f09d8 100644 --- a/junit/pom.xml +++ b/junit/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-junit diff --git a/kotlin-java8/pom.xml b/kotlin-java8/pom.xml index 3026c8cbf1..ff8568b85b 100644 --- a/kotlin-java8/pom.xml +++ b/kotlin-java8/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-kotlin-java8 diff --git a/needle/pom.xml b/needle/pom.xml index cd113776b2..ac6f23ca59 100644 --- a/needle/pom.xml +++ b/needle/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-needle diff --git a/openejb/pom.xml b/openejb/pom.xml index 67948e601c..d64eccbf08 100644 --- a/openejb/pom.xml +++ b/openejb/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-openejb diff --git a/picocontainer/pom.xml b/picocontainer/pom.xml index 7fca10fa1d..aeef65f248 100644 --- a/picocontainer/pom.xml +++ b/picocontainer/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-picocontainer diff --git a/pom.xml b/pom.xml index 761cd45445..294b5d8484 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 1.0.4 cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT pom Cucumber-JVM Cucumber for the JVM diff --git a/spring/pom.xml b/spring/pom.xml index 6f653ee6eb..f174cda732 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-spring diff --git a/testng/pom.xml b/testng/pom.xml index 56423e2aca..7c7fe80479 100644 --- a/testng/pom.xml +++ b/testng/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-testng diff --git a/weld/pom.xml b/weld/pom.xml index 72b881d54a..100c740f9a 100644 --- a/weld/pom.xml +++ b/weld/pom.xml @@ -4,7 +4,7 @@ io.cucumber cucumber-jvm - 4.7.2-SNAPSHOT + 5.0.0-SNAPSHOT cucumber-weld