rspec-expectations 2.8.0 → 2.9.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.document +5 -0
  2. data/.yardopts +3 -0
  3. data/Changelog.md +176 -0
  4. data/README.md +2 -13
  5. data/features/custom_matchers/access_running_example.feature +1 -1
  6. data/features/step_definitions/additional_cli_steps.rb +4 -4
  7. data/lib/rspec/expectations/fail_with.rb +3 -3
  8. data/lib/rspec/expectations/handler.rb +3 -5
  9. data/lib/rspec/expectations/version.rb +1 -1
  10. data/lib/rspec/matchers.rb +387 -21
  11. data/lib/rspec/matchers/built_in.rb +33 -0
  12. data/lib/rspec/matchers/built_in/base_matcher.rb +58 -0
  13. data/lib/rspec/matchers/built_in/be.rb +183 -0
  14. data/lib/rspec/matchers/built_in/be_instance_of.rb +13 -0
  15. data/lib/rspec/matchers/built_in/be_kind_of.rb +13 -0
  16. data/lib/rspec/matchers/built_in/be_within.rb +39 -0
  17. data/lib/rspec/matchers/built_in/change.rb +132 -0
  18. data/lib/rspec/matchers/built_in/cover.rb +22 -0
  19. data/lib/rspec/matchers/built_in/eq.rb +26 -0
  20. data/lib/rspec/matchers/built_in/eql.rb +25 -0
  21. data/lib/rspec/matchers/built_in/equal.rb +48 -0
  22. data/lib/rspec/matchers/built_in/exist.rb +28 -0
  23. data/lib/rspec/matchers/built_in/has.rb +47 -0
  24. data/lib/rspec/matchers/built_in/have.rb +107 -0
  25. data/lib/rspec/matchers/built_in/include.rb +52 -0
  26. data/lib/rspec/matchers/built_in/match.rb +13 -0
  27. data/lib/rspec/matchers/built_in/match_array.rb +52 -0
  28. data/lib/rspec/matchers/built_in/raise_error.rb +96 -0
  29. data/lib/rspec/matchers/built_in/respond_to.rb +73 -0
  30. data/lib/rspec/matchers/built_in/satisfy.rb +29 -0
  31. data/lib/rspec/matchers/built_in/throw_symbol.rb +93 -0
  32. data/lib/rspec/matchers/dsl.rb +1 -1
  33. data/lib/rspec/matchers/matcher.rb +263 -233
  34. data/lib/rspec/matchers/method_missing.rb +2 -2
  35. data/lib/rspec/matchers/operator_matcher.rb +19 -20
  36. data/spec/rspec/expectations/handler_spec.rb +1 -1
  37. data/spec/rspec/matchers/base_matcher_spec.rb +1 -2
  38. data/spec/rspec/matchers/change_spec.rb +3 -3
  39. data/spec/rspec/matchers/cover_spec.rb +46 -46
  40. data/spec/rspec/matchers/dsl_spec.rb +36 -3
  41. data/spec/rspec/matchers/have_spec.rb +2 -2
  42. data/spec/rspec/matchers/include_spec.rb +1 -1
  43. data/spec/rspec/matchers/matcher_spec.rb +319 -305
  44. data/spec/rspec/matchers/method_missing_spec.rb +1 -0
  45. data/spec/rspec/matchers/operator_matcher_spec.rb +2 -2
  46. data/spec/rspec/matchers/throw_symbol_spec.rb +103 -105
  47. metadata +93 -39
  48. data/lib/rspec/matchers/base_matcher.rb +0 -56
  49. data/lib/rspec/matchers/be.rb +0 -232
  50. data/lib/rspec/matchers/be_instance_of.rb +0 -24
  51. data/lib/rspec/matchers/be_kind_of.rb +0 -24
  52. data/lib/rspec/matchers/be_within.rb +0 -47
  53. data/lib/rspec/matchers/change.rb +0 -197
  54. data/lib/rspec/matchers/cover.rb +0 -36
  55. data/lib/rspec/matchers/eq.rb +0 -36
  56. data/lib/rspec/matchers/eql.rb +0 -35
  57. data/lib/rspec/matchers/equal.rb +0 -58
  58. data/lib/rspec/matchers/errors.rb +0 -5
  59. data/lib/rspec/matchers/exist.rb +0 -34
  60. data/lib/rspec/matchers/has.rb +0 -44
  61. data/lib/rspec/matchers/have.rb +0 -162
  62. data/lib/rspec/matchers/include.rb +0 -66
  63. data/lib/rspec/matchers/match.rb +0 -21
  64. data/lib/rspec/matchers/match_array.rb +0 -65
  65. data/lib/rspec/matchers/raise_error.rb +0 -116
  66. data/lib/rspec/matchers/respond_to.rb +0 -80
  67. data/lib/rspec/matchers/satisfy.rb +0 -46
  68. data/lib/rspec/matchers/throw_symbol.rb +0 -112
@@ -0,0 +1,73 @@
1
+ module RSpec
2
+ module Matchers
3
+ module BuiltIn
4
+ class RespondTo
5
+ def initialize(*names)
6
+ @names = names
7
+ @expected_arity = nil
8
+ end
9
+
10
+ def matches?(actual)
11
+ find_failing_method_names(actual, :reject).empty?
12
+ end
13
+
14
+ def does_not_match?(actual)
15
+ find_failing_method_names(actual, :select).empty?
16
+ end
17
+
18
+ def failure_message_for_should
19
+ "expected #{@actual.inspect} to respond to #{@failing_method_names.collect {|name| name.inspect }.join(', ')}#{with_arity}"
20
+ end
21
+
22
+ def failure_message_for_should_not
23
+ failure_message_for_should.sub(/to respond to/, 'not to respond to')
24
+ end
25
+
26
+ def description
27
+ "respond to #{pp_names}#{with_arity}"
28
+ end
29
+
30
+ def with(n)
31
+ @expected_arity = n
32
+ self
33
+ end
34
+
35
+ def argument
36
+ self
37
+ end
38
+ alias :arguments :argument
39
+
40
+ private
41
+
42
+ def find_failing_method_names(actual, filter_method)
43
+ @actual = actual
44
+ @failing_method_names = @names.send(filter_method) do |name|
45
+ @actual.respond_to?(name) && matches_arity?(actual, name)
46
+ end
47
+ end
48
+
49
+ def matches_arity?(actual, name)
50
+ return true unless @expected_arity
51
+
52
+ actual_arity = actual.method(name).arity
53
+ if actual_arity < 0
54
+ # ~ inverts the one's complement and gives us the number of required args
55
+ ~actual_arity <= @expected_arity
56
+ else
57
+ actual_arity == @expected_arity
58
+ end
59
+ end
60
+
61
+ def with_arity
62
+ @expected_arity.nil?? "" :
63
+ " with #{@expected_arity} argument#{@expected_arity == 1 ? '' : 's'}"
64
+ end
65
+
66
+ def pp_names
67
+ # Ruby 1.9 returns the same thing for array.to_s as array.inspect, so just use array.inspect here
68
+ @names.length == 1 ? "##{@names.first}" : @names.inspect
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,29 @@
1
+ module RSpec
2
+ module Matchers
3
+ module BuiltIn
4
+ class Satisfy
5
+ def initialize(&block)
6
+ @block = block
7
+ end
8
+
9
+ def matches?(actual, &block)
10
+ @block = block if block
11
+ @actual = actual
12
+ @block.call(actual)
13
+ end
14
+
15
+ def failure_message_for_should
16
+ "expected #{@actual} to satisfy block"
17
+ end
18
+
19
+ def failure_message_for_should_not
20
+ "expected #{@actual} not to satisfy block"
21
+ end
22
+
23
+ def description
24
+ "satisfy block"
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,93 @@
1
+ module RSpec
2
+ module Matchers
3
+ module BuiltIn
4
+ class ThrowSymbol
5
+ def initialize(expected_symbol = nil, expected_arg=nil)
6
+ @expected_symbol = expected_symbol
7
+ @expected_arg = expected_arg
8
+ @caught_symbol = @caught_arg = nil
9
+ end
10
+
11
+ def matches?(given_proc)
12
+ begin
13
+ if @expected_symbol.nil?
14
+ given_proc.call
15
+ else
16
+ @caught_arg = catch :proc_did_not_throw_anything do
17
+ catch @expected_symbol do
18
+ given_proc.call
19
+ throw :proc_did_not_throw_anything, :nothing_thrown
20
+ end
21
+ end
22
+
23
+ if @caught_arg == :nothing_thrown
24
+ @caught_arg = nil
25
+ else
26
+ @caught_symbol = @expected_symbol
27
+ end
28
+ end
29
+
30
+ # Ruby 1.8 uses NameError with `symbol'
31
+ # Ruby 1.9 uses ArgumentError with :symbol
32
+ rescue NameError, ArgumentError => e
33
+ unless e.message =~ /uncaught throw (`|\:)([a-zA-Z0-9_]*)(')?/
34
+ other_exception = e
35
+ raise
36
+ end
37
+ @caught_symbol = $2.to_sym
38
+ rescue => other_exception
39
+ raise
40
+ ensure
41
+ unless other_exception
42
+ if @expected_symbol.nil?
43
+ return !@caught_symbol.nil?
44
+ else
45
+ if @expected_arg.nil?
46
+ return @caught_symbol == @expected_symbol
47
+ else
48
+ return (@caught_symbol == @expected_symbol) & (@caught_arg == @expected_arg)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ def failure_message_for_should
56
+ "expected #{expected} to be thrown, got #{caught}"
57
+ end
58
+
59
+ def failure_message_for_should_not
60
+ "expected #{expected('no Symbol')}#{' not' if @expected_symbol} to be thrown, got #{caught}"
61
+ end
62
+
63
+ def description
64
+ "throw #{expected}"
65
+ end
66
+
67
+ private
68
+
69
+ def expected(symbol_desc = 'a Symbol')
70
+ throw_description(@expected_symbol || symbol_desc, @expected_arg)
71
+ end
72
+
73
+ def caught
74
+ throw_description(@caught_symbol || 'nothing', @caught_arg)
75
+ end
76
+
77
+ def throw_description(symbol, arg)
78
+ symbol_description = symbol.is_a?(String) ? symbol : symbol.inspect
79
+
80
+ arg_description = if arg
81
+ " with #{arg.inspect}"
82
+ elsif @expected_arg && @caught_symbol == @expected_symbol
83
+ " with no argument"
84
+ else
85
+ ""
86
+ end
87
+
88
+ symbol_description + arg_description
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -4,7 +4,7 @@ module RSpec
4
4
  # Defines a custom matcher.
5
5
  # @see RSpec::Matchers
6
6
  def define(name, &declarations)
7
- matcher = RSpec::Matchers::Matcher.new(name, &declarations)
7
+ matcher = RSpec::Matchers::DSL::Matcher.new(name, &declarations)
8
8
  define_method name do |*expected|
9
9
  $matcher_execution_context = self
10
10
  matcher.for_expected(*expected)
@@ -1,266 +1,296 @@
1
+ require 'set'
2
+
1
3
  module RSpec
2
4
  module Matchers
3
- # Provides the context in which the block passed to RSpec::Matchers.define
4
- # will be evaluated.
5
- class Matcher
6
- include RSpec::Matchers::Extensions::InstanceEvalWithArgs
7
- include RSpec::Matchers::Pretty
8
- include RSpec::Matchers
5
+ module DSL
6
+ # Provides the context in which the block passed to RSpec::Matchers.define
7
+ # will be evaluated.
8
+ class Matcher
9
+ include RSpec::Matchers::Extensions::InstanceEvalWithArgs
10
+ include RSpec::Matchers::Pretty
11
+ include RSpec::Matchers
9
12
 
10
- attr_reader :expected, :actual, :rescued_exception
13
+ attr_reader :expected, :actual, :rescued_exception
11
14
 
12
- # @api private
13
- def initialize(name, &declarations)
14
- @name = name
15
- @declarations = declarations
16
- @actual = nil
17
- @diffable = false
18
- @expected_exception, @rescued_exception = nil, nil
19
- @match_for_should_not_block = nil
15
+ # @api private
16
+ def initialize(name, &declarations)
17
+ @name = name
18
+ @declarations = declarations
19
+ @actual = nil
20
+ @diffable = false
21
+ @expected_exception, @rescued_exception = nil, nil
22
+ @match_for_should_not_block = nil
23
+ @messages = {}
24
+ end
20
25
 
21
- @messages = {
22
- :description => lambda {"#{name_to_sentence}#{expected_to_sentence}"},
23
- :failure_message_for_should => lambda {|actual| "expected #{actual.inspect} to #{name_to_sentence}#{expected_to_sentence}"},
24
- :failure_message_for_should_not => lambda {|actual| "expected #{actual.inspect} not to #{name_to_sentence}#{expected_to_sentence}"}
25
- }
26
- end
26
+ PERSISENT_INSTANCE_VARIABLES = [
27
+ :@name, :@declarations, :@diffable, :@messages,
28
+ :@match_block, :@match_for_should_not_block,
29
+ :@expected_exception
30
+ ].to_set
27
31
 
28
- # @api private
29
- def for_expected(*expected)
30
- @expected = expected
31
- making_declared_methods_public do
32
- instance_eval_with_args(*@expected, &@declarations)
32
+ # @api private
33
+ def for_expected(*expected)
34
+ @expected = expected
35
+ dup.instance_eval do
36
+ instance_variables.map {|ivar| ivar.intern}.each do |ivar|
37
+ instance_variable_set(ivar, nil) unless (PERSISENT_INSTANCE_VARIABLES + [:@expected]).include?(ivar)
38
+ end
39
+ making_declared_methods_public do
40
+ instance_eval_with_args(*@expected, &@declarations)
41
+ end
42
+ self
43
+ end
33
44
  end
34
- self
35
- end
36
45
 
37
- # @api private
38
- # Used internally by +should+ and +should_not+.
39
- def matches?(actual)
40
- @actual = actual
41
- if @expected_exception
42
- begin
43
- instance_eval_with_args(actual, &@match_block)
44
- true
45
- rescue @expected_exception => @rescued_exception
46
- false
47
- end
48
- else
49
- begin
50
- instance_eval_with_args(actual, &@match_block)
51
- rescue RSpec::Expectations::ExpectationNotMetError
52
- false
46
+ # @api private
47
+ # Used internally by +should+ and +should_not+.
48
+ def matches?(actual)
49
+ @actual = actual
50
+ if @expected_exception
51
+ begin
52
+ instance_eval_with_args(actual, &@match_block)
53
+ true
54
+ rescue @expected_exception => @rescued_exception
55
+ false
56
+ end
57
+ else
58
+ begin
59
+ instance_eval_with_args(actual, &@match_block)
60
+ rescue RSpec::Expectations::ExpectationNotMetError
61
+ false
62
+ end
53
63
  end
54
64
  end
55
- end
56
65
 
57
- # Stores the block that is used to determine whether this matcher passes
58
- # or fails. The block should return a boolean value. When the matcher is
59
- # passed to `should` and the block returns `true`, then the expectation
60
- # passes. Similarly, when the matcher is passed to `should_not` and the
61
- # block returns `false`, then the expectation passes.
62
- #
63
- # Use `match_for_should` when used in conjuntion with
64
- # `match_for_should_not`.
65
- #
66
- # @example
67
- #
68
- # RSpec::Matchers.define :be_even do
69
- # match do |actual|
70
- # actual.even?
71
- # end
72
- # end
73
- #
74
- # 4.should be_even # passes
75
- # 3.should_not be_even # passes
76
- # 3.should be_even # fails
77
- # 4.should_not be_even # fails
78
- #
79
- # @yield [Object] actual the actual value (or receiver of should)
80
- def match(&block)
81
- @match_block = block
82
- end
66
+ # Stores the block that is used to determine whether this matcher passes
67
+ # or fails. The block should return a boolean value. When the matcher is
68
+ # passed to `should` and the block returns `true`, then the expectation
69
+ # passes. Similarly, when the matcher is passed to `should_not` and the
70
+ # block returns `false`, then the expectation passes.
71
+ #
72
+ # Use `match_for_should` when used in conjuntion with
73
+ # `match_for_should_not`.
74
+ #
75
+ # @example
76
+ #
77
+ # RSpec::Matchers.define :be_even do
78
+ # match do |actual|
79
+ # actual.even?
80
+ # end
81
+ # end
82
+ #
83
+ # 4.should be_even # passes
84
+ # 3.should_not be_even # passes
85
+ # 3.should be_even # fails
86
+ # 4.should_not be_even # fails
87
+ #
88
+ # @yield [Object] actual the actual value (or receiver of should)
89
+ def match(&block)
90
+ @match_block = block
91
+ end
83
92
 
84
- alias_method :match_for_should, :match
93
+ alias_method :match_for_should, :match
85
94
 
86
- # Use this to define the block for a negative expectation (`should_not`)
87
- # when the positive and negative forms require different handling. This
88
- # is rarely necessary, but can be helpful, for example, when specifying
89
- # asynchronous processes that require different timeouts.
90
- #
91
- # @yield [Object] actual the actual value (or receiver of should)
92
- def match_for_should_not(&block)
93
- @match_for_should_not_block = block
94
- end
95
+ # Use this to define the block for a negative expectation (`should_not`)
96
+ # when the positive and negative forms require different handling. This
97
+ # is rarely necessary, but can be helpful, for example, when specifying
98
+ # asynchronous processes that require different timeouts.
99
+ #
100
+ # @yield [Object] actual the actual value (or receiver of should)
101
+ def match_for_should_not(&block)
102
+ @match_for_should_not_block = block
103
+ end
95
104
 
96
- # Use this instead of `match` when the block will raise an exception
97
- # rather than returning false to indicate a failure.
98
- #
99
- # @example
100
- #
101
- # RSpec::Matchers.define :accept_as_valid do |candidate_address|
102
- # match_unless_raises ValidationException do |validator|
103
- # validator.validate(candidate_address)
104
- # end
105
- # end
106
- #
107
- # email_validator.should accept_as_valid("person@company.com")
108
- def match_unless_raises(exception=Exception, &block)
109
- @expected_exception = exception
110
- match(&block)
111
- end
105
+ # Use this instead of `match` when the block will raise an exception
106
+ # rather than returning false to indicate a failure.
107
+ #
108
+ # @example
109
+ #
110
+ # RSpec::Matchers.define :accept_as_valid do |candidate_address|
111
+ # match_unless_raises ValidationException do |validator|
112
+ # validator.validate(candidate_address)
113
+ # end
114
+ # end
115
+ #
116
+ # email_validator.should accept_as_valid("person@company.com")
117
+ def match_unless_raises(exception=Exception, &block)
118
+ @expected_exception = exception
119
+ match(&block)
120
+ end
112
121
 
113
- # Customize the failure messsage to use when this matcher is invoked with
114
- # `should`. Only use this when the message generated by default doesn't
115
- # suit your needs.
116
- #
117
- # @example
118
- #
119
- # RSpec::Matchers.define :have_strength do |expected|
120
- # match { ... }
121
- #
122
- # failure_message_for_should do |actual|
123
- # "Expected strength of #{expected}, but had #{actual.strength}"
124
- # end
125
- # end
126
- #
127
- # @yield [Object] actual the actual object
128
- def failure_message_for_should(&block)
129
- cache_or_call_cached(:failure_message_for_should, &block)
130
- end
122
+ # Customize the failure messsage to use when this matcher is invoked with
123
+ # `should`. Only use this when the message generated by default doesn't
124
+ # suit your needs.
125
+ #
126
+ # @example
127
+ #
128
+ # RSpec::Matchers.define :have_strength do |expected|
129
+ # match { ... }
130
+ #
131
+ # failure_message_for_should do |actual|
132
+ # "Expected strength of #{expected}, but had #{actual.strength}"
133
+ # end
134
+ # end
135
+ #
136
+ # @yield [Object] actual the actual object
137
+ def failure_message_for_should(&block)
138
+ cache_or_call_cached(:failure_message_for_should, &block)
139
+ end
131
140
 
132
- # Customize the failure messsage to use when this matcher is invoked with
133
- # `should_not`. Only use this when the message generated by default
134
- # doesn't suit your needs.
135
- #
136
- # @example
137
- #
138
- # RSpec::Matchers.define :have_strength do |expected|
139
- # match { ... }
140
- #
141
- # failure_message_for_should_not do |actual|
142
- # "Expected not to have strength of #{expected}, but did"
143
- # end
144
- # end
145
- #
146
- # @yield [Object] actual the actual object
147
- # @yield [Object] actual the actual object
148
- def failure_message_for_should_not(&block)
149
- cache_or_call_cached(:failure_message_for_should_not, &block)
150
- end
141
+ # Customize the failure messsage to use when this matcher is invoked with
142
+ # `should_not`. Only use this when the message generated by default
143
+ # doesn't suit your needs.
144
+ #
145
+ # @example
146
+ #
147
+ # RSpec::Matchers.define :have_strength do |expected|
148
+ # match { ... }
149
+ #
150
+ # failure_message_for_should_not do |actual|
151
+ # "Expected not to have strength of #{expected}, but did"
152
+ # end
153
+ # end
154
+ #
155
+ # @yield [Object] actual the actual object
156
+ # @yield [Object] actual the actual object
157
+ def failure_message_for_should_not(&block)
158
+ cache_or_call_cached(:failure_message_for_should_not, &block)
159
+ end
151
160
 
152
161
 
153
- # Customize the description to use for one-liners. Only use this when
154
- # the description generated by default doesn't suit your needs.
155
- #
156
- # @example
157
- #
158
- # RSpec::Matchers.define :qualify_for do |expected|
159
- # match { ... }
160
- #
161
- # description do
162
- # "qualify for #{expected}"
163
- # end
164
- # end
165
- def description(&block)
166
- cache_or_call_cached(:description, &block)
167
- end
162
+ # Customize the description to use for one-liners. Only use this when
163
+ # the description generated by default doesn't suit your needs.
164
+ #
165
+ # @example
166
+ #
167
+ # RSpec::Matchers.define :qualify_for do |expected|
168
+ # match { ... }
169
+ #
170
+ # description do
171
+ # "qualify for #{expected}"
172
+ # end
173
+ # end
174
+ def description(&block)
175
+ cache_or_call_cached(:description, &block)
176
+ end
168
177
 
169
- # Tells the matcher to diff the actual and expected values in the failure
170
- # message.
171
- def diffable
172
- @diffable = true
173
- end
174
-
175
- # Convenience for defining methods on this matcher to create a fluent
176
- # interface. The trick about fluent interfaces is that each method must
177
- # return self in order to chain methods together. `chain` handles that
178
- # for you.
179
- #
180
- # @example
181
- #
182
- # RSpec::Matchers.define :have_errors_on do |key|
183
- # chain :with do |message|
184
- # @message = message
185
- # end
186
- #
187
- # match do |actual|
188
- # actual.errors[key] == @message
189
- # end
190
- # end
191
- #
192
- # minor.should have_errors_on(:age).with("Not old enough to participate")
193
- def chain(method, &block)
194
- define_method method do |*args|
195
- block.call(*args)
196
- self
178
+ # Tells the matcher to diff the actual and expected values in the failure
179
+ # message.
180
+ def diffable
181
+ @diffable = true
197
182
  end
198
- end
199
-
200
- # @api private
201
- # Used internally by objects returns by +should+ and +should_not+.
202
- def diffable?
203
- @diffable
204
- end
205
183
 
206
- # @api private
207
- # Used internally by +should_not+
208
- def does_not_match?(actual)
209
- @actual = actual
210
- @match_for_should_not_block ?
211
- instance_eval_with_args(actual, &@match_for_should_not_block) :
212
- !matches?(actual)
213
- end
184
+ # Convenience for defining methods on this matcher to create a fluent
185
+ # interface. The trick about fluent interfaces is that each method must
186
+ # return self in order to chain methods together. `chain` handles that
187
+ # for you.
188
+ #
189
+ # @example
190
+ #
191
+ # RSpec::Matchers.define :have_errors_on do |key|
192
+ # chain :with do |message|
193
+ # @message = message
194
+ # end
195
+ #
196
+ # match do |actual|
197
+ # actual.errors[key] == @message
198
+ # end
199
+ # end
200
+ #
201
+ # minor.should have_errors_on(:age).with("Not old enough to participate")
202
+ def chain(method, &block)
203
+ define_method method do |*args|
204
+ block.call(*args)
205
+ self
206
+ end
207
+ end
208
+
209
+ # @api private
210
+ # Used internally by objects returns by +should+ and +should_not+.
211
+ def diffable?
212
+ @diffable
213
+ end
214
214
 
215
- private
215
+ # @api private
216
+ # Used internally by +should_not+
217
+ def does_not_match?(actual)
218
+ @actual = actual
219
+ @match_for_should_not_block ?
220
+ instance_eval_with_args(actual, &@match_for_should_not_block) :
221
+ !matches?(actual)
222
+ end
216
223
 
217
- def include(*args)
218
- singleton_class.__send__(:include, *args)
219
- end
224
+ def respond_to?(method, include_private=false)
225
+ $matcher_execution_context.respond_to?(method, include_private) || super
226
+ end
220
227
 
221
- def define_method(name, &block)
222
- singleton_class.__send__(:define_method, name, &block)
223
- end
228
+ private
224
229
 
225
- def method_missing(method, *args, &block)
226
- if $matcher_execution_context.respond_to?(method)
227
- $matcher_execution_context.send method, *args, &block
228
- else
229
- super(method, *args, &block)
230
+ def method_missing(method, *args, &block)
231
+ if $matcher_execution_context.respond_to?(method)
232
+ $matcher_execution_context.send method, *args, &block
233
+ else
234
+ super(method, *args, &block)
235
+ end
230
236
  end
231
- end
232
-
233
- def making_declared_methods_public
234
- # Our home-grown instance_exec in ruby 1.8.6 results in any methods
235
- # declared in the block eval'd by instance_exec in the block to which we
236
- # are yielding here are scoped private. This is NOT the case for Ruby
237
- # 1.8.7 or 1.9.
238
- #
239
- # Also, due some crazy scoping that I don't understand, these methods
240
- # are actually available in the specs (something about the matcher being
241
- # defined in the scope of RSpec::Matchers or within an example), so not
242
- # doing the following will not cause specs to fail, but they *will*
243
- # cause features to fail and that will make users unhappy. So don't.
244
- orig_private_methods = private_methods
245
- yield
246
- (private_methods - orig_private_methods).each {|m| singleton_class.__send__ :public, m}
247
- end
248
237
 
249
- def cache_or_call_cached(key, &block)
250
- block ? cache(key, &block) : call_cached(key)
251
- end
238
+ def include(*args)
239
+ singleton_class.__send__(:include, *args)
240
+ end
252
241
 
253
- def cache(key, &block)
254
- @messages[key] = block
255
- end
242
+ def define_method(name, &block)
243
+ singleton_class.__send__(:define_method, name, &block)
244
+ end
256
245
 
257
- def call_cached(key)
258
- @messages[key].arity == 1 ? @messages[key].call(@actual) : @messages[key].call
259
- end
246
+ def making_declared_methods_public
247
+ # Our home-grown instance_exec in ruby 1.8.6 results in any methods
248
+ # declared in the block eval'd by instance_exec in the block to which we
249
+ # are yielding here are scoped private. This is NOT the case for Ruby
250
+ # 1.8.7 or 1.9.
251
+ #
252
+ # Also, due some crazy scoping that I don't understand, these methods
253
+ # are actually available in the specs (something about the matcher being
254
+ # defined in the scope of RSpec::Matchers or within an example), so not
255
+ # doing the following will not cause specs to fail, but they *will*
256
+ # cause features to fail and that will make users unhappy. So don't.
257
+ orig_private_methods = private_methods
258
+ yield
259
+ (private_methods - orig_private_methods).each {|m| singleton_class.__send__ :public, m}
260
+ end
260
261
 
261
- unless method_defined?(:singleton_class)
262
- def singleton_class
263
- class << self; self; end
262
+ def cache_or_call_cached(key, &block)
263
+ block ? cache(key, &block) : call_cached(key)
264
+ end
265
+
266
+ def cache(key, &block)
267
+ @messages[key] = block
268
+ end
269
+
270
+ def call_cached(key)
271
+ if @messages.has_key?(key)
272
+ @messages[key].arity == 1 ? @messages[key].call(@actual) : @messages[key].call
273
+ else
274
+ send("default_#{key}")
275
+ end
276
+ end
277
+
278
+ def default_description
279
+ "#{name_to_sentence}#{expected_to_sentence}"
280
+ end
281
+
282
+ def default_failure_message_for_should
283
+ "expected #{actual.inspect} to #{name_to_sentence}#{expected_to_sentence}"
284
+ end
285
+
286
+ def default_failure_message_for_should_not
287
+ "expected #{actual.inspect} not to #{name_to_sentence}#{expected_to_sentence}"
288
+ end
289
+
290
+ unless method_defined?(:singleton_class)
291
+ def singleton_class
292
+ class << self; self; end
293
+ end
264
294
  end
265
295
  end
266
296
  end