Module: Test::Unit::Util::BacktraceFilter — test-unit - test-unit

Module: Test::Unit::Util::BacktraceFilter

Included in:
Error, Notification, Omission, Pending, TestCase
Defined in:
lib/test/unit/util/backtracefilter.rb

Constant Summary

TESTUNIT_FILE_SEPARATORS =
%r{[\\/:]}
TESTUNIT_PREFIX =
__FILE__.split(TESTUNIT_FILE_SEPARATORS)[0..-3]
TESTUNIT_RB_FILE =
/\.rb\Z/

Class Method Summary (collapse)

Class Method Details

+ (Object) filter_backtrace(backtrace, prefix = nil)



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/test/unit/util/backtracefilter.rb', line 10

def filter_backtrace(backtrace, prefix=nil)
  return ["No backtrace"] unless backtrace
  return backtrace if ENV["TEST_UNIT_ALL_BACKTRACE"]

  if prefix
    split_prefix = prefix.split(TESTUNIT_FILE_SEPARATORS)
  else
    split_prefix = TESTUNIT_PREFIX
  end
  test_unit_internal_p = lambda do |entry|
    components = entry.split(TESTUNIT_FILE_SEPARATORS)
    split_entry = components[0, split_prefix.size]
    next false unless split_entry[0..-2] == split_prefix[0..-2]
    split_entry[-1].sub(TESTUNIT_RB_FILE, '') == split_prefix[-1]
  end

  jruby_internal_p = lambda do |entry|
    entry.start_with?("org/jruby/")
  end

  found_prefix = false
  new_backtrace = backtrace.reverse.reject do |entry|
    if test_unit_internal_p.call(entry)
      found_prefix = true
      true
    elsif found_prefix
      jruby_internal_p.call(entry)
    else
      true
    end
  end.reverse

  if new_backtrace.empty?
    new_backtrace = backtrace.reject do |entry|
      test_unit_internal_p.call(entry) or jruby_internal_p.call(entry)
    end
    new_backtrace = backtrace if new_backtrace.empty?
  end
  new_backtrace
end