Add range literal support
* Full of duplication. Will be addressed when all literals are done.
This commit is contained in:
parent
5613beec12
commit
0b9b46d12f
4 changed files with 141 additions and 0 deletions
|
@ -91,6 +91,8 @@ require 'mutant/mutator/float_literal'
|
||||||
require 'mutant/mutator/array_literal'
|
require 'mutant/mutator/array_literal'
|
||||||
require 'mutant/mutator/empty_array'
|
require 'mutant/mutator/empty_array'
|
||||||
require 'mutant/mutator/hash_literal'
|
require 'mutant/mutator/hash_literal'
|
||||||
|
require 'mutant/mutator/range'
|
||||||
|
require 'mutant/mutator/range_exclude'
|
||||||
require 'mutant/mutator/block'
|
require 'mutant/mutator/block'
|
||||||
require 'mutant/loader'
|
require 'mutant/loader'
|
||||||
require 'mutant/context'
|
require 'mutant/context'
|
||||||
|
|
53
lib/mutant/mutator/range.rb
Normal file
53
lib/mutant/mutator/range.rb
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
module Mutant
|
||||||
|
class Mutator
|
||||||
|
class Range < Mutator
|
||||||
|
private
|
||||||
|
|
||||||
|
def mutants(generator)
|
||||||
|
generator << new_nil
|
||||||
|
generator << new(Rubinius::AST::RangeExclude,node.start,node.finish)
|
||||||
|
|
||||||
|
generator << new_self(neg_infinity,node.finish)
|
||||||
|
generator << new_self(nan,node.finish)
|
||||||
|
generator << new_self(node.start,infinity)
|
||||||
|
generator << new_self(node.start,nan)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Return AST representing infinity
|
||||||
|
#
|
||||||
|
# @return [Rubinius::Node::AST]
|
||||||
|
#
|
||||||
|
# @api private
|
||||||
|
#
|
||||||
|
def neg_infinity
|
||||||
|
'-1.0/0.0'.to_ast.tap do |call|
|
||||||
|
call.line = node.line
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Return AST representing infinity
|
||||||
|
#
|
||||||
|
# @return [Rubinius::Node::AST]
|
||||||
|
#
|
||||||
|
# @api private
|
||||||
|
#
|
||||||
|
def infinity
|
||||||
|
'1.0/0.0'.to_ast.tap do |call|
|
||||||
|
call.line = node.line
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Return AST representing NaN
|
||||||
|
#
|
||||||
|
# @return [Rubinius::Node::AST]
|
||||||
|
#
|
||||||
|
# @api private
|
||||||
|
#
|
||||||
|
def nan
|
||||||
|
'0.0/0.0'.to_ast.tap do |call|
|
||||||
|
call.line = node.line
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
54
lib/mutant/mutator/range_exclude.rb
Normal file
54
lib/mutant/mutator/range_exclude.rb
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
module Mutant
|
||||||
|
class Mutator
|
||||||
|
class RangeExclude < Mutator
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def mutants(generator)
|
||||||
|
generator << new_nil
|
||||||
|
generator << new(Rubinius::AST::Range,node.start,node.finish)
|
||||||
|
|
||||||
|
generator << new_self(neg_infinity,node.finish)
|
||||||
|
generator << new_self(nan,node.finish)
|
||||||
|
generator << new_self(node.start,infinity)
|
||||||
|
generator << new_self(node.start,nan)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Return AST representing infinity
|
||||||
|
#
|
||||||
|
# @return [Rubinius::Node::AST]
|
||||||
|
#
|
||||||
|
# @api private
|
||||||
|
#
|
||||||
|
def neg_infinity
|
||||||
|
'-1.0/0.0'.to_ast.tap do |call|
|
||||||
|
call.line = node.line
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Return AST representing infinity
|
||||||
|
#
|
||||||
|
# @return [Rubinius::Node::AST]
|
||||||
|
#
|
||||||
|
# @api private
|
||||||
|
#
|
||||||
|
def infinity
|
||||||
|
'1.0/0.0'.to_ast.tap do |call|
|
||||||
|
call.line = node.line
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Return AST representing NaN
|
||||||
|
#
|
||||||
|
# @return [Rubinius::Node::AST]
|
||||||
|
#
|
||||||
|
# @api private
|
||||||
|
#
|
||||||
|
def nan
|
||||||
|
'0.0/0.0'.to_ast.tap do |call|
|
||||||
|
call.line = node.line
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -203,6 +203,38 @@ describe Mutant::Mutator, '#each' do
|
||||||
it_should_behave_like 'a mutation enumerator method'
|
it_should_behave_like 'a mutation enumerator method'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'range literal' do
|
||||||
|
let(:source) { '1..100' }
|
||||||
|
|
||||||
|
let(:mutations) do
|
||||||
|
mutations = []
|
||||||
|
mutations << 'nil'
|
||||||
|
mutations << '1...100'
|
||||||
|
mutations << '(0.0/0.0)..100'
|
||||||
|
mutations << '(-1.0/0.0)..100'
|
||||||
|
mutations << '1..(1.0/0.0)'
|
||||||
|
mutations << '1..(0.0/0.0)'
|
||||||
|
end
|
||||||
|
|
||||||
|
it_should_behave_like 'a mutation enumerator method'
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'exclusive range literal' do
|
||||||
|
let(:source) { '1...100' }
|
||||||
|
|
||||||
|
let(:mutations) do
|
||||||
|
mutations = []
|
||||||
|
mutations << 'nil'
|
||||||
|
mutations << '1..100'
|
||||||
|
mutations << '(0.0/0.0)...100'
|
||||||
|
mutations << '(-1.0/0.0)...100'
|
||||||
|
mutations << '1...(1.0/0.0)'
|
||||||
|
mutations << '1...(0.0/0.0)'
|
||||||
|
end
|
||||||
|
|
||||||
|
it_should_behave_like 'a mutation enumerator method'
|
||||||
|
end
|
||||||
|
|
||||||
context 'block literal' do
|
context 'block literal' do
|
||||||
let(:source) { "true\nfalse" }
|
let(:source) { "true\nfalse" }
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue