Sha256: 3412401337d14c6d87d584964e4bf178fd5dfd32894d54ea7c8b1ea02703b3a9

Contents?: true

Size: 1.99 KB

Versions: 20

Compression:

Stored size: 1.99 KB

Contents

class Subject

  include Equalizer.new(:source)

  Undefined = Object.new.freeze

  attr_reader :source

  def self.coerce(input)
    case input
    when Parser::AST::Node
      new(input)
    when String
      new(Parser::CurrentRuby.parse(input))
    else
      raise
    end
  end

  def to_s
    "#{@node.inspect}\n#{@source}"
  end

  def initialize(node)
    source = Unparser.unparse(node)
    @node, @source = node, source
  end

  def assert_transitive!
    generated = Unparser.generate(@node)
    parsed    = Parser::CurrentRuby.parse(generated)
    again     = Unparser.generate(parsed)
    unless generated == again
      # mostly an unparser bug!
      fail "Untransitive:\n%s\n---\n%s" % [generated, again]
    end
    self
  end
end

shared_examples_for 'a mutator' do
  subject { object.each(node) { |item| yields << item } }

  let(:yields) { []              }
  let(:object) { described_class }

  unless instance_methods.map(&:to_s).include?('node')
    let(:node) { parse(source) }
  end

  it_should_behave_like 'a command method'

  context 'with no block' do
    subject { object.each(node) }

    it { should be_instance_of(to_enum.class) }

    let(:expected_mutations) do
      mutations.map do |mutation|
        Subject.coerce(mutation)
      end
    end

    let(:generated_mutations) do
    end

    it 'generates the expected mutations' do

      generated  = subject.map { |node| Subject.new(node) }

      missing    = expected_mutations - generated
      unexpected = generated - expected_mutations

      message = []

      if missing.any?
        message << 'Missing mutations (%i):' % missing.length
        message.concat(missing)
      end

      if unexpected.any?
        message << 'Unexpected mutations (%i):' % unexpected.length
        message.concat(unexpected)
      end

      fail "Original:\n#{generate(node)}\n-----\n#{message.join("\n-----\n")}" if message.any?
    end
  end
end

shared_examples_for 'a noop mutator' do
  let(:mutations) { [] }

  it_should_behave_like 'a mutator'
end

Version data entries

20 entries across 20 versions & 1 rubygems

Version Path
mutant-0.3.0.beta21 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta20 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta19 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta18 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta17 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta16 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta15 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta14 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta13 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta12 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta11 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta10 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta9 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta8 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta7 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta6 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta5 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta4 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta3 spec/shared/mutator_behavior.rb
mutant-0.3.0.beta2 spec/shared/mutator_behavior.rb