# frozen_string_literal: truemoduleMutant# Namespace and mixin module for resultsmoduleResult# CoverageMetric mixinmoduleCoverageMetricFULL_COVERAGE=Rational(1).freezeprivate_constant(*constants(false))# Observed coverage## @return [Rational]defcoverageifamount_mutation_results.zero?FULL_COVERAGEelseRational(amount_mutations_killed,amount_mutation_results)endendend# CoverageMetric# Class level mixinmoduleClassMethods# Generate a sum method from name and collection## @param [Symbol] name# the attribute name on collection item and method name to use## @param [Symbol] collection# the attribute name used to receive collection## @return [undefined]defsum(name,collection)define_method(name)dopublic_send(collection).map(&name).reduce(0,:+)endmemoize(name)end# Delegate a method to childdefdelegate(name,target)define_method(name)dopublic_send(target).public_send(name)endendend# ClassMethodsprivate_constant(*constants(false))# Hook called when module gets included## @param [Class, Module] host## @return [undefined]defself.included(host)host.class_evaldoincludeAdamantiumextendClassMethodsendend# Env result objectclassEnvincludeCoverageMetric,Result,Anima.new(:env,:runtime,:subject_results)# Test if run is successful## @return [Boolean]defsuccess?coverage.eql?(Rational(1))endmemoize:success?# Failed subject results## @return [Array<Result::Subject>]deffailed_subject_resultssubject_results.reject(&:success?)endsum:amount_mutation_results,:subject_resultssum:amount_mutations_alive,:subject_resultssum:amount_mutations_killed,:subject_resultssum:amount_timeouts,:subject_resultssum:killtime,:subject_results# Amount of mutations## @return [Integer]defamount_mutationsenv.mutations.lengthend# Test if processing needs to stop## @return [Boolean]#defstop?env.config.fail_fast&&!subject_results.all?(&:success?)endend# Env# TestEnv result objectclassTestEnvincludeResult,Anima.new(:env,:runtime,:test_results)# Test if run is successful## @return [Boolean]defsuccess?amount_tests_failed.equal?(0)endmemoize:success?# Failed subject results## @return [Array<Result::Test>]deffailed_test_resultstest_results.reject(&:success?)endmemoize:failed_test_resultsdefstop?env.config.fail_fast&&!test_results.all?(&:success?)enddeftesttimetest_results.map(&:runtime).sum(0.0)enddefamount_testsenv.integration.all_tests.lengthenddefamount_test_resultstest_results.lengthenddefamount_tests_failedfailed_test_results.lengthenddefamount_tests_successtest_results.count(&:passed)endend# TestEnv# Test resultclassTestincludeAnima.new(:job_index,:passed,:runtime,:output)alias_method:success?,:passedclassVoidValue<selfincludeSingleton# Initialize object## @return [undefined]definitializesuper(job_index: nil,output: '',passed: false,runtime: 0.0)endend# VoidValueend# Test# Subject resultclassSubjectincludeCoverageMetric,Result,Anima.new(:coverage_results,:subject,:tests)sum:killtime,:coverage_resultssum:runtime,:coverage_results# Test if subject was processed successful## @return [Boolean]defsuccess?uncovered_results.empty?end# Alive mutations## @return [Array<Result::Coverage>]defuncovered_resultscoverage_results.reject(&:success?)endmemoize:uncovered_results# Amount of mutations## @return [Integer]defamount_mutation_resultscoverage_results.lengthend# Amount of mutations## @return [Integer]defamount_timeoutscoverage_results.count(&:timeout?)end# Amount of mutations## @return [Integer]defamount_mutationssubject.mutations.lengthend# Number of killed mutations## @return [Integer]defamount_mutations_killedcovered_results.lengthend# Number of alive mutations## @return [Integer]defamount_mutations_aliveuncovered_results.lengthendprivatedefcovered_resultscoverage_results.select(&:success?)endmemoize:covered_resultsend# Subject# Coverage of a mutation against criteriaclassCoverageincludeResult,Anima.new(:mutation_result,:criteria_result)delegate:killtime,:mutation_resultdelegate:runtime,:mutation_resultdelegate:success?,:criteria_resultdelegate:timeout?,:mutation_resultend# CoverageclassCoverageCriteriaincludeResult,Anima.new(*Config::CoverageCriteria.anima.attribute_names)# Test if one coverage criteria indicates success## @return [Boolean]defsuccess?process_abort||test_result||timeoutendendclassMutationIndexincludeAnima.new(:isolation_result,:mutation_index,:runtime)end# MutationIndex# Mutation resultclassMutationincludeResult,Anima.new(:isolation_result,:mutation,:runtime)# Create mutation criteria results## @praam [Result::CoverageCriteria]defcriteria_result(coverage_criteria)CoverageCriteria.new(process_abort: coverage_criteria.process_abort&&process_abort?,test_result: coverage_criteria.test_result&&test_result_success?,timeout: coverage_criteria.timeout&&timeout?)end# Time the tests had been running## @return [Float]defkilltimeisolation_result.value&.runtime||0.0end# Test for timeout## @return [Boolean]deftimeout?!isolation_result.timeout.nil?end# Test for unexpected process abort## @return [Boolean]defprocess_abort?process_status=isolation_result.process_statusorreturnfalse!timeout?&&!process_status.success?endprivate# Test if mutation was handled successfully## @return [Boolean]deftest_result_success?isolation_result.valid_value?&&mutation.class.success?(isolation_result.value)endmemoize:test_result_success?end# Mutationend# Resultend# Mutant