60 lines
1.3 KiB
Ruby
60 lines
1.3 KiB
Ruby
module Mutant
|
|
# Abstract base class for mutant environments
|
|
class Env
|
|
include Adamantium::Flat, Anima.new(
|
|
:actor_env,
|
|
:config,
|
|
:integration,
|
|
:matchable_scopes,
|
|
:mutations,
|
|
:parser,
|
|
:selector,
|
|
:subjects
|
|
)
|
|
|
|
SEMANTICS_MESSAGE =
|
|
"Fix your lib to follow normal ruby semantics!\n" \
|
|
'{Module,Class}#name should return resolvable constant name as String or nil'.freeze
|
|
|
|
# Kill mutation
|
|
#
|
|
# @param [Mutation] mutation
|
|
#
|
|
# @return [Result::Mutation]
|
|
def kill(mutation)
|
|
test_result = run_mutation_tests(mutation)
|
|
Result::Mutation.new(
|
|
mutation: mutation,
|
|
test_result: test_result
|
|
)
|
|
end
|
|
|
|
private
|
|
|
|
# Kill mutation under isolation with integration
|
|
#
|
|
# @param [Isolation] isolation
|
|
# @param [Integration] integration
|
|
#
|
|
# @return [Result::Test]
|
|
#
|
|
# rubocop:disable MethodLength
|
|
def run_mutation_tests(mutation)
|
|
start = Time.now
|
|
tests = selector.call(mutation.subject)
|
|
|
|
config.isolation.call do
|
|
mutation.insert(config.kernel)
|
|
integration.call(tests)
|
|
end
|
|
rescue Isolation::Error => error
|
|
Result::Test.new(
|
|
output: error.message,
|
|
passed: false,
|
|
runtime: Time.now - start,
|
|
tests: tests
|
|
)
|
|
end
|
|
|
|
end # Env
|
|
end # Mutant
|