Class: Mutineer::Mutation

Inherits:
Data
  • Object
show all
Defined in:
lib/mutineer/mutation.rb

Overview

One atomic byte-range edit. Immutable. One mutation per mutant — never combine. Source is mutated textually, never regenerated from the AST.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#end_offsetObject (readonly)

Returns the value of attribute end_offset

Returns:

  • (Object)

    the current value of end_offset



8
9
10
# File 'lib/mutineer/mutation.rb', line 8

def end_offset
  @end_offset
end

#operatorObject (readonly)

Returns the value of attribute operator

Returns:

  • (Object)

    the current value of operator



8
9
10
# File 'lib/mutineer/mutation.rb', line 8

def operator
  @operator
end

#replacementObject (readonly)

Returns the value of attribute replacement

Returns:

  • (Object)

    the current value of replacement



8
9
10
# File 'lib/mutineer/mutation.rb', line 8

def replacement
  @replacement
end

#start_offsetObject (readonly)

Returns the value of attribute start_offset

Returns:

  • (Object)

    the current value of start_offset



8
9
10
# File 'lib/mutineer/mutation.rb', line 8

def start_offset
  @start_offset
end

Instance Method Details

#apply(source) ⇒ Object

Pure: returns a new string, does not mutate source. Prism offsets are BYTE offsets, so all slicing is byte-based (byteslice) — char slicing would corrupt any source containing a multibyte char before the mutation point.



12
13
14
# File 'lib/mutineer/mutation.rb', line 12

def apply(source)
  source.byteslice(0, start_offset) + replacement + source.byteslice(end_offset..)
end

#valid?(source) ⇒ Boolean

Validity rule: a mutation is valid iff the mutated source re-parses clean.

Returns:

  • (Boolean)


17
18
19
# File 'lib/mutineer/mutation.rb', line 17

def valid?(source)
  Parser.parse_string(apply(source)).errors.empty?
end