Sha256: 020783941599568ec6bf7d8a6efa5db18843c11fde3a7db9afd21fac1933c2ef

Contents?: true

Size: 1.97 KB

Versions: 18

Compression:

Stored size: 1.97 KB

Contents

# frozen_string_literal: true

module Mutant
  # Subject of a mutation
  class Subject
    include AbstractType, Adamantium, Enumerable
    include Anima.new(:config, :context, :node)

    # Mutations for this subject
    #
    # @return [Enumerable<Mutation>]
    # @return [undefined]
    def mutations
      [neutral_mutation].concat(
        Mutator::Node.mutate(
          config: config.mutation,
          node:   node
        ).map do |mutant|
          Mutation::Evil.new(subject: self, node: wrap_node(mutant))
        end
      )
    end
    memoize :mutations

    def inline_disabled?
      config.inline_disable
    end

    # Source path
    #
    # @return [Pathname]
    def source_path
      context.source_path
    end

    # Prepare subject for insertion of mutation
    #
    # @return [self]
    def prepare
      self
    end

    # Perform post insert cleanup
    #
    # @return [self]
    def post_insert
      self
    end

    # Source line range
    #
    # @return [Range<Integer>]
    def source_lines
      expression = node.location.expression
      expression.line..expression.source_buffer.decompose_position(expression.end_pos).first
    end
    memoize :source_lines

    # First source line
    #
    # @return [Integer]
    def source_line
      source_lines.begin
    end

    # Identification string
    #
    # @return [String]
    def identification
      "#{expression.syntax}:#{source_path}:#{source_line}"
    end
    memoize :identification

    # Source representation of AST
    #
    # @return [String]
    def source
      Unparser.unparse(wrap_node(node))
    end
    memoize :source

    # Match expression
    #
    # @return [Expression]
    abstract_method :expression

    # Match expressions
    #
    # @return [Enumerable<Expression>]
    abstract_method :match_expressions

  private

    def neutral_mutation
      Mutation::Neutral.new(subject: self, node: wrap_node(node))
    end

    def wrap_node(node)
      node
    end

  end # Subject
end # Mutant

Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
mutant-0.12.2 lib/mutant/subject.rb
mutant-0.12.0 lib/mutant/subject.rb
mutant-0.11.34 lib/mutant/subject.rb
mutant-0.11.33 lib/mutant/subject.rb
mutant-0.11.32 lib/mutant/subject.rb
mutant-0.11.31 lib/mutant/subject.rb
mutant-0.11.30 lib/mutant/subject.rb
mutant-0.11.29 lib/mutant/subject.rb
mutant-0.11.28 lib/mutant/subject.rb
mutant-0.11.27 lib/mutant/subject.rb
mutant-0.11.26 lib/mutant/subject.rb
mutant-0.11.25 lib/mutant/subject.rb
mutant-0.11.24 lib/mutant/subject.rb
mutant-0.11.23 lib/mutant/subject.rb
mutant-0.11.22 lib/mutant/subject.rb
mutant-0.11.21 lib/mutant/subject.rb
mutant-0.11.20 lib/mutant/subject.rb
mutant-0.11.19 lib/mutant/subject.rb