require 'rspec/core' require 'rspec/core/formatters/base_text_formatter' module Mutant class Integration # Shared parts of rspec2/3 integration class Rspec < self include AbstractType register 'rspec' RSPEC_2_VERSION_PREFIX = '2.'.freeze # Return integration compatible to currently loaded rspec # # @return [Integration] # # @api private # def self.build if RSpec::Core::Version::STRING.start_with?(RSPEC_2_VERSION_PREFIX) Rspec2.new else Rspec3.new end end # Setup rspec integration # # @return [self] # # @api private # def setup options.configure(configuration) configuration.load_spec_files self end memoize :setup # Return report for test # # @param [Rspec::Test] test # # @return [Test::Result] # # @api private # # rubocop:disable MethodLength # def run(test) output = StringIO.new failed = false start = Time.now reporter = new_reporter(output) reporter.report(1) do example_group_index.fetch(test.expression.syntax).each do |example_group| next if example_group.run(reporter) failed = true break end end output.rewind Result::Test.new( test: nil, mutation: nil, output: output.read, runtime: Time.now - start, passed: !failed ) end # Return all available tests # # @return [Enumerable] # # @api private # def all_tests example_group_index.keys.each_with_object([]) do |full_description, aggregate| expression = Expression.try_parse(full_description) or next aggregate << Test.new(self, expression) end end memoize :all_tests private # Return all example groups # # @return [Hash