rspec-expectations 2.13.0 → 2.14.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. data/Changelog.md +34 -0
  2. data/README.md +43 -87
  3. data/features/README.md +8 -9
  4. data/features/built_in_matchers/README.md +41 -41
  5. data/features/built_in_matchers/be_within.feature +3 -3
  6. data/features/built_in_matchers/expect_change.feature +6 -6
  7. data/features/built_in_matchers/expect_error.feature +2 -2
  8. data/features/built_in_matchers/start_with.feature +1 -1
  9. data/features/built_in_matchers/throw_symbol.feature +11 -11
  10. data/features/built_in_matchers/yield.feature +18 -3
  11. data/features/custom_matchers/define_diffable_matcher.feature +1 -1
  12. data/features/custom_matchers/define_matcher_outside_rspec.feature +6 -6
  13. data/features/custom_matchers/define_matcher_with_fluent_interface.feature +1 -1
  14. data/features/customized_message.feature +1 -1
  15. data/features/support/env.rb +10 -1
  16. data/features/syntax_configuration.feature +3 -0
  17. data/features/test_frameworks/test_unit.feature +15 -17
  18. data/lib/rspec/expectations.rb +1 -1
  19. data/lib/rspec/expectations/deprecation.rb +12 -33
  20. data/lib/rspec/expectations/differ.rb +25 -7
  21. data/lib/rspec/expectations/expectation_target.rb +7 -8
  22. data/lib/rspec/expectations/extensions/object.rb +2 -12
  23. data/lib/rspec/expectations/fail_with.rb +11 -1
  24. data/lib/rspec/expectations/handler.rb +11 -6
  25. data/lib/rspec/expectations/syntax.rb +2 -2
  26. data/lib/rspec/expectations/version.rb +1 -1
  27. data/lib/rspec/matchers.rb +134 -144
  28. data/lib/rspec/matchers/be_close.rb +1 -1
  29. data/lib/rspec/matchers/built_in/be_within.rb +1 -1
  30. data/lib/rspec/matchers/built_in/have.rb +20 -4
  31. data/lib/rspec/matchers/built_in/raise_error.rb +23 -7
  32. data/lib/rspec/matchers/built_in/yield.rb +78 -3
  33. data/lib/rspec/matchers/operator_matcher.rb +1 -1
  34. data/lib/rspec/matchers/test_unit_integration.rb +11 -0
  35. data/spec/rspec/expectations/differ_spec.rb +27 -5
  36. data/spec/rspec/expectations/expectation_target_spec.rb +10 -3
  37. data/spec/rspec/expectations/extensions/kernel_spec.rb +5 -5
  38. data/spec/rspec/expectations/fail_with_spec.rb +19 -0
  39. data/spec/rspec/expectations/handler_spec.rb +42 -21
  40. data/spec/rspec/expectations/syntax_spec.rb +45 -3
  41. data/spec/rspec/matchers/be_close_spec.rb +6 -6
  42. data/spec/rspec/matchers/be_spec.rb +36 -36
  43. data/spec/rspec/matchers/be_within_spec.rb +4 -0
  44. data/spec/rspec/matchers/change_spec.rb +6 -6
  45. data/spec/rspec/matchers/configuration_spec.rb +57 -89
  46. data/spec/rspec/matchers/description_generation_spec.rb +1 -1
  47. data/spec/rspec/matchers/exist_spec.rb +9 -9
  48. data/spec/rspec/matchers/has_spec.rb +1 -1
  49. data/spec/rspec/matchers/have_spec.rb +12 -2
  50. data/spec/rspec/matchers/include_matcher_integration_spec.rb +2 -2
  51. data/spec/rspec/matchers/include_spec.rb +4 -4
  52. data/spec/rspec/matchers/match_array_spec.rb +1 -1
  53. data/spec/rspec/matchers/match_spec.rb +1 -1
  54. data/spec/rspec/matchers/raise_error_spec.rb +189 -99
  55. data/spec/rspec/matchers/respond_to_spec.rb +4 -4
  56. data/spec/rspec/matchers/satisfy_spec.rb +1 -1
  57. data/spec/rspec/matchers/start_with_end_with_spec.rb +2 -2
  58. data/spec/rspec/matchers/yield_spec.rb +81 -4
  59. data/spec/spec_helper.rb +1 -1
  60. metadata +10 -12
@@ -2,7 +2,7 @@ module RSpec
2
2
  module Matchers
3
3
  # @deprecated use +be_within+ instead.
4
4
  def be_close(expected, delta)
5
- RSpec.deprecate("be_close(#{expected}, #{delta})", "be_within(#{delta}).of(#{expected})")
5
+ RSpec.deprecate("be_close(#{expected}, #{delta})", :replacement => "be_within(#{delta}).of(#{expected})")
6
6
  be_within(delta).of(expected)
7
7
  end
8
8
  end
@@ -23,7 +23,7 @@ module RSpec
23
23
 
24
24
  def percent_of(expected)
25
25
  @expected = expected
26
- @tolerance = @delta * @expected / 100
26
+ @tolerance = @delta * @expected / 100.0
27
27
  @unit = '%'
28
28
  self
29
29
  end
@@ -2,6 +2,8 @@ module RSpec
2
2
  module Matchers
3
3
  module BuiltIn
4
4
  class Have
5
+ QUERY_METHODS = [:size, :length, :count].freeze
6
+
5
7
  def initialize(expected, relativity=:exactly)
6
8
  @expected = case expected
7
9
  when :no then 0
@@ -22,9 +24,19 @@ module RSpec
22
24
 
23
25
  def matches?(collection_or_owner)
24
26
  collection = determine_collection(collection_or_owner)
25
- query_method = determine_query_method(collection)
26
- raise not_a_collection unless query_method
27
- @actual = collection.__send__(query_method)
27
+ case collection
28
+ when enumerator_class
29
+ for query_method in QUERY_METHODS
30
+ next unless collection.respond_to?(query_method)
31
+ @actual = collection.__send__(query_method)
32
+ break unless @actual.nil?
33
+ end
34
+ raise not_a_collection if @actual.nil?
35
+ else
36
+ query_method = determine_query_method(collection)
37
+ raise not_a_collection unless query_method
38
+ @actual = collection.__send__(query_method)
39
+ end
28
40
  case @relativity
29
41
  when :at_least then @actual >= @expected
30
42
  when :at_most then @actual <= @expected
@@ -46,7 +58,7 @@ module RSpec
46
58
  end
47
59
 
48
60
  def determine_query_method(collection)
49
- [:size, :length, :count].detect {|m| collection.respond_to?(m)}
61
+ QUERY_METHODS.detect {|m| collection.respond_to?(m)}
50
62
  end
51
63
 
52
64
  def not_a_collection
@@ -102,6 +114,10 @@ EOF
102
114
  def relative_expectation
103
115
  "#{relativities[@relativity]}#{@expected}"
104
116
  end
117
+
118
+ def enumerator_class
119
+ RUBY_VERSION < '1.9' ? Enumerable::Enumerator : Enumerator
120
+ end
105
121
  end
106
122
  end
107
123
  end
@@ -14,19 +14,31 @@ module RSpec
14
14
  end
15
15
 
16
16
  def matches?(given_proc, negative_expectation = false)
17
+ if negative_expectation && (expecting_specific_exception? || @expected_message)
18
+ what_to_deprecate = if expecting_specific_exception? && @expected_message
19
+ "`expect { }.not_to raise_error(SpecificErrorClass, message)`"
20
+ elsif expecting_specific_exception?
21
+ "`expect { }.not_to raise_error(SpecificErrorClass)`"
22
+ elsif @expected_message
23
+ "`expect { }.not_to raise_error(message)`"
24
+ end
25
+ RSpec.deprecate(what_to_deprecate, :replacement => "`expect { }.not_to raise_error()`")
26
+ end
17
27
  @raised_expected_error = false
18
28
  @with_expected_message = false
19
29
  @eval_block = false
20
30
  @eval_block_passed = false
31
+ unless given_proc.respond_to?(:call)
32
+ ::Kernel.warn "`raise_error` was called with non-proc object #{given_proc.inspect}"
33
+ return false
34
+ end
21
35
  begin
22
36
  given_proc.call
23
- rescue @expected_error => @actual_error
24
- @raised_expected_error = true
25
- @with_expected_message = verify_message
26
37
  rescue Exception => @actual_error
27
- # This clause should be empty, but rcov will not report it as covered
28
- # unless something (anything) is executed within the clause
29
- "http://eigenclass.org/hiki.rb?rcov-0.8.0"
38
+ if @actual_error == @expected_error || @expected_error === @actual_error
39
+ @raised_expected_error = true
40
+ @with_expected_message = verify_message
41
+ end
30
42
  end
31
43
 
32
44
  unless negative_expectation
@@ -79,7 +91,7 @@ module RSpec
79
91
  def expected_error
80
92
  case @expected_message
81
93
  when nil
82
- @expected_error
94
+ @expected_error.inspect
83
95
  when Regexp
84
96
  "#{@expected_error} with message matching #{@expected_message.inspect}"
85
97
  else
@@ -101,6 +113,10 @@ module RSpec
101
113
  *backtrace
102
114
  ].join("\n # ")
103
115
  end
116
+
117
+ def expecting_specific_exception?
118
+ @expected_error != Exception
119
+ end
104
120
  end
105
121
  end
106
122
  end
@@ -65,17 +65,92 @@ module RSpec
65
65
  end
66
66
 
67
67
  class YieldControl < BaseMatcher
68
+ def initialize
69
+ @expectation_type = nil
70
+ @expected_yields_count = nil
71
+ end
72
+
68
73
  def matches?(block)
69
74
  probe = YieldProbe.probe(block)
70
- probe.yielded_once?(:yield_control)
75
+
76
+ if @expectation_type
77
+ probe.num_yields.send(@expectation_type, @expected_yields_count)
78
+ else
79
+ probe.yielded_once?(:yield_control)
80
+ end
81
+ end
82
+
83
+ def once
84
+ exactly(1)
85
+ self
86
+ end
87
+
88
+ def twice
89
+ exactly(2)
90
+ self
91
+ end
92
+
93
+ def exactly(number)
94
+ set_expected_yields_count(:==, number)
95
+ self
96
+ end
97
+
98
+ def at_most(number)
99
+ set_expected_yields_count(:<=, number)
100
+ self
101
+ end
102
+
103
+ def at_least(number)
104
+ set_expected_yields_count(:>=, number)
105
+ self
106
+ end
107
+
108
+ def times
109
+ self
71
110
  end
72
111
 
73
112
  def failure_message_for_should
74
- "expected given block to yield control"
113
+ 'expected given block to yield control'.tap do |failure_message|
114
+ failure_message << relativity_failure_message
115
+ end
75
116
  end
76
117
 
77
118
  def failure_message_for_should_not
78
- "expected given block not to yield control"
119
+ 'expected given block not to yield control'.tap do |failure_message|
120
+ failure_message << relativity_failure_message
121
+ end
122
+ end
123
+
124
+ private
125
+
126
+ def set_expected_yields_count(relativity, n)
127
+ @expectation_type = relativity
128
+ @expected_yields_count = case n
129
+ when Numeric then n
130
+ when :once then 1
131
+ when :twice then 2
132
+ end
133
+ end
134
+
135
+ def relativity_failure_message
136
+ return '' unless @expected_yields_count
137
+ " #{human_readable_expecation_type}#{human_readable_count}"
138
+ end
139
+
140
+ def human_readable_expecation_type
141
+ case @expectation_type
142
+ when :<= then 'at most '
143
+ when :>= then 'at least '
144
+ else ''
145
+ end
146
+ end
147
+
148
+ def human_readable_count
149
+ case @expected_yields_count
150
+ when 1 then "once"
151
+ when 2 then "twice"
152
+ else "#{@expected_yields_count} times"
153
+ end
79
154
  end
80
155
  end
81
156
 
@@ -91,7 +91,7 @@ module RSpec
91
91
  if actual.__send__(operator, expected)
92
92
  true
93
93
  elsif ['==','===', '=~'].include?(operator)
94
- fail_with_message("expected: #{expected.inspect}\n got: #{actual.inspect} (using #{operator})")
94
+ fail_with_message("expected: #{expected.inspect}\n got: #{actual.inspect} (using #{operator})")
95
95
  else
96
96
  fail_with_message("expected: #{operator} #{expected.inspect}\n got: #{operator.gsub(/./, ' ')} #{actual.inspect}")
97
97
  end
@@ -0,0 +1,11 @@
1
+ # Include Matchers for other test frameworks. Note that MiniTest _must_
2
+ # come before TU because on ruby 1.9, T::U::TC is a subclass of MT::U::TC
3
+ # and a 1.9 bug can lead to infinite recursion from the `super` call in our
4
+ # method_missing hook. See this gist for more info:
5
+ # https://gist.github.com/845896
6
+ if defined?(MiniTest::Unit::TestCase)
7
+ MiniTest::Unit::TestCase.send(:include, RSpec::Matchers)
8
+ end
9
+ if defined?(Test::Unit::TestCase)
10
+ Test::Unit::TestCase.send(:include, RSpec::Matchers)
11
+ end
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
  require 'ostruct'
3
4
 
@@ -13,10 +14,11 @@ module RSpec
13
14
  # color disabled context
14
15
 
15
16
  describe '#diff_as_string' do
17
+ subject { differ.diff_as_string(@expected, @actual) }
16
18
  it "outputs unified diff of two strings" do
17
- expected="foo\nbar\nzap\nthis\nis\nsoo\nvery\nvery\nequal\ninsert\na\nline\n"
18
- actual="foo\nzap\nbar\nthis\nis\nsoo\nvery\nvery\nequal\ninsert\na\nanother\nline\n"
19
- expected_diff= <<'EOD'
19
+ @expected="foo\nbar\nzap\nthis\nis\nsoo\nvery\nvery\nequal\ninsert\na\nline\n"
20
+ @actual="foo\nzap\nbar\nthis\nis\nsoo\nvery\nvery\nequal\ninsert\na\nanother\nline\n"
21
+ expect(subject).to eql(<<-'EOD')
20
22
 
21
23
 
22
24
  @@ -1,6 +1,6 @@
@@ -35,8 +37,28 @@ module RSpec
35
37
  line
36
38
  EOD
37
39
 
38
- diff = differ.diff_as_string(expected, actual)
39
- expect(diff).to eql(expected_diff)
40
+ end
41
+ if RUBY_VERSION.to_f > 1.9
42
+ it 'copes with encoded strings', :pending => (Diff::LCS::VERSION < '1.2.2') do
43
+ @expected="Tu avec carté {count} itém has".encode('UTF-16LE')
44
+ @actual="Tu avec carte {count} item has".encode('UTF-16LE')
45
+ expect(subject).to eql(<<-EOD.encode('UTF-16LE'))
46
+
47
+ @@ -1,2 +1,2 @@
48
+ -Tu avec carte {count} item has
49
+ +Tu avec carté {count} itém has
50
+ EOD
51
+ end
52
+ it 'copes with encoded strings', :pending => (Diff::LCS::VERSION >= '1.2.2') do
53
+ @expected="Tu avec carté {count} itém has".encode('UTF-16LE')
54
+ @actual="Tu avec carte {count} item has".encode('UTF-16LE')
55
+ expect(subject).to eql 'Could not produce a diff because of the encoding of the string (UTF-16LE)'
56
+ end
57
+ it 'ouputs a message when encountering differently encoded strings' do
58
+ @expected="Tu avec carté {count} itém has".encode('UTF-16LE')
59
+ @actual="Tu avec carte {count} item has"
60
+ expect(subject).to eql 'Could not produce a diff because the encoding of the actual string (UTF-8) differs from the encoding of the expected string (UTF-16LE)'
61
+ end
40
62
  end
41
63
  end
42
64
 
@@ -37,10 +37,13 @@ module RSpec
37
37
  end
38
38
 
39
39
  it 'passes a valid negative expectation' do
40
- expect(5).to_not eq(4)
41
40
  expect(5).not_to eq(4)
42
41
  end
43
42
 
43
+ it 'passes a valid negative expectation with a split infinitive' do
44
+ expect(5).to_not eq(4)
45
+ end
46
+
44
47
  it 'fails an invalid positive expectation' do
45
48
  expect {
46
49
  expect(5).to eq(4)
@@ -50,10 +53,14 @@ module RSpec
50
53
  it 'fails an invalid negative expectation' do
51
54
  message = /expected 5 not to be a kind of Fixnum/
52
55
  expect {
53
- expect(5).to_not be_a(Fixnum)
56
+ expect(5).not_to be_a(Fixnum)
54
57
  }.to fail_with(message)
58
+ end
59
+
60
+ it 'fails an invalid negative expectation with a split infinitive' do
61
+ message = /expected 5 not to be a kind of Fixnum/
55
62
  expect {
56
- expect(5).not_to be_a(Fixnum)
63
+ expect(5).to_not be_a(Fixnum)
57
64
  }.to fail_with(message)
58
65
  end
59
66
 
@@ -3,9 +3,9 @@ require 'spec_helper'
3
3
  describe Object, "#should" do
4
4
  before(:each) do
5
5
  @target = "target"
6
- @matcher = mock("matcher")
7
- @matcher.stub!(:matches?).and_return(true)
8
- @matcher.stub!(:failure_message_for_should)
6
+ @matcher = double("matcher")
7
+ @matcher.stub(:matches?).and_return(true)
8
+ @matcher.stub(:failure_message_for_should)
9
9
  end
10
10
 
11
11
  it "accepts and interacts with a matcher" do
@@ -47,12 +47,12 @@ end
47
47
  describe Object, "#should_not" do
48
48
  before(:each) do
49
49
  @target = "target"
50
- @matcher = mock("matcher")
50
+ @matcher = double("matcher")
51
51
  end
52
52
 
53
53
  it "accepts and interacts with a matcher" do
54
54
  @matcher.should_receive(:matches?).with(@target).and_return(false)
55
- @matcher.stub!(:failure_message_for_should_not)
55
+ @matcher.stub(:failure_message_for_should_not)
56
56
 
57
57
  expect(@target).not_to @matcher
58
58
  end
@@ -1,6 +1,25 @@
1
1
  # encoding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
+
5
+ describe RSpec::Expectations, "#fail_with with diff of arrays" do
6
+ before { RSpec::Matchers.configuration.stub(:color? => false) }
7
+
8
+ it "splits items with newlines" do
9
+ expected_diff = "\nDiff:\n@@ -1 +1,3 @@\n+a\\nb\n+c\\nd\n"
10
+ expect {
11
+ RSpec::Expectations.fail_with("", [], ["a\nb", "c\nd"])
12
+ }.to fail_with(expected_diff)
13
+ end
14
+
15
+ it "shows inner arrays on a single line" do
16
+ expected_diff = "\nDiff:\n@@ -1 +1,3 @@\n+a\\nb\n+[\"c\\nd\"]\n"
17
+ expect {
18
+ RSpec::Expectations.fail_with("", [], ["a\nb", ["c\nd"]])
19
+ }.to fail_with(expected_diff)
20
+ end
21
+ end
22
+
4
23
  describe RSpec::Expectations, "#fail_with with diff" do
5
24
  let(:differ) { double("differ") }
6
25
 
@@ -49,21 +49,21 @@ module RSpec
49
49
  describe PositiveExpectationHandler do
50
50
  describe "#handle_matcher" do
51
51
  it "asks the matcher if it matches" do
52
- matcher = mock("matcher")
52
+ matcher = double("matcher")
53
53
  actual = Object.new
54
54
  matcher.should_receive(:matches?).with(actual).and_return(true)
55
55
  RSpec::Expectations::PositiveExpectationHandler.handle_matcher(actual, matcher)
56
56
  end
57
57
 
58
58
  it "returns the match value" do
59
- matcher = mock("matcher")
59
+ matcher = double("matcher")
60
60
  actual = Object.new
61
61
  matcher.should_receive(:matches?).with(actual).and_return(:this_value)
62
62
  expect(RSpec::Expectations::PositiveExpectationHandler.handle_matcher(actual, matcher)).to eq :this_value
63
63
  end
64
64
 
65
65
  it "calls failure_message_for_should if the matcher implements it" do
66
- matcher = mock("matcher", :failure_message_for_should => "message", :matches? => false)
66
+ matcher = double("matcher", :failure_message_for_should => "message", :matches? => false)
67
67
  actual = Object.new
68
68
 
69
69
  ::RSpec::Expectations.should_receive(:fail_with).with("message")
@@ -72,7 +72,7 @@ module RSpec
72
72
  end
73
73
 
74
74
  it "calls fail if matcher.diffable?" do
75
- matcher = mock("matcher",
75
+ matcher = double("matcher",
76
76
  :diffable? => true,
77
77
  :failure_message_for_should => "message",
78
78
  :matches? => false,
@@ -87,7 +87,7 @@ module RSpec
87
87
  end
88
88
 
89
89
  it "calls failure_message if the matcher does not implement failure_message_for_should" do
90
- matcher = mock("matcher", :failure_message => "message", :matches? => false)
90
+ matcher = double("matcher", :failure_message => "message", :matches? => false)
91
91
  actual = Object.new
92
92
 
93
93
  ::RSpec::Expectations.should_receive(:fail_with).with("message")
@@ -96,45 +96,56 @@ module RSpec
96
96
 
97
97
  end
98
98
 
99
- it "appends the :or message in the options hash passed to should" do
100
- matcher = mock("matcher", :failure_message_for_should => "message", :matches? => false)
99
+ it "uses the custom failure message when one is provided" do
100
+ matcher = double("matcher", :failure_message_for_should => "message", :matches? => false)
101
101
  actual = Object.new
102
102
 
103
103
  ::RSpec::Expectations.should_receive(:fail_with).with("custom")
104
104
 
105
105
  RSpec::Expectations::PositiveExpectationHandler.handle_matcher(actual, matcher, "custom")
106
106
  end
107
+
108
+ it "uses the custom failure message when one is provided as a callable object" do
109
+ matcher = double("matcher", :failure_message_for_should => "message", :matches? => false)
110
+ actual = Object.new
111
+
112
+ failure_message = double("failure message", :call => "custom")
113
+
114
+ ::RSpec::Expectations.should_receive(:fail_with).with("custom")
115
+
116
+ RSpec::Expectations::PositiveExpectationHandler.handle_matcher(actual, matcher, failure_message)
117
+ end
107
118
  end
108
119
  end
109
120
 
110
121
  describe NegativeExpectationHandler do
111
122
  describe "#handle_matcher" do
112
123
  it "asks the matcher if it doesn't match when the matcher responds to #does_not_match?" do
113
- matcher = mock("matcher", :does_not_match? => true, :negative_failure_message => nil)
124
+ matcher = double("matcher", :does_not_match? => true, :negative_failure_message => nil)
114
125
  actual = Object.new
115
126
  matcher.should_receive(:does_not_match?).with(actual).and_return(true)
116
127
  RSpec::Expectations::NegativeExpectationHandler.handle_matcher(actual, matcher)
117
128
  end
118
129
 
119
130
  it "asks the matcher if it matches when the matcher doesn't respond to #does_not_match?" do
120
- matcher = mock("matcher")
131
+ matcher = double("matcher")
121
132
  actual = Object.new
122
- matcher.stub!(:negative_failure_message)
133
+ matcher.stub(:negative_failure_message)
123
134
  matcher.should_receive(:matches?).with(actual).and_return(false)
124
135
  RSpec::Expectations::NegativeExpectationHandler.handle_matcher(actual, matcher)
125
136
  end
126
137
 
127
138
  it "returns the match value" do
128
- matcher = mock("matcher")
139
+ matcher = double("matcher")
129
140
  actual = Object.new
130
141
  matcher.should_receive(:matches?).with(actual).and_return(false)
131
- matcher.stub!(:negative_failure_message).and_return("ignore")
142
+ matcher.stub(:negative_failure_message).and_return("ignore")
132
143
  expect(RSpec::Expectations::NegativeExpectationHandler.handle_matcher(actual, matcher)).to be_false
133
144
  end
134
145
 
135
146
 
136
147
  it "calls failure_message_for_should_not if the matcher implements it" do
137
- matcher = mock("matcher", :failure_message_for_should_not => "message", :matches? => true)
148
+ matcher = double("matcher", :failure_message_for_should_not => "message", :matches? => true)
138
149
  actual = Object.new
139
150
 
140
151
  ::RSpec::Expectations.should_receive(:fail_with).with("message")
@@ -144,7 +155,7 @@ module RSpec
144
155
  end
145
156
 
146
157
  it "calls negative_failure_message if the matcher does not implement failure_message_for_should_not" do
147
- matcher = mock("matcher", :negative_failure_message => "message", :matches? => true)
158
+ matcher = double("matcher", :negative_failure_message => "message", :matches? => true)
148
159
  actual = Object.new
149
160
 
150
161
  ::RSpec::Expectations.should_receive(:fail_with).with("message")
@@ -155,7 +166,7 @@ module RSpec
155
166
 
156
167
 
157
168
  it "calls fail if matcher.diffable?" do
158
- matcher = mock("matcher",
169
+ matcher = double("matcher",
159
170
  :diffable? => true,
160
171
  :failure_message_for_should_not => "message",
161
172
  :matches? => true,
@@ -169,8 +180,8 @@ module RSpec
169
180
  RSpec::Expectations::NegativeExpectationHandler.handle_matcher(actual, matcher)
170
181
  end
171
182
 
172
- it "appends the :or message in the options hash passed to should" do
173
- matcher = mock("matcher", :failure_message_for_should_not => "message", :matches? => true)
183
+ it "uses the custom failure message when one is provided" do
184
+ matcher = double("matcher", :failure_message_for_should_not => "message", :matches? => true)
174
185
  actual = Object.new
175
186
 
176
187
  ::RSpec::Expectations.should_receive(:fail_with).with("custom")
@@ -178,6 +189,16 @@ module RSpec
178
189
  RSpec::Expectations::NegativeExpectationHandler.handle_matcher(actual, matcher, "custom")
179
190
  end
180
191
 
192
+ it "uses the custom failure message when one is provided as a callable object" do
193
+ matcher = double("matcher", :failure_message_for_should_not => "message", :matches? => true)
194
+ actual = Object.new
195
+
196
+ failure_message = double("failure message", :call => "custom")
197
+
198
+ ::RSpec::Expectations.should_receive(:fail_with).with("custom")
199
+
200
+ RSpec::Expectations::NegativeExpectationHandler.handle_matcher(actual, matcher, failure_message)
201
+ end
181
202
  end
182
203
  end
183
204
 
@@ -189,10 +210,10 @@ module RSpec
189
210
  expect(5).to arbitrary_matcher(:expected => "wrong").with(5)
190
211
  expect { expect(5).to arbitrary_matcher(:expected => 4) }.to fail_with("expected 4, got 5")
191
212
  expect { expect(5).to arbitrary_matcher(:expected => 5).with(4) }.to fail_with("expected 4, got 5")
192
- expect(5).to_not arbitrary_matcher(:expected => 4)
193
- expect(5).to_not arbitrary_matcher(:expected => 5).with(4)
194
- expect { expect(5).to_not arbitrary_matcher(:expected => 5) }.to fail_with("expected not 5, got 5")
195
- expect { expect(5).to_not arbitrary_matcher(:expected => 4).with(5) }.to fail_with("expected not 5, got 5")
213
+ expect(5).not_to arbitrary_matcher(:expected => 4)
214
+ expect(5).not_to arbitrary_matcher(:expected => 5).with(4)
215
+ expect { expect(5).not_to arbitrary_matcher(:expected => 5) }.to fail_with("expected not 5, got 5")
216
+ expect { expect(5).not_to arbitrary_matcher(:expected => 4).with(5) }.to fail_with("expected not 5, got 5")
196
217
  end
197
218
 
198
219
  it "handles the submitted block" do