File: backtracefilter.rb

package info (click to toggle)
ruby-test-unit 3.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 928 kB
  • ctags: 1,759
  • sloc: ruby: 12,818; makefile: 6
file content (59 lines) | stat: -rw-r--r-- 1,891 bytes parent folder | download
1
2
3
4
5
6
7
8
9
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
50
51
52
53
54
55
56
57
58
59
module Test
  module Unit
    module Util
      module BacktraceFilter
        TESTUNIT_FILE_SEPARATORS = %r{[\\/:]}
        TESTUNIT_PREFIX = __FILE__.split(TESTUNIT_FILE_SEPARATORS)[0..-3]
        TESTUNIT_RB_FILE = /\.rb\Z/

        module_function
        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

          rubinius_internal_p = lambda do |entry|
            entry.start_with?("kernel/")
          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) or rubinius_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) or
                rubinius_internal_p.call(entry)
            end
            new_backtrace = backtrace if new_backtrace.empty?
          end
          new_backtrace
        end
      end
    end
  end
end