Change meta examples to allow specifying N types

This commit is contained in:
Markus Schirp 2018-12-02 00:18:10 +00:00
parent ce5bcb4c62
commit 4355b23369
9 changed files with 44 additions and 43 deletions

View file

@ -18,9 +18,9 @@ module Mutant
# @return [undefined]
#
# rubocop:disable Performance/Caller
def self.add(type, &block)
def self.add(*types, &block)
file = caller.first.split(':in', 2).first
ALL << DSL.call(file, type, block)
ALL << DSL.call(file, Set.new(types), block)
end
Pathname.glob(Pathname.new(__dir__).parent.parent.join('meta', '*.rb'))

View file

@ -3,7 +3,7 @@
module Mutant
module Meta
class Example
include Adamantium, Anima.new(:file, :node, :node_type, :expected)
include Adamantium, Anima.new(:file, :node, :types, :expected)
# Verification instance for example
#

View file

@ -9,9 +9,12 @@ module Mutant
# Run DSL on block
#
# @param [Pathname] file
# @param [Set<Symbol>] types
#
# @return [Example]
def self.call(file, type, block)
instance = new(file, type)
def self.call(file, types, block)
instance = new(file, types)
instance.instance_eval(&block)
instance.example
end
@ -21,9 +24,9 @@ module Mutant
# Initialize object
#
# @return [undefined]
def initialize(file, type)
def initialize(file, types)
@file = file
@type = type
@types = types
@node = nil
@expected = []
end
@ -39,7 +42,7 @@ module Mutant
Example.new(
file: @file,
node: @node,
node_type: @type,
types: @types,
expected: @expected
)
end

View file

@ -80,10 +80,3 @@ Pathname
.glob(Pathname.new(__dir__).join('regexp', '*.rb'))
.sort
.each(&Kernel.public_method(:require))
# Re-register examples for all regular expression nodes for node_type `:regexp`
Mutant::Meta::Example::ALL.each do |example|
next unless example.node_type.to_s.start_with?('regexp_')
Mutant::Meta::Example::ALL << example.with(node_type: :regexp)
end

View file

@ -12,7 +12,7 @@ mutations = {
mutations = mutations.merge(mutations.invert)
mutations.each do |(source_type, source_mutation), (_, regexp_mutation)|
Mutant::Meta::Example.add source_type do
Mutant::Meta::Example.add :regexp, source_type do
source(source_mutation)
singleton_mutations

View file

@ -2,18 +2,18 @@
RSpec.describe Mutant::Meta::Example::DSL do
describe '.call' do
subject { described_class.call(file, type, block) }
subject { described_class.call(file, types, block) }
let(:file) { 'foo.rb' }
let(:node) { s(:false) }
let(:type) { node.type }
let(:types) { Set.new([node.type]) }
let(:expected) { [] }
let(:expected_example) do
Mutant::Meta::Example.new(
file: file,
node: node,
node_type: type,
types: types,
expected: expected
)
end

View file

@ -7,7 +7,7 @@ RSpec.describe Mutant::Meta::Example::Verification do
Mutant::Meta::Example.new(
file: 'foo.rb',
node: s(:true),
node_type: :true,
types: [:true],
expected: expected_nodes
)
end

View file

@ -5,7 +5,7 @@ RSpec.describe Mutant::Meta::Example do
described_class.new(
file: file,
node: node,
node_type: node.type,
types: [node.type],
expected: mutation_nodes
)
end

View file

@ -1,15 +1,20 @@
# frozen_string_literal: true
Mutant::Meta::Example::ALL.each.group_by(&:node_type).each do |type, examples|
RSpec.describe Mutant::Mutator::REGISTRY.lookup(type) do
toplevel_nodes = examples.map { |example| example.node.type }.uniq
aggregate = Hash.new { |hash, key| hash[key] = [] }
it "generates the correct mutations on #{toplevel_nodes} toplevel examples" do
Mutant::Meta::Example::ALL
.each_with_object(aggregate) do |example, agg|
example.types.each do |type|
agg[Mutant::Mutator::REGISTRY.lookup(type)] << example
end
end
aggregate.each do |mutator, examples|
RSpec.describe mutator do
it 'generates expected mutations' do
examples.each do |example|
verification = example.verification
unless verification.success?
fail verification.error_report
end
fail verification.error_report unless verification.success?
end
end
end