diff --git a/lib/mutant.rb b/lib/mutant.rb index 2730dacb..61b295f9 100644 --- a/lib/mutant.rb +++ b/lib/mutant.rb @@ -39,6 +39,7 @@ require 'mutant/support/method_object' require 'mutant/random' require 'mutant/mutator' +require 'mutant/mutation' require 'mutant/mutator/registry' require 'mutant/mutator/literal' require 'mutant/mutator/literal/boolean' diff --git a/lib/mutant/mutation.rb b/lib/mutant/mutation.rb new file mode 100644 index 00000000..4176624f --- /dev/null +++ b/lib/mutant/mutation.rb @@ -0,0 +1,85 @@ +module Mutant + # Represent a mutated node with its subject + class Mutation + include Immutable + + # Return mutated root node + # + # @return [Rubinius::AST::Script] + # + # @api private + # + def root + @subject.root(@node) + end + memoize :root + + # Insert mutated node + # + # @return [self] + # + # @api private + # + def insert + Loader.run(root) + self + end + + # Return identification + # + # @return [String] + # + # @api private + # + def identification + "#{@subject.identification}:#{sha1[0..4]}" + end + + # Return sha1 sum of source + # + # @return [String] + # + # @api private + # + def sha1 + SHA1.hexdigest(source) + end + memoize :sha1 + + # Return source + # + # @return [String] + # + # @api private + # + def source + @node.to_source + end + memoize :source + + # Return original source + # + # @return [String] + # + # @api private + # + def original_source + @subject.source + end + + private + + # Initialize mutation object + # + # @param [Subject] subject + # @param [Rubinius::Node::AST] node + # + # @return [undefined] + # + # @api private + # + def initialize(subject, node) + @subject, @node = subject, node + end + end +end