From c692720cf9ef7a0660cc7e3d9c44425db4930cdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?= Date: Mon, 16 Jul 2018 16:37:58 +0200 Subject: [PATCH 1/2] Adapt to the move of Location to Cucumber::Core::Test --- lib/cucumber/wire/add_hooks_filter.rb | 5 +++-- lib/cucumber/wire/protocol/requests.rb | 5 +++-- lib/cucumber/wire/step_definition.rb | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/cucumber/wire/add_hooks_filter.rb b/lib/cucumber/wire/add_hooks_filter.rb index 0573ec1..b1c2538 100644 --- a/lib/cucumber/wire/add_hooks_filter.rb +++ b/lib/cucumber/wire/add_hooks_filter.rb @@ -1,3 +1,4 @@ +# coding: utf-8 module Cucumber module Wire class AddHooksFilter < Core::Filter.new(:connections) @@ -10,13 +11,13 @@ def test_case(test_case) def before_hook(test_case) # TODO: is this dependency on Cucumber::Hooks OK? Feels a bit internal.. # TODO: how do we express the location of the hook? Should we create one hook per connection so we can use the host:port of the connection? - Cucumber::Hooks.before_hook(test_case.source, Core::Ast::Location.new('TODO:wire')) do + Cucumber::Hooks.before_hook(Core::Test::Location.new('TODO:wire')) do connections.begin_scenario(test_case) end end def after_hook(test_case) - Cucumber::Hooks.after_hook(test_case.source, Core::Ast::Location.new('TODO:wire')) do + Cucumber::Hooks.after_hook(Core::Test::Location.new('TODO:wire')) do connections.end_scenario(test_case) end end diff --git a/lib/cucumber/wire/protocol/requests.rb b/lib/cucumber/wire/protocol/requests.rb index 0e38494..eff80b0 100644 --- a/lib/cucumber/wire/protocol/requests.rb +++ b/lib/cucumber/wire/protocol/requests.rb @@ -1,3 +1,4 @@ +# coding: utf-8 require 'cucumber/wire/request_handler' require 'cucumber/step_argument' @@ -69,7 +70,7 @@ def handle_pending(message) def handle_diff!(tables) # TODO: figure out if / how we could get a location for a table from the wire (or make a null location) - location = Core::Ast::Location.new(__FILE__, __LINE__) + location = Core::Test::Location.new(__FILE__, __LINE__) table1 = table(tables[0], location) table2 = table(tables[1], location) table1.diff!(table2) @@ -89,7 +90,7 @@ def handle_diff(tables) private def table(data, location) - Cucumber::MultilineArgument.from_core(Core::Ast::DataTable.new(data, location)) + Cucumber::MultilineArgument.from_core(Core::Test::DataTable.new(data, location)) end end diff --git a/lib/cucumber/wire/step_definition.rb b/lib/cucumber/wire/step_definition.rb index 6f3b41a..09a4f1d 100644 --- a/lib/cucumber/wire/step_definition.rb +++ b/lib/cucumber/wire/step_definition.rb @@ -1,4 +1,4 @@ -require 'cucumber/core/ast/location' +require 'cucumber/core/test/location' module Cucumber module Wire @@ -9,7 +9,7 @@ def initialize(connection, data) @connection = connection @id = data['id'] @regexp_source = data['regexp'] || "Unknown" - @location = Core::Ast::Location.from_file_colon_line(data['source'] || "unknown:0") + @location = Core::Test::Location.from_file_colon_line(data['source'] || "unknown:0") end def invoke(args) From 51ff0156094757ad21b8f380e2427d5b366924fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?= Date: Sun, 22 Jul 2018 21:23:34 +0200 Subject: [PATCH 2/2] Fixes to work with modern Cucucmber-Ruby * Pass the registry all the way down to the step definitions. * Move the class StepArgument from Cucumber-Ruby and update it to match the expectations of Cucumber-Ruby when using cucumber-expressions. --- cucumber-wire.gemspec | 5 ++++- features/invoke_message.feature | 4 +--- features/step_matches_message.feature | 2 +- features/table_diffing.feature | 6 +++--- features/timeouts.feature | 2 +- lib/cucumber/wire/connections.rb | 5 +++-- lib/cucumber/wire/plugin.rb | 9 +++++---- lib/cucumber/wire/protocol.rb | 4 ++-- lib/cucumber/wire/protocol/requests.rb | 4 ++-- lib/cucumber/wire/request_handler.rb | 3 ++- lib/cucumber/wire/step_argument.rb | 24 ++++++++++++++++++++++++ lib/cucumber/wire/step_definition.rb | 6 ++++-- spec/cucumber/wire/connections_spec.rb | 4 ++-- 13 files changed, 54 insertions(+), 24 deletions(-) create mode 100644 lib/cucumber/wire/step_argument.rb diff --git a/cucumber-wire.gemspec b/cucumber-wire.gemspec index 4e9b982..cb795bf 100644 --- a/cucumber-wire.gemspec +++ b/cucumber-wire.gemspec @@ -13,7 +13,10 @@ Gem::Specification.new do |s| s.license = "MIT" s.required_ruby_version = ">= 1.9.3" - s.add_development_dependency 'cucumber', '~> 2.1.0' + s.add_dependency 'cucumber-core', '~> 3.2' + s.add_dependency 'cucumber-expressions', '~> 6.0' + + s.add_development_dependency 'cucumber', '~> 3.1' s.add_development_dependency 'bundler', '>= 1.3.5' s.add_development_dependency 'rake', '>= 0.9.2' diff --git a/features/invoke_message.feature b/features/invoke_message.feature index ad9c26d..bb63ae7 100644 --- a/features/invoke_message.feature +++ b/features/invoke_message.feature @@ -47,8 +47,6 @@ Feature: Invoke message Scenario: Wired Given we're all wired - I'll do it later (Cucumber::Pending) - features/wired.feature:3:in `Given we're all wired' 1 scenario (1 pending) 1 step (1 pending) @@ -102,7 +100,7 @@ Feature: Invoke message (::) failed steps (::) The wires are down (Some.Foreign.ExceptionType from localhost:54321) - features/wired.feature:3:in `Given we're all wired' + features/wired.feature:3:in `we're all wired' Failing Scenarios: cucumber features/wired.feature:2 # Scenario: Wired diff --git a/features/step_matches_message.feature b/features/step_matches_message.feature index b0051f8..afa70be 100644 --- a/features/step_matches_message.feature +++ b/features/step_matches_message.feature @@ -70,7 +70,7 @@ Feature: Step matches message """ - - we.* # MyApp.MyClass:123 + "we.*" # MyApp.MyClass:123 1 scenario (1 skipped) 1 step (1 skipped) diff --git a/features/table_diffing.feature b/features/table_diffing.feature index 63d7b21..87278a5 100644 --- a/features/table_diffing.feature +++ b/features/table_diffing.feature @@ -39,7 +39,7 @@ Feature: Wire protocol table diffing Not same (DifferentException from localhost:54321) a.cs:12 b.cs:34 - features/wired.feature:3:in `Given we're all wired' + features/wired.feature:3:in `we're all wired' Failing Scenarios: cucumber features/wired.feature:2 @@ -84,7 +84,7 @@ Feature: Wire protocol table diffing (::) failed steps (::) I wanted things to be different for us (Cucumber::Wire::Exception) - features/wired.feature:3:in `Given we're all wired' + features/wired.feature:3:in `we're all wired' Failing Scenarios: cucumber features/wired.feature:2 @@ -113,7 +113,7 @@ Feature: Wire protocol table diffing | (-) a | (+) b | (Cucumber::MultilineArgument::DataTable::Different) - features/wired.feature:3:in `Given we're all wired' + features/wired.feature:3:in `we're all wired' Failing Scenarios: cucumber features/wired.feature:2 diff --git a/features/timeouts.feature b/features/timeouts.feature index f05fcd5..42ffbff 100644 --- a/features/timeouts.feature +++ b/features/timeouts.feature @@ -52,7 +52,7 @@ Feature: Wire protocol timeouts Scenario: Wired Given we're all wired Timed out calling wire server with message 'invoke' (Timeout::Error) - features/wired.feature:3:in `Given we're all wired' + features/wired.feature:3:in `we're all wired' Failing Scenarios: cucumber features/wired.feature:2 diff --git a/lib/cucumber/wire/connections.rb b/lib/cucumber/wire/connections.rb index 7856fea..4e57a22 100644 --- a/lib/cucumber/wire/connections.rb +++ b/lib/cucumber/wire/connections.rb @@ -16,10 +16,11 @@ class Connections attr_reader :connections private :connections - def initialize(connections, configuration) + def initialize(connections, configuration, registry) raise ArgumentError unless connections @connections = connections @configuration = configuration + @registry = registry end def find_match(test_step) @@ -30,7 +31,7 @@ def find_match(test_step) end def step_matches(step_name) - connections.map{ |c| c.step_matches(step_name)}.flatten + connections.map{ |c| c.step_matches(step_name, @registry)}.flatten end def begin_scenario(test_case) diff --git a/lib/cucumber/wire/plugin.rb b/lib/cucumber/wire/plugin.rb index d1d6277..79843cd 100644 --- a/lib/cucumber/wire/plugin.rb +++ b/lib/cucumber/wire/plugin.rb @@ -5,15 +5,16 @@ module Cucumber module Wire class Plugin - attr_reader :config - private :config + attr_reader :config, :registry + private :config, :registry - def initialize(config) + def initialize(config, registry) @config = config + @registry = registry end def install - connections = Connections.new(wire_files.map { |f| create_connection(f) }, @config) + connections = Connections.new(wire_files.map { |f| create_connection(f) }, config, registry) config.filters << Filters::ActivateSteps.new(StepMatchSearch.new(connections.method(:step_matches), @config), @config) config.filters << AddHooksFilter.new(connections) unless @config.dry_run? config.register_snippet_generator Snippet::Generator.new(connections) diff --git a/lib/cucumber/wire/protocol.rb b/lib/cucumber/wire/protocol.rb index 328c728..738577e 100644 --- a/lib/cucumber/wire/protocol.rb +++ b/lib/cucumber/wire/protocol.rb @@ -3,8 +3,8 @@ module Cucumber module Wire module Protocol - def step_matches(name_to_match) - handler = Requests::StepMatches.new(self) + def step_matches(name_to_match, registry) + handler = Requests::StepMatches.new(self, registry) handler.execute(name_to_match) end diff --git a/lib/cucumber/wire/protocol/requests.rb b/lib/cucumber/wire/protocol/requests.rb index eff80b0..5e32d11 100644 --- a/lib/cucumber/wire/protocol/requests.rb +++ b/lib/cucumber/wire/protocol/requests.rb @@ -1,6 +1,6 @@ # coding: utf-8 require 'cucumber/wire/request_handler' -require 'cucumber/step_argument' +require 'cucumber/wire/step_argument' module Cucumber module Wire @@ -26,7 +26,7 @@ def handle_success(params) private def create_step_match(raw_step_match) - step_definition = StepDefinition.new(@connection, raw_step_match) + step_definition = StepDefinition.new(@connection, raw_step_match, @registry) step_args = raw_step_match['args'].map do |raw_arg| StepArgument.new(raw_arg['pos'], raw_arg['val']) end diff --git a/lib/cucumber/wire/request_handler.rb b/lib/cucumber/wire/request_handler.rb index ee8f2f1..118f9cd 100644 --- a/lib/cucumber/wire/request_handler.rb +++ b/lib/cucumber/wire/request_handler.rb @@ -1,9 +1,10 @@ module Cucumber module Wire class RequestHandler - def initialize(connection) + def initialize(connection, registry = nil) @connection = connection @message = underscore(self.class.name.split('::').last) + @registry = registry end def execute(request_params = nil) diff --git a/lib/cucumber/wire/step_argument.rb b/lib/cucumber/wire/step_argument.rb new file mode 100644 index 0000000..116ee3a --- /dev/null +++ b/lib/cucumber/wire/step_argument.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +require 'cucumber/cucumber_expressions/group' + +module Cucumber + module Wire + # Defines the location and value of a captured argument from the step + # text + class StepArgument + attr_reader :offset + + def initialize(offset, val) + @offset, @value = offset, val + end + + def value(_current_world) + @value + end + + def group + CucumberExpressions::Group.new(@value, @offset, @offset + @value.length, []) + end + end + end +end diff --git a/lib/cucumber/wire/step_definition.rb b/lib/cucumber/wire/step_definition.rb index 09a4f1d..b453cdc 100644 --- a/lib/cucumber/wire/step_definition.rb +++ b/lib/cucumber/wire/step_definition.rb @@ -3,12 +3,14 @@ module Cucumber module Wire class StepDefinition - attr_reader :regexp_source, :location + attr_reader :regexp_source, :location, :registry, :expression - def initialize(connection, data) + def initialize(connection, data, registry) @connection = connection + @registry = registry @id = data['id'] @regexp_source = data['regexp'] || "Unknown" + @expression = registry.create_expression(@regexp_source) @location = Core::Test::Location.from_file_colon_line(data['source'] || "unknown:0") end diff --git a/spec/cucumber/wire/connections_spec.rb b/spec/cucumber/wire/connections_spec.rb index 449e19f..62c9f1a 100644 --- a/spec/cucumber/wire/connections_spec.rb +++ b/spec/cucumber/wire/connections_spec.rb @@ -9,12 +9,12 @@ module Wire connection1 = double(step_matches: [:a, :b]) connection2 = double(step_matches: [:c]) - connections = Connections.new([connection1, connection2], double) + connections = Connections.new([connection1, connection2], double, double) expect(connections.step_matches('')).to eq [:a, :b, :c] end it "copes with no connections" do - connections = Connections.new([], double) + connections = Connections.new([], double, double) expect(connections.step_matches('')).to eq [] end end