Class: Evilution::Integration::TestUnitCrashDetector

Inherits:
Object
  • Object
show all
Defined in:
lib/evilution/integration/test_unit_crash_detector.rb

Overview

Test::Unit analog of Evilution::Integration::MinitestCrashDetector. Tracks whether a Test::Unit test run produced only crashes (exceptions captured as Test::Unit::Error) vs assertion failures (Test::Unit::Failure). When only crashes occur, the mutation result can carry crash details while remaining classified as :killed — see classify_status / Result::MutationResult.

Hook the detector into a Test::Unit::TestResult via .attach(result), or call #record(fault) directly when iterating a finished result’s #faults.

Instance Method Summary collapse

Constructor Details

#initializeTestUnitCrashDetector

Returns a new instance of TestUnitCrashDetector.



14
15
16
# File 'lib/evilution/integration/test_unit_crash_detector.rb', line 14

def initialize
  reset
end

Instance Method Details

#assertion_failure?Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/evilution/integration/test_unit_crash_detector.rb', line 40

def assertion_failure?
  @assertion_failures.positive?
end

#attach(test_result) ⇒ Object



23
24
25
26
# File 'lib/evilution/integration/test_unit_crash_detector.rb', line 23

def attach(test_result)
  require "test/unit/testresult"
  test_result.add_listener(Test::Unit::TestResult::FAULT) { |fault| record(fault) }
end

#crash_summaryObject



56
57
58
59
60
# File 'lib/evilution/integration/test_unit_crash_detector.rb', line 56

def crash_summary
  return nil if @crashes.empty?

  "#{unique_crash_classes.join(", ")} (#{@crashes.length} crash#{"es" unless @crashes.length == 1})"
end

#crashed?Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/evilution/integration/test_unit_crash_detector.rb', line 44

def crashed?
  @crashes.any?
end

#only_crashes?Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/evilution/integration/test_unit_crash_detector.rb', line 48

def only_crashes?
  @crashes.any? && @assertion_failures.zero?
end

#passed?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/evilution/integration/test_unit_crash_detector.rb', line 36

def passed?
  @assertion_failures.zero? && @crashes.empty?
end

#record(fault) ⇒ Object



28
29
30
31
32
33
34
# File 'lib/evilution/integration/test_unit_crash_detector.rb', line 28

def record(fault)
  if fault.is_a?(Test::Unit::Error)
    @crashes << fault.exception
  elsif fault.is_a?(Test::Unit::Failure)
    @assertion_failures += 1
  end
end

#resetObject



18
19
20
21
# File 'lib/evilution/integration/test_unit_crash_detector.rb', line 18

def reset
  @assertion_failures = 0
  @crashes = []
end

#unique_crash_classesObject



52
53
54
# File 'lib/evilution/integration/test_unit_crash_detector.rb', line 52

def unique_crash_classes
  @crashes.map { |e| e.class.name }.uniq
end