Upgraded Rails and RSpec
[monkeycharger.git] / vendor / plugins / rspec / lib / spec / matchers / raise_error.rb
blob0eceb9fb05d19ca8644dfa8b42f5b56bf56d49fa
1 module Spec
2   module Matchers
3     
4     class RaiseError #:nodoc:
5       def initialize(exception=Exception, message=nil)
6         @expected_error = exception
7         @expected_message = message
8       end
9       
10       def matches?(proc)
11         @raised_expected_error = false
12         @raised_other = false
13         begin
14           proc.call
15         rescue @expected_error => @actual_error
16           if @expected_message.nil?
17             @raised_expected_error = true
18           else
19             case @expected_message
20             when Regexp
21               if @expected_message =~ @actual_error.message
22                 @raised_expected_error = true
23               else
24                 @raised_other = true
25               end
26             else
27               if @expected_message == @actual_error.message
28                 @raised_expected_error = true
29               else
30                 @raised_other = true
31               end
32             end
33           end
34         rescue => @actual_error
35           @raised_other = true
36         ensure
37           return @raised_expected_error
38         end
39       end
40       
41       def failure_message
42         return "expected #{expected_error}#{actual_error}" if @raised_other || !@raised_expected_error
43       end
45       def negative_failure_message
46         "expected no #{expected_error}#{actual_error}"
47       end
48       
49       def description
50         "raise #{expected_error}"
51       end
52       
53       private
54         def expected_error
55           case @expected_message
56           when nil
57             @expected_error
58           when Regexp
59             "#{@expected_error} with message matching #{@expected_message.inspect}"
60           else
61             "#{@expected_error} with #{@expected_message.inspect}"
62           end
63         end
65         def actual_error
66           @actual_error.nil? ? " but nothing was raised" : ", got #{@actual_error.inspect}"
67         end
68     end
69     
70     # :call-seq:
71     #   should raise_error()
72     #   should raise_error(NamedError)
73     #   should raise_error(NamedError, String)
74     #   should raise_error(NamedError, Regexp)
75     #   should_not raise_error()
76     #   should_not raise_error(NamedError)
77     #   should_not raise_error(NamedError, String)
78     #   should_not raise_error(NamedError, Regexp)
79     #
80     # With no args, matches if any error is raised.
81     # With a named error, matches only if that specific error is raised.
82     # With a named error and messsage specified as a String, matches only if both match.
83     # With a named error and messsage specified as a Regexp, matches only if both match.
84     #
85     # == Examples
86     #
87     #   lambda { do_something_risky }.should raise_error
88     #   lambda { do_something_risky }.should raise_error(PoorRiskDecisionError)
89     #   lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, "that was too risky")
90     #   lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, /oo ri/)
91     #
92     #   lambda { do_something_risky }.should_not raise_error
93     #   lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError)
94     #   lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, "that was too risky")
95     #   lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, /oo ri/)
96     def raise_error(error=Exception, message=nil)
97       Matchers::RaiseError.new(error, message)
98     end
99   end