require 'rspec/expectations' def clean_output(output) output.split("\n").map do |line| next if line.include?(CUCUMBER_FEATURES_PATH) line .gsub(/\e\[([;\d]+)?m/, '') # Drop colors .gsub(/^.*cucumber_process\.rb.*$\n/, '') .gsub(/^\d+m\d+\.\d+s$/, '0m0.012s') # Make duration predictable .gsub(/Coverage report generated .+$\n/, '') # Remove SimpleCov message .sub(/\s*$/, '') # Drop trailing whitespaces end.compact.join("\n") end def remove_self_ref(output) output .split("\n") .reject { |line| line.include?(CUCUMBER_FEATURES_PATH) } .join("\n") end RSpec::Matchers.define :be_similar_output_than do |expected| match do |actual| @actual = clean_output(actual) @expected = clean_output(expected) @actual == @expected end diffable end RSpec::Matchers.define :start_with_output do |expected| match do |actual| @actual = clean_output(actual) @expected = clean_output(expected) @actual.start_with?(@expected) end diffable end RSpec::Matchers.define :include_output do |expected| match do |actual| @actual = clean_output(actual) @expected = clean_output(expected) @actual.include?(@expected) end diffable end