Class: Tryouts::FailureCollector

Inherits:
Object
  • Object
show all
Defined in:
lib/tryouts/failure_collector.rb

Overview

Collects and organizes failed test results across files for summary display Similar to RSpec's failure summary at the end of test runs

Constant Summary collapse

FailureEntry =

Data structure for a single failure entry

Data.define(:file_path, :test_case, :result_packet) do
  def line_number
    # Use first expectation line for consistency with main error display
    test_case.first_expectation_line || test_case.line_range&.first || 0
  end

  def description
    desc = test_case.description.to_s.strip
    desc.empty? ? 'unnamed test' : desc
  end

  def failure_reason
    case result_packet.status
    when :failed
      if result_packet.actual_results.any? && result_packet.expected_results.any?
        "expected #{result_packet.first_expected.inspect}, got #{result_packet.first_actual.inspect}"
      else
        'test failed'
      end
    when :error
      error_msg = result_packet.error&.message || 'unknown error'
      "#{result_packet.error&.class&.name || 'Error'}: #{error_msg}"
    else
      'test did not pass'
    end
  end

  def source_context
    return [] unless test_case.source_lines

    # Show the test code (excluding setup/teardown)
    test_case.source_lines.reject do |line|
      line.strip.empty? || line.strip.start_with?('#')
    end.first(3) # Limit to first 3 relevant lines
  end
end

Instance Method Summary collapse

Constructor Details

#initializeFailureCollector

Returns a new instance of FailureCollector.



47
48
49
50
# File 'lib/tryouts/failure_collector.rb', line 47

def initialize
  @failures            = []
  @files_with_failures = Set.new
end

Instance Method Details

#add_failure(file_path, result_packet) ⇒ Object

Add a failed test result



53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/tryouts/failure_collector.rb', line 53

def add_failure(file_path, result_packet)
  return unless result_packet.failed? || result_packet.error?

  entry = FailureEntry.new(
    file_path: file_path,
    test_case: result_packet.test_case,
    result_packet: result_packet,
  )

  @failures << entry
  @files_with_failures << file_path
end

#all_failuresObject

Get all failure entries (for detailed processing)



99
100
101
# File 'lib/tryouts/failure_collector.rb', line 99

def all_failures
  @failures.dup
end

#any_failures?Boolean

Check if any failures were collected

Returns:

  • (Boolean)


67
68
69
# File 'lib/tryouts/failure_collector.rb', line 67

def any_failures?
  !@failures.empty?
end

#clearObject

Reset the collector (useful for testing)



104
105
106
107
# File 'lib/tryouts/failure_collector.rb', line 104

def clear
  @failures.clear
  @files_with_failures.clear
end

#error_countObject

Get count of total errors



77
78
79
# File 'lib/tryouts/failure_collector.rb', line 77

def error_count
  @failures.count { |f| f.result_packet.error? }
end

#failure_countObject

Get count of total failures



72
73
74
# File 'lib/tryouts/failure_collector.rb', line 72

def failure_count
  @failures.count { |f| f.result_packet.failed? }
end

#failures_by_fileObject

Get failures grouped by file for summary display



92
93
94
95
96
# File 'lib/tryouts/failure_collector.rb', line 92

def failures_by_file
  @failures.group_by(&:file_path).transform_values do |file_failures|
    file_failures.sort_by(&:line_number)
  end
end

#files_with_failures_countObject

Get count of files with failures



87
88
89
# File 'lib/tryouts/failure_collector.rb', line 87

def files_with_failures_count
  @files_with_failures.size
end

#total_issuesObject

Get total issues (failures + errors)



82
83
84
# File 'lib/tryouts/failure_collector.rb', line 82

def total_issues
  @failures.size
end