
* This is needed to relate examples to node types for nodes that cannot stand alone. Example are :where nodes that do not have syntax outside a :case
106 lines
2.2 KiB
Ruby
106 lines
2.2 KiB
Ruby
RSpec.describe Mutant::Meta::Example::DSL do
|
|
describe '.call' do
|
|
subject { described_class.call(file, type, block) }
|
|
|
|
let(:file) { 'foo.rb' }
|
|
let(:node) { s(:false) }
|
|
let(:type) { node.type }
|
|
let(:expected) { [] }
|
|
|
|
let(:expected_example) do
|
|
Mutant::Meta::Example.new(
|
|
file: file,
|
|
node: node,
|
|
node_type: type,
|
|
expected: expected
|
|
)
|
|
end
|
|
|
|
def self.expect_example(&block)
|
|
let(:block) { block }
|
|
|
|
specify do
|
|
# Kill mutations to warnings
|
|
warnings = Mutant::WarningFilter.use do
|
|
should eql(expected_example)
|
|
end
|
|
expect(warnings).to eql([])
|
|
end
|
|
end
|
|
|
|
def self.expect_error(message, &block)
|
|
let(:block) { block }
|
|
|
|
specify do
|
|
expect { subject }.to raise_error(RuntimeError, message)
|
|
end
|
|
end
|
|
|
|
context 'source as node' do
|
|
expect_example do
|
|
source s(:false)
|
|
end
|
|
end
|
|
|
|
context 'source as string' do
|
|
expect_example do
|
|
source 'false'
|
|
end
|
|
end
|
|
|
|
context 'on node that needs unparser preprocessing to be normalized' do
|
|
let(:node) { s(:send, s(:float, -1.0), :/, s(:float, 0.0)) }
|
|
|
|
expect_example do
|
|
source '(-1.0) / 0.0'
|
|
end
|
|
end
|
|
|
|
context 'using #mutation' do
|
|
let(:expected) { [s(:nil)] }
|
|
|
|
expect_example do
|
|
source 'false'
|
|
|
|
mutation 'nil'
|
|
end
|
|
end
|
|
|
|
context 'using #singleton_mutations' do
|
|
let(:expected) { [s(:nil), s(:self)] }
|
|
|
|
expect_example do
|
|
source 'false'
|
|
|
|
singleton_mutations
|
|
end
|
|
end
|
|
|
|
context 'no definition of source' do
|
|
expect_error('source not defined') do
|
|
end
|
|
end
|
|
|
|
context 'duplicate definition of source' do
|
|
expect_error('source already defined') do
|
|
source 'true'
|
|
source 'false'
|
|
end
|
|
end
|
|
|
|
context 'uncoercable source' do
|
|
expect_error('Cannot coerce to node: nil') do
|
|
source nil
|
|
end
|
|
end
|
|
|
|
context 'duplicate mutation expectation' do
|
|
expect_error('Mutation for input: "true" is already expected') do
|
|
source 'false'
|
|
|
|
mutation 'true'
|
|
mutation 'true'
|
|
end
|
|
end
|
|
end
|
|
end
|