diff --git a/features/steps/output_steps.rb b/features/steps/output_steps.rb index 47ceeb8..ce9a12a 100644 --- a/features/steps/output_steps.rb +++ b/features/steps/output_steps.rb @@ -27,6 +27,17 @@ Then /^the output must not match \/([^\/]+)\/([a-z]*)$/ do |pattern, options| expect(all_output).not_to match Regexp.new(pattern, options) end +Then /^the output must match \/([^\/]+)\/([a-z]*) at least (\d+) times$/ do + |pattern, options, times| + uhwm_wait_output Regexp.new(pattern, options), times.to_i +end + +Then /^the output must match \/([^\/]+)\/([a-z]*) exactly (\d+) times$/ do + |pattern, options, times| + scans = uhwm_wait_output Regexp.new(pattern, options) + expect(scans.size).to eq times.to_i +end + Then /^the output must contain:$/ do |content| uhwm_wait_output content.to_s end diff --git a/features/steps/x_steps.rb b/features/steps/x_steps.rb index fcdc8a8..fff2472 100644 --- a/features/steps/x_steps.rb +++ b/features/steps/x_steps.rb @@ -9,6 +9,10 @@ When /^I press the ([^ ]+) keys?$/ do |keys| x_key keys end +When /^I press the ([^ ]+) keys? (\d+) times$/ do |keys, times| + times.to_i.times { x_key keys } +end + When /^a window requests to be mapped$/ do x_client.map.sync end diff --git a/features/workers/block.feature b/features/workers/block.feature new file mode 100644 index 0000000..b8cb86f --- /dev/null +++ b/features/workers/block.feature @@ -0,0 +1,15 @@ +Feature: blocking worker + + Scenario: processes initial events + Given uhwm is running with options -d -w block + Then the output must match /xevent/i at least 2 times + + Scenario: processes generated events + Given a run control file with: + """ + key(:f) { puts 'testing_worker_read' } + """ + And uhwm is running with options -d -w block + When I press the alt+f key 3 times + And I quit uhwm + Then the output must match /(testing_worker_read)/ exactly 3 times diff --git a/lib/uh/wm/testing/acceptance_helpers.rb b/lib/uh/wm/testing/acceptance_helpers.rb index 7558ca0..4d56e83 100644 --- a/lib/uh/wm/testing/acceptance_helpers.rb +++ b/lib/uh/wm/testing/acceptance_helpers.rb @@ -29,19 +29,21 @@ module Uh end end - def uhwm_wait_output message + def uhwm_wait_output message, times = 1, value = nil output = -> { @process.stdout + @process.stderr } timeout_until do case message - when Regexp then output.call =~ message - when String then output.call.include? message + #when Regexp then output.call.scan(message).size >= times + when Regexp then (value = output.call.scan(message)).size >= times + when String then output.call.include? message end end + value rescue TimeoutError => e - fail [ - "expected `#{message}' not seen after #{e.timeout} seconds in:", - " ```\n#{output.call.lines.map { |e| " #{e}" }.join} ```" - ].join "\n" + fail <<-eoh +expected `#{message}' (#{times}) not seen after #{e.timeout} seconds in: + ```\n#{output.call.lines.map { |e| " #{e}" }.join} ``` + eoh end def uhwm_wait_ready