rspec-expectations 2.11.3 → 2.12.0
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.
- data/Changelog.md +25 -2
- data/README.md +5 -1
- data/features/built_in_matchers/be.feature +4 -4
- data/features/built_in_matchers/be_within.feature +1 -1
- data/features/built_in_matchers/cover.feature +1 -1
- data/features/built_in_matchers/end_with.feature +2 -2
- data/features/built_in_matchers/equality.feature +5 -5
- data/features/built_in_matchers/exist.feature +1 -1
- data/features/built_in_matchers/expect_change.feature +3 -3
- data/features/built_in_matchers/expect_error.feature +4 -4
- data/features/built_in_matchers/have.feature +2 -2
- data/features/built_in_matchers/include.feature +3 -3
- data/features/built_in_matchers/match.feature +2 -2
- data/features/built_in_matchers/operators.feature +3 -3
- data/features/built_in_matchers/predicates.feature +9 -8
- data/features/built_in_matchers/respond_to.feature +2 -2
- data/features/built_in_matchers/satisfy.feature +1 -1
- data/features/built_in_matchers/start_with.feature +2 -2
- data/features/built_in_matchers/throw_symbol.feature +3 -3
- data/features/built_in_matchers/types.feature +2 -2
- data/features/built_in_matchers/yield.feature +5 -5
- data/features/custom_matchers/access_running_example.feature +3 -3
- data/features/custom_matchers/define_diffable_matcher.feature +1 -1
- data/features/custom_matchers/define_matcher.feature +12 -12
- data/features/custom_matchers/define_matcher_outside_rspec.feature +1 -1
- data/features/custom_matchers/define_matcher_with_fluent_interface.feature +1 -1
- data/features/customized_message.feature +1 -1
- data/features/diffing.feature +4 -4
- data/features/implicit_docstrings.feature +2 -2
- data/features/test_frameworks/test_unit.feature +1 -1
- data/lib/rspec/expectations/differ.rb +35 -1
- data/lib/rspec/expectations/handler.rb +21 -6
- data/lib/rspec/expectations/version.rb +1 -1
- data/lib/rspec/matchers/built_in/be_instance_of.rb +4 -0
- data/lib/rspec/matchers/built_in/include.rb +3 -1
- data/lib/rspec/matchers/built_in/match_array.rb +12 -6
- data/lib/rspec/matchers/built_in/raise_error.rb +17 -7
- data/lib/rspec/matchers/built_in/yield.rb +5 -5
- data/lib/rspec/matchers/configuration.rb +42 -0
- data/lib/rspec/matchers/generated_descriptions.rb +2 -3
- data/spec/rspec/expectations/differ_spec.rb +24 -0
- data/spec/rspec/expectations/handler_spec.rb +40 -40
- data/spec/rspec/expectations/syntax_spec.rb +35 -0
- data/spec/rspec/matchers/be_instance_of_spec.rb +19 -2
- data/spec/rspec/matchers/be_spec.rb +10 -10
- data/spec/rspec/matchers/configuration_spec.rb +155 -123
- data/spec/rspec/matchers/dsl_spec.rb +8 -8
- data/spec/rspec/matchers/have_spec.rb +8 -38
- data/spec/rspec/matchers/include_spec.rb +6 -0
- data/spec/rspec/matchers/match_array_spec.rb +14 -0
- data/spec/rspec/matchers/raise_error_spec.rb +89 -38
- data/spec/rspec/matchers/start_with_end_with_spec.rb +1 -1
- data/spec/rspec/matchers/yield_spec.rb +35 -0
- metadata +70 -78
@@ -16,7 +16,7 @@ Feature: throw_symbol matcher
|
|
16
16
|
|
17
17
|
Scenario: basic usage
|
18
18
|
Given a file named "throw_symbol_matcher_spec.rb" with:
|
19
|
-
"""
|
19
|
+
"""ruby
|
20
20
|
describe "throw" do
|
21
21
|
specify { expect { throw :foo }.to throw_symbol }
|
22
22
|
specify { expect { throw :bar, 7 }.to throw_symbol }
|
@@ -37,7 +37,7 @@ Feature: throw_symbol matcher
|
|
37
37
|
|
38
38
|
Scenario: specify thrown symbol
|
39
39
|
Given a file named "throw_symbol_matcher_spec.rb" with:
|
40
|
-
"""
|
40
|
+
"""ruby
|
41
41
|
describe "throw symbol" do
|
42
42
|
specify { expect { throw :foo }.to throw_symbol(:foo) }
|
43
43
|
specify { expect { throw :foo, 7 }.to throw_symbol(:foo) }
|
@@ -61,7 +61,7 @@ Feature: throw_symbol matcher
|
|
61
61
|
|
62
62
|
Scenario: specify thrown symbol and argument
|
63
63
|
Given a file named "throw_symbol_argument_matcher_spec.rb" with:
|
64
|
-
"""
|
64
|
+
"""ruby
|
65
65
|
describe "throw symbol with argument" do
|
66
66
|
specify { expect { throw :foo, 7 }.to throw_symbol(:foo, 7) }
|
67
67
|
specify { expect { throw :foo, 8 }.to_not throw_symbol(:foo, 7) }
|
@@ -17,7 +17,7 @@ Feature: specify types of objects
|
|
17
17
|
|
18
18
|
Scenario: be_(a_)kind_of matcher
|
19
19
|
Given a file named "be_kind_of_matcher_spec.rb" with:
|
20
|
-
"""
|
20
|
+
"""ruby
|
21
21
|
module MyModule; end
|
22
22
|
|
23
23
|
class Fixnum
|
@@ -70,7 +70,7 @@ Feature: specify types of objects
|
|
70
70
|
|
71
71
|
Scenario: be_(an_)instance_of matcher
|
72
72
|
Given a file named "be_instance_of_matcher_spec.rb" with:
|
73
|
-
"""
|
73
|
+
"""ruby
|
74
74
|
module MyModule; end
|
75
75
|
|
76
76
|
class Fixnum
|
@@ -24,7 +24,7 @@ Feature: yield matchers
|
|
24
24
|
|
25
25
|
Background:
|
26
26
|
Given a file named "my_class.rb" with:
|
27
|
-
"""
|
27
|
+
"""ruby
|
28
28
|
class MyClass
|
29
29
|
def self.yield_once_with(*args)
|
30
30
|
yield *args
|
@@ -41,7 +41,7 @@ Feature: yield matchers
|
|
41
41
|
|
42
42
|
Scenario: yield_control matcher
|
43
43
|
Given a file named "yield_control_spec.rb" with:
|
44
|
-
"""
|
44
|
+
"""ruby
|
45
45
|
require './my_class'
|
46
46
|
|
47
47
|
describe "yield_control matcher" do
|
@@ -61,7 +61,7 @@ Feature: yield matchers
|
|
61
61
|
|
62
62
|
Scenario: yield_with_args matcher
|
63
63
|
Given a file named "yield_with_args_spec.rb" with:
|
64
|
-
"""
|
64
|
+
"""ruby
|
65
65
|
require './my_class'
|
66
66
|
|
67
67
|
describe "yield_with_args matcher" do
|
@@ -94,7 +94,7 @@ Feature: yield matchers
|
|
94
94
|
|
95
95
|
Scenario: yield_with_no_args matcher
|
96
96
|
Given a file named "yield_with_no_args_spec.rb" with:
|
97
|
-
"""
|
97
|
+
"""ruby
|
98
98
|
require './my_class'
|
99
99
|
|
100
100
|
describe "yield_with_no_args matcher" do
|
@@ -117,7 +117,7 @@ Feature: yield matchers
|
|
117
117
|
|
118
118
|
Scenario: yield_successive_args matcher
|
119
119
|
Given a file named "yield_successive_args_spec.rb" with:
|
120
|
-
"""
|
120
|
+
"""ruby
|
121
121
|
def array
|
122
122
|
[1, 2, 3]
|
123
123
|
end
|
@@ -11,7 +11,7 @@ Feature: access running example
|
|
11
11
|
|
12
12
|
Scenario: call method defined on example from matcher
|
13
13
|
Given a file named "example_spec.rb" with:
|
14
|
-
"""
|
14
|
+
"""ruby
|
15
15
|
RSpec::Matchers.define :bar do
|
16
16
|
match do |_|
|
17
17
|
foo == "foo"
|
@@ -33,7 +33,7 @@ Feature: access running example
|
|
33
33
|
|
34
34
|
Scenario: call method _not_ defined on example from matcher
|
35
35
|
Given a file named "example_spec.rb" with:
|
36
|
-
"""
|
36
|
+
"""ruby
|
37
37
|
RSpec::Matchers.define :bar do
|
38
38
|
match do |_|
|
39
39
|
foo == "foo"
|
@@ -48,6 +48,6 @@ Feature: access running example
|
|
48
48
|
"""
|
49
49
|
When I run `rspec ./example_spec.rb`
|
50
50
|
Then the output should contain "1 example, 1 failure"
|
51
|
-
And the output should
|
51
|
+
And the output should match /undefined.*method/
|
52
52
|
And the output should contain "RSpec::Matchers::DSL::Matcher"
|
53
53
|
And the output should not contain "ExampleGroup"
|
@@ -6,7 +6,7 @@ Feature: define matcher
|
|
6
6
|
|
7
7
|
Scenario: define a matcher with default messages
|
8
8
|
Given a file named "matcher_with_default_message_spec.rb" with:
|
9
|
-
"""
|
9
|
+
"""ruby
|
10
10
|
require 'rspec/expectations'
|
11
11
|
|
12
12
|
RSpec::Matchers.define :be_a_multiple_of do |expected|
|
@@ -48,7 +48,7 @@ Feature: define matcher
|
|
48
48
|
|
49
49
|
Scenario: overriding the failure_message_for_should
|
50
50
|
Given a file named "matcher_with_failure_message_spec.rb" with:
|
51
|
-
"""
|
51
|
+
"""ruby
|
52
52
|
require 'rspec/expectations'
|
53
53
|
|
54
54
|
RSpec::Matchers.define :be_a_multiple_of do |expected|
|
@@ -72,7 +72,7 @@ Feature: define matcher
|
|
72
72
|
|
73
73
|
Scenario: overriding the failure_message_for_should_not
|
74
74
|
Given a file named "matcher_with_failure_for_message_spec.rb" with:
|
75
|
-
"""
|
75
|
+
"""ruby
|
76
76
|
require 'rspec/expectations'
|
77
77
|
|
78
78
|
RSpec::Matchers.define :be_a_multiple_of do |expected|
|
@@ -96,7 +96,7 @@ Feature: define matcher
|
|
96
96
|
|
97
97
|
Scenario: overriding the description
|
98
98
|
Given a file named "matcher_overriding_description_spec.rb" with:
|
99
|
-
"""
|
99
|
+
"""ruby
|
100
100
|
require 'rspec/expectations'
|
101
101
|
|
102
102
|
RSpec::Matchers.define :be_a_multiple_of do |expected|
|
@@ -124,7 +124,7 @@ Feature: define matcher
|
|
124
124
|
|
125
125
|
Scenario: with no args
|
126
126
|
Given a file named "matcher_with_no_args_spec.rb" with:
|
127
|
-
"""
|
127
|
+
"""ruby
|
128
128
|
require 'rspec/expectations'
|
129
129
|
|
130
130
|
RSpec::Matchers.define :have_7_fingers do
|
@@ -148,7 +148,7 @@ Feature: define matcher
|
|
148
148
|
|
149
149
|
Scenario: with multiple args
|
150
150
|
Given a file named "matcher_with_multiple_args_spec.rb" with:
|
151
|
-
"""
|
151
|
+
"""ruby
|
152
152
|
require 'rspec/expectations'
|
153
153
|
|
154
154
|
RSpec::Matchers.define :be_the_sum_of do |a,b,c,d|
|
@@ -168,7 +168,7 @@ Feature: define matcher
|
|
168
168
|
|
169
169
|
Scenario: with helper methods
|
170
170
|
Given a file named "matcher_with_internal_helper_spec.rb" with:
|
171
|
-
"""
|
171
|
+
"""ruby
|
172
172
|
require 'rspec/expectations'
|
173
173
|
|
174
174
|
RSpec::Matchers.define :have_same_elements_as do |sample|
|
@@ -193,7 +193,7 @@ Feature: define matcher
|
|
193
193
|
|
194
194
|
Scenario: scoped in a module
|
195
195
|
Given a file named "scoped_matcher_spec.rb" with:
|
196
|
-
"""
|
196
|
+
"""ruby
|
197
197
|
require 'rspec/expectations'
|
198
198
|
|
199
199
|
module MyHelpers
|
@@ -225,7 +225,7 @@ Feature: define matcher
|
|
225
225
|
|
226
226
|
Scenario: scoped in an example group
|
227
227
|
Given a file named "scoped_matcher_spec.rb" with:
|
228
|
-
"""
|
228
|
+
"""ruby
|
229
229
|
require 'rspec/expectations'
|
230
230
|
|
231
231
|
describe "group with matcher" do
|
@@ -259,7 +259,7 @@ Feature: define matcher
|
|
259
259
|
|
260
260
|
Scenario: matcher with separate logic for should and should_not
|
261
261
|
Given a file named "matcher_with_separate_should_not_logic_spec.rb" with:
|
262
|
-
"""
|
262
|
+
"""ruby
|
263
263
|
RSpec::Matchers.define :contain do |*expected|
|
264
264
|
match_for_should do |actual|
|
265
265
|
expected.all? { |e| actual.include?(e) }
|
@@ -287,7 +287,7 @@ Feature: define matcher
|
|
287
287
|
|
288
288
|
Scenario: use define_method to create a helper method with access to matcher params
|
289
289
|
Given a file named "define_method_spec.rb" with:
|
290
|
-
"""
|
290
|
+
"""ruby
|
291
291
|
RSpec::Matchers.define :be_a_multiple_of do |expected|
|
292
292
|
define_method :is_multiple? do |actual|
|
293
293
|
actual % expected == 0
|
@@ -312,7 +312,7 @@ Feature: define matcher
|
|
312
312
|
|
313
313
|
Scenario: include a module with helper methods in the matcher
|
314
314
|
Given a file named "include_module_spec.rb" with:
|
315
|
-
"""
|
315
|
+
"""ruby
|
316
316
|
module MatcherHelpers
|
317
317
|
def is_multiple?(actual, expected)
|
318
318
|
actual % expected == 0
|
data/features/diffing.feature
CHANGED
@@ -4,7 +4,7 @@ Feature: diffing
|
|
4
4
|
|
5
5
|
Scenario: diff for a multiline string
|
6
6
|
Given a file named "example_spec.rb" with:
|
7
|
-
"""
|
7
|
+
"""ruby
|
8
8
|
describe "a multiline string" do
|
9
9
|
it "is like another string" do
|
10
10
|
expected = <<-EXPECTED
|
@@ -34,7 +34,7 @@ Feature: diffing
|
|
34
34
|
|
35
35
|
Scenario: diff for a multiline string and a regexp
|
36
36
|
Given a file named "example_spec.rb" with:
|
37
|
-
"""
|
37
|
+
"""ruby
|
38
38
|
describe "a multiline string" do
|
39
39
|
it "is like another string" do
|
40
40
|
expected = /expected/m
|
@@ -60,7 +60,7 @@ Feature: diffing
|
|
60
60
|
|
61
61
|
Scenario: no diff for a single line strings
|
62
62
|
Given a file named "example_spec.rb" with:
|
63
|
-
"""
|
63
|
+
"""ruby
|
64
64
|
describe "a single line string" do
|
65
65
|
it "is like another string" do
|
66
66
|
expected = "this string"
|
@@ -74,7 +74,7 @@ Feature: diffing
|
|
74
74
|
|
75
75
|
Scenario: no diff for numbers
|
76
76
|
Given a file named "example_spec.rb" with:
|
77
|
-
"""
|
77
|
+
"""ruby
|
78
78
|
describe "a number" do
|
79
79
|
it "is like another number" do
|
80
80
|
1.should eq(2)
|
@@ -6,7 +6,7 @@ Feature: implicit docstrings
|
|
6
6
|
|
7
7
|
Scenario: run passing examples
|
8
8
|
Given a file named "implicit_docstrings_spec.rb" with:
|
9
|
-
"""
|
9
|
+
"""ruby
|
10
10
|
describe "Examples with no docstrings generate their own:" do
|
11
11
|
|
12
12
|
specify { 3.should be < 5 }
|
@@ -26,7 +26,7 @@ Feature: implicit docstrings
|
|
26
26
|
|
27
27
|
Scenario: run failing examples
|
28
28
|
Given a file named "failing_implicit_docstrings_spec.rb" with:
|
29
|
-
"""
|
29
|
+
"""ruby
|
30
30
|
describe "Failing examples with no descriptions" do
|
31
31
|
|
32
32
|
# description is auto-generated as "should equal(5)" based on the last #should
|
@@ -36,6 +36,7 @@ module RSpec
|
|
36
36
|
end
|
37
37
|
#Handle the last remaining hunk
|
38
38
|
output << oldhunk.diff(format) << "\n"
|
39
|
+
color_diff output
|
39
40
|
end
|
40
41
|
|
41
42
|
def diff_as_object(actual, expected)
|
@@ -48,7 +49,7 @@ module RSpec
|
|
48
49
|
"between #{actual} and #{expected} is empty. Check the " \
|
49
50
|
"implementation of #{actual}.==."
|
50
51
|
else
|
51
|
-
diff
|
52
|
+
color_diff diff
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
@@ -62,6 +63,39 @@ module RSpec
|
|
62
63
|
3
|
63
64
|
end
|
64
65
|
|
66
|
+
def color(text, color_code)
|
67
|
+
"\e[#{color_code}m#{text}\e[0m"
|
68
|
+
end
|
69
|
+
|
70
|
+
def red(text)
|
71
|
+
color(text, 31)
|
72
|
+
end
|
73
|
+
|
74
|
+
def green(text)
|
75
|
+
color(text, 32)
|
76
|
+
end
|
77
|
+
|
78
|
+
def blue(text)
|
79
|
+
color(text, 34)
|
80
|
+
end
|
81
|
+
|
82
|
+
def color_diff(diff)
|
83
|
+
return diff unless RSpec::Matchers.configuration.color?
|
84
|
+
|
85
|
+
diff.lines.map { |line|
|
86
|
+
case line[0].chr
|
87
|
+
when "+"
|
88
|
+
green line
|
89
|
+
when "-"
|
90
|
+
red line
|
91
|
+
when "@"
|
92
|
+
line[1].chr == "@" ? blue(line) : line
|
93
|
+
else
|
94
|
+
line
|
95
|
+
end
|
96
|
+
}.join
|
97
|
+
end
|
98
|
+
|
65
99
|
def object_to_string(object)
|
66
100
|
case object
|
67
101
|
when Hash
|
@@ -1,18 +1,32 @@
|
|
1
1
|
module RSpec
|
2
2
|
module Expectations
|
3
|
-
|
3
|
+
|
4
|
+
class ExpectationHandler
|
5
|
+
def self.message_must_be_string(msg)
|
6
|
+
"WARNING: ignoring the provided expectation message argument " +
|
7
|
+
"(#{msg.inspect}) since it is not a string."
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.check_message(msg)
|
11
|
+
::Kernel.warn message_must_be_string(msg) unless msg.nil? || msg.is_a?(String)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class PositiveExpectationHandler < ExpectationHandler
|
16
|
+
|
4
17
|
def self.handle_matcher(actual, matcher, message=nil, &block)
|
18
|
+
check_message(message)
|
5
19
|
::RSpec::Matchers.last_should = :should
|
6
20
|
::RSpec::Matchers.last_matcher = matcher
|
7
21
|
return ::RSpec::Matchers::BuiltIn::PositiveOperatorMatcher.new(actual) if matcher.nil?
|
8
22
|
|
9
23
|
match = matcher.matches?(actual, &block)
|
10
24
|
return match if match
|
11
|
-
|
25
|
+
|
12
26
|
message ||= matcher.respond_to?(:failure_message_for_should) ?
|
13
27
|
matcher.failure_message_for_should :
|
14
28
|
matcher.failure_message
|
15
|
-
|
29
|
+
|
16
30
|
if matcher.respond_to?(:diffable?) && matcher.diffable?
|
17
31
|
::RSpec::Expectations.fail_with message, matcher.expected, matcher.actual
|
18
32
|
else
|
@@ -21,17 +35,18 @@ module RSpec
|
|
21
35
|
end
|
22
36
|
end
|
23
37
|
|
24
|
-
class NegativeExpectationHandler
|
38
|
+
class NegativeExpectationHandler < ExpectationHandler
|
25
39
|
def self.handle_matcher(actual, matcher, message=nil, &block)
|
40
|
+
check_message(message)
|
26
41
|
::RSpec::Matchers.last_should = :should_not
|
27
42
|
::RSpec::Matchers.last_matcher = matcher
|
28
43
|
return ::RSpec::Matchers::BuiltIn::NegativeOperatorMatcher.new(actual) if matcher.nil?
|
29
|
-
|
44
|
+
|
30
45
|
match = matcher.respond_to?(:does_not_match?) ?
|
31
46
|
!matcher.does_not_match?(actual, &block) :
|
32
47
|
matcher.matches?(actual, &block)
|
33
48
|
return match unless match
|
34
|
-
|
49
|
+
|
35
50
|
message ||= matcher.respond_to?(:failure_message_for_should_not) ?
|
36
51
|
matcher.failure_message_for_should_not :
|
37
52
|
matcher.negative_failure_message
|