summaryrefslogtreecommitdiff
path: root/spec/ruby/language/fixtures/rescue_captures.rb
blob: 69f9b839043b9681daa4cdcae4300ca23bbef295 (plain)
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
module RescueSpecs
  class Captor
    attr_accessor :captured_error

    def self.should_capture_exception
      captor = new
      captor.capture('some text').should == :caught # Ensure rescue body still runs
      captor.captured_error.message.should == 'some text'
    end
  end

  class ClassVariableCaptor < Captor
    def capture(msg)
      raise msg
    rescue => @@captured_error
      :caught
    end

    def captured_error
      self.class.remove_class_variable(:@@captured_error)
    end
  end

  class ConstantCaptor < Captor
    # Using lambda gets around the dynamic constant assignment warning
    CAPTURE = -> msg {
      begin
        raise msg
      rescue => CapturedError
        :caught
      end
    }

    def capture(msg)
      CAPTURE.call(msg)
    end

    def captured_error
      self.class.send(:remove_const, :CapturedError)
    end
  end

  class GlobalVariableCaptor < Captor
    def capture(msg)
      raise msg
    rescue => $captured_error
      :caught
    end

    def captured_error
      $captured_error.tap do
        $captured_error = nil # Can't remove globals, only nil them out
      end
    end
  end

  class InstanceVariableCaptor < Captor
    def capture(msg)
      raise msg
    rescue => @captured_error
      :caught
    end
  end

  class LocalVariableCaptor < Captor
    def capture(msg)
      raise msg
    rescue => captured_error
      @captured_error = captured_error
      :caught
    end
  end

  class SafeNavigationSetterCaptor < Captor
    def capture(msg)
      raise msg
    rescue => self&.captured_error
      :caught
    end
  end

  class SetterCaptor < Captor
    def capture(msg)
      raise msg
    rescue => self.captured_error
      :caught
    end
  end

  class SquareBracketsCaptor < Captor
    def capture(msg)
      @hash = {}

      raise msg
    rescue => self[:error]
      :caught
    end

    def []=(key, value)
      @hash[key] = value
    end

    def captured_error
      @hash[:error]
    end
  end
end