rspec-expectations 2.8.0 → 2.9.0.rc2
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/.document +5 -0
- data/.yardopts +3 -0
- data/Changelog.md +176 -0
- data/README.md +2 -13
- data/features/custom_matchers/access_running_example.feature +1 -1
- data/features/step_definitions/additional_cli_steps.rb +4 -4
- data/lib/rspec/expectations/fail_with.rb +3 -3
- data/lib/rspec/expectations/handler.rb +3 -5
- data/lib/rspec/expectations/version.rb +1 -1
- data/lib/rspec/matchers.rb +387 -21
- data/lib/rspec/matchers/built_in.rb +33 -0
- data/lib/rspec/matchers/built_in/base_matcher.rb +58 -0
- data/lib/rspec/matchers/built_in/be.rb +183 -0
- data/lib/rspec/matchers/built_in/be_instance_of.rb +13 -0
- data/lib/rspec/matchers/built_in/be_kind_of.rb +13 -0
- data/lib/rspec/matchers/built_in/be_within.rb +39 -0
- data/lib/rspec/matchers/built_in/change.rb +132 -0
- data/lib/rspec/matchers/built_in/cover.rb +22 -0
- data/lib/rspec/matchers/built_in/eq.rb +26 -0
- data/lib/rspec/matchers/built_in/eql.rb +25 -0
- data/lib/rspec/matchers/built_in/equal.rb +48 -0
- data/lib/rspec/matchers/built_in/exist.rb +28 -0
- data/lib/rspec/matchers/built_in/has.rb +47 -0
- data/lib/rspec/matchers/built_in/have.rb +107 -0
- data/lib/rspec/matchers/built_in/include.rb +52 -0
- data/lib/rspec/matchers/built_in/match.rb +13 -0
- data/lib/rspec/matchers/built_in/match_array.rb +52 -0
- data/lib/rspec/matchers/built_in/raise_error.rb +96 -0
- data/lib/rspec/matchers/built_in/respond_to.rb +73 -0
- data/lib/rspec/matchers/built_in/satisfy.rb +29 -0
- data/lib/rspec/matchers/built_in/throw_symbol.rb +93 -0
- data/lib/rspec/matchers/dsl.rb +1 -1
- data/lib/rspec/matchers/matcher.rb +263 -233
- data/lib/rspec/matchers/method_missing.rb +2 -2
- data/lib/rspec/matchers/operator_matcher.rb +19 -20
- data/spec/rspec/expectations/handler_spec.rb +1 -1
- data/spec/rspec/matchers/base_matcher_spec.rb +1 -2
- data/spec/rspec/matchers/change_spec.rb +3 -3
- data/spec/rspec/matchers/cover_spec.rb +46 -46
- data/spec/rspec/matchers/dsl_spec.rb +36 -3
- data/spec/rspec/matchers/have_spec.rb +2 -2
- data/spec/rspec/matchers/include_spec.rb +1 -1
- data/spec/rspec/matchers/matcher_spec.rb +319 -305
- data/spec/rspec/matchers/method_missing_spec.rb +1 -0
- data/spec/rspec/matchers/operator_matcher_spec.rb +2 -2
- data/spec/rspec/matchers/throw_symbol_spec.rb +103 -105
- metadata +93 -39
- data/lib/rspec/matchers/base_matcher.rb +0 -56
- data/lib/rspec/matchers/be.rb +0 -232
- data/lib/rspec/matchers/be_instance_of.rb +0 -24
- data/lib/rspec/matchers/be_kind_of.rb +0 -24
- data/lib/rspec/matchers/be_within.rb +0 -47
- data/lib/rspec/matchers/change.rb +0 -197
- data/lib/rspec/matchers/cover.rb +0 -36
- data/lib/rspec/matchers/eq.rb +0 -36
- data/lib/rspec/matchers/eql.rb +0 -35
- data/lib/rspec/matchers/equal.rb +0 -58
- data/lib/rspec/matchers/errors.rb +0 -5
- data/lib/rspec/matchers/exist.rb +0 -34
- data/lib/rspec/matchers/has.rb +0 -44
- data/lib/rspec/matchers/have.rb +0 -162
- data/lib/rspec/matchers/include.rb +0 -66
- data/lib/rspec/matchers/match.rb +0 -21
- data/lib/rspec/matchers/match_array.rb +0 -65
- data/lib/rspec/matchers/raise_error.rb +0 -116
- data/lib/rspec/matchers/respond_to.rb +0 -80
- data/lib/rspec/matchers/satisfy.rb +0 -46
- data/lib/rspec/matchers/throw_symbol.rb +0 -112
data/lib/rspec/matchers/match.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class Match
|
4
|
-
include BaseMatcher
|
5
|
-
|
6
|
-
def matches?(actual)
|
7
|
-
super(actual).match(expected)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
# Given a Regexp or String, passes if actual.match(pattern)
|
12
|
-
#
|
13
|
-
# @example
|
14
|
-
#
|
15
|
-
# email.should match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)
|
16
|
-
# email.should match("@example.com")
|
17
|
-
def match(expected)
|
18
|
-
Match.new(expected)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class MatchArray
|
4
|
-
include RSpec::Matchers::Pretty
|
5
|
-
|
6
|
-
def initialize(expected)
|
7
|
-
@expected = expected
|
8
|
-
end
|
9
|
-
|
10
|
-
def matches?(actual)
|
11
|
-
@actual = actual
|
12
|
-
@extra_items = difference_between_arrays(@actual, @expected)
|
13
|
-
@missing_items = difference_between_arrays(@expected, @actual)
|
14
|
-
@extra_items.empty? & @missing_items.empty?
|
15
|
-
end
|
16
|
-
|
17
|
-
def failure_message_for_should
|
18
|
-
message = "expected collection contained: #{safe_sort(@expected).inspect}\n"
|
19
|
-
message += "actual collection contained: #{safe_sort(@actual).inspect}\n"
|
20
|
-
message += "the missing elements were: #{safe_sort(@missing_items).inspect}\n" unless @missing_items.empty?
|
21
|
-
message += "the extra elements were: #{safe_sort(@extra_items).inspect}\n" unless @extra_items.empty?
|
22
|
-
message
|
23
|
-
end
|
24
|
-
|
25
|
-
def failure_message_for_should_not
|
26
|
-
"Matcher does not support should_not"
|
27
|
-
end
|
28
|
-
|
29
|
-
def description
|
30
|
-
"contain exactly #{_pretty_print(@expected)}"
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def safe_sort(array)
|
36
|
-
array.sort rescue array
|
37
|
-
end
|
38
|
-
|
39
|
-
def difference_between_arrays(array_1, array_2)
|
40
|
-
difference = array_1.dup
|
41
|
-
array_2.each do |element|
|
42
|
-
if index = difference.index(element)
|
43
|
-
difference.delete_at(index)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
difference
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
# Passes if actual contains all of the expected regardless of order.
|
51
|
-
# This works for collections. Pass in multiple args and it will only
|
52
|
-
# pass if all args are found in collection.
|
53
|
-
#
|
54
|
-
# NOTE: there is no should_not version of array.should =~ other_array
|
55
|
-
#
|
56
|
-
# @example
|
57
|
-
#
|
58
|
-
# [1,2,3].should =~ [1,2,3] # => would pass
|
59
|
-
# [1,2,3].should =~ [2,3,1] # => would pass
|
60
|
-
# [1,2,3,4].should =~ [1,2,3] # => would fail
|
61
|
-
# [1,2,2,3].should =~ [1,2,3] # => would fail
|
62
|
-
# [1,2,3].should =~ [1,2,3,4] # => would fail
|
63
|
-
OperatorMatcher.register(Array, '=~', RSpec::Matchers::MatchArray)
|
64
|
-
end
|
65
|
-
end
|
@@ -1,116 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class RaiseError
|
4
|
-
def initialize(expected_error_or_message=Exception, expected_message=nil, &block)
|
5
|
-
@block = block
|
6
|
-
@actual_error = nil
|
7
|
-
case expected_error_or_message
|
8
|
-
when String, Regexp
|
9
|
-
@expected_error, @expected_message = Exception, expected_error_or_message
|
10
|
-
else
|
11
|
-
@expected_error, @expected_message = expected_error_or_message, expected_message
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def matches?(given_proc)
|
16
|
-
@raised_expected_error = false
|
17
|
-
@with_expected_message = false
|
18
|
-
@eval_block = false
|
19
|
-
@eval_block_passed = false
|
20
|
-
begin
|
21
|
-
given_proc.call
|
22
|
-
rescue @expected_error => @actual_error
|
23
|
-
@raised_expected_error = true
|
24
|
-
@with_expected_message = verify_message
|
25
|
-
rescue Exception => @actual_error
|
26
|
-
# This clause should be empty, but rcov will not report it as covered
|
27
|
-
# unless something (anything) is executed within the clause
|
28
|
-
"http://eigenclass.org/hiki.rb?rcov-0.8.0"
|
29
|
-
end
|
30
|
-
|
31
|
-
unless negative_expectation?
|
32
|
-
eval_block if @raised_expected_error && @with_expected_message && @block
|
33
|
-
end
|
34
|
-
ensure
|
35
|
-
return (@raised_expected_error & @with_expected_message) ? (@eval_block ? @eval_block_passed : true) : false
|
36
|
-
end
|
37
|
-
|
38
|
-
def eval_block
|
39
|
-
@eval_block = true
|
40
|
-
begin
|
41
|
-
@block[@actual_error]
|
42
|
-
@eval_block_passed = true
|
43
|
-
rescue Exception => err
|
44
|
-
@actual_error = err
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def verify_message
|
49
|
-
case @expected_message
|
50
|
-
when nil
|
51
|
-
true
|
52
|
-
when Regexp
|
53
|
-
@expected_message =~ @actual_error.message
|
54
|
-
else
|
55
|
-
@expected_message == @actual_error.message
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def failure_message_for_should
|
60
|
-
@eval_block ? @actual_error.message : "expected #{expected_error}#{given_error}"
|
61
|
-
end
|
62
|
-
|
63
|
-
def failure_message_for_should_not
|
64
|
-
"expected no #{expected_error}#{given_error}"
|
65
|
-
end
|
66
|
-
|
67
|
-
def description
|
68
|
-
"raise #{expected_error}"
|
69
|
-
end
|
70
|
-
|
71
|
-
private
|
72
|
-
def expected_error
|
73
|
-
case @expected_message
|
74
|
-
when nil
|
75
|
-
@expected_error
|
76
|
-
when Regexp
|
77
|
-
"#{@expected_error} with message matching #{@expected_message.inspect}"
|
78
|
-
else
|
79
|
-
"#{@expected_error} with #{@expected_message.inspect}"
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def given_error
|
84
|
-
@actual_error.nil? ? " but nothing was raised" : ", got #{@actual_error.inspect}"
|
85
|
-
end
|
86
|
-
|
87
|
-
def negative_expectation?
|
88
|
-
# YES - I'm a bad person... help me find a better way - ryand
|
89
|
-
caller.first(3).find { |s| s =~ /should_not/ }
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
# With no args, matches if any error is raised.
|
94
|
-
# With a named error, matches only if that specific error is raised.
|
95
|
-
# With a named error and messsage specified as a String, matches only if both match.
|
96
|
-
# With a named error and messsage specified as a Regexp, matches only if both match.
|
97
|
-
# Pass an optional block to perform extra verifications on the exception matched
|
98
|
-
#
|
99
|
-
# @example
|
100
|
-
#
|
101
|
-
# lambda { do_something_risky }.should raise_error
|
102
|
-
# lambda { do_something_risky }.should raise_error(PoorRiskDecisionError)
|
103
|
-
# lambda { do_something_risky }.should raise_error(PoorRiskDecisionError) { |error| error.data.should == 42 }
|
104
|
-
# lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, "that was too risky")
|
105
|
-
# lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, /oo ri/)
|
106
|
-
#
|
107
|
-
# lambda { do_something_risky }.should_not raise_error
|
108
|
-
# lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError)
|
109
|
-
# lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, "that was too risky")
|
110
|
-
# lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, /oo ri/)
|
111
|
-
def raise_error(error=Exception, message=nil, &block)
|
112
|
-
Matchers::RaiseError.new(error, message, &block)
|
113
|
-
end
|
114
|
-
alias_method :raise_exception, :raise_error
|
115
|
-
end
|
116
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class RespondTo
|
4
|
-
def initialize(*names)
|
5
|
-
@names = names
|
6
|
-
@expected_arity = nil
|
7
|
-
end
|
8
|
-
|
9
|
-
def matches?(actual)
|
10
|
-
find_failing_method_names(actual, :reject).empty?
|
11
|
-
end
|
12
|
-
|
13
|
-
def does_not_match?(actual)
|
14
|
-
find_failing_method_names(actual, :select).empty?
|
15
|
-
end
|
16
|
-
|
17
|
-
def failure_message_for_should
|
18
|
-
"expected #{@actual.inspect} to respond to #{@failing_method_names.collect {|name| name.inspect }.join(', ')}#{with_arity}"
|
19
|
-
end
|
20
|
-
|
21
|
-
def failure_message_for_should_not
|
22
|
-
failure_message_for_should.sub(/to respond to/, 'not to respond to')
|
23
|
-
end
|
24
|
-
|
25
|
-
def description
|
26
|
-
"respond to #{pp_names}#{with_arity}"
|
27
|
-
end
|
28
|
-
|
29
|
-
def with(n)
|
30
|
-
@expected_arity = n
|
31
|
-
self
|
32
|
-
end
|
33
|
-
|
34
|
-
def argument
|
35
|
-
self
|
36
|
-
end
|
37
|
-
alias :arguments :argument
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def find_failing_method_names(actual, filter_method)
|
42
|
-
@actual = actual
|
43
|
-
@failing_method_names = @names.send(filter_method) do |name|
|
44
|
-
@actual.respond_to?(name) && matches_arity?(actual, name)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def matches_arity?(actual, name)
|
49
|
-
return true unless @expected_arity
|
50
|
-
|
51
|
-
actual_arity = actual.method(name).arity
|
52
|
-
if actual_arity < 0
|
53
|
-
# ~ inverts the one's complement and gives us the number of required args
|
54
|
-
~actual_arity <= @expected_arity
|
55
|
-
else
|
56
|
-
actual_arity == @expected_arity
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def with_arity
|
61
|
-
@expected_arity.nil?? "" :
|
62
|
-
" with #{@expected_arity} argument#{@expected_arity == 1 ? '' : 's'}"
|
63
|
-
end
|
64
|
-
|
65
|
-
def pp_names
|
66
|
-
# Ruby 1.9 returns the same thing for array.to_s as array.inspect, so just use array.inspect here
|
67
|
-
@names.length == 1 ? "##{@names.first}" : @names.inspect
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
# Matches if the target object responds to all of the names
|
72
|
-
# provided. Names can be Strings or Symbols.
|
73
|
-
#
|
74
|
-
# @example
|
75
|
-
#
|
76
|
-
def respond_to(*names)
|
77
|
-
Matchers::RespondTo.new(*names)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class Satisfy
|
4
|
-
def initialize(&block)
|
5
|
-
@block = block
|
6
|
-
end
|
7
|
-
|
8
|
-
def matches?(actual, &block)
|
9
|
-
@block = block if block
|
10
|
-
@actual = actual
|
11
|
-
@block.call(actual)
|
12
|
-
end
|
13
|
-
|
14
|
-
def failure_message_for_should
|
15
|
-
"expected #{@actual} to satisfy block"
|
16
|
-
end
|
17
|
-
|
18
|
-
def failure_message_for_should_not
|
19
|
-
"expected #{@actual} not to satisfy block"
|
20
|
-
end
|
21
|
-
|
22
|
-
def description
|
23
|
-
"satisfy block"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# Passes if the submitted block returns true. Yields target to the
|
28
|
-
# block.
|
29
|
-
#
|
30
|
-
# Generally speaking, this should be thought of as a last resort when
|
31
|
-
# you can't find any other way to specify the behaviour you wish to
|
32
|
-
# specify.
|
33
|
-
#
|
34
|
-
# If you do find yourself in such a situation, you could always write
|
35
|
-
# a custom matcher, which would likely make your specs more expressive.
|
36
|
-
#
|
37
|
-
# @example
|
38
|
-
#
|
39
|
-
# 5.should satisfy { |n|
|
40
|
-
# n > 3
|
41
|
-
# }
|
42
|
-
def satisfy(&block)
|
43
|
-
Matchers::Satisfy.new(&block)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,112 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class ThrowSymbol
|
4
|
-
def initialize(expected_symbol = nil, expected_arg=nil)
|
5
|
-
@expected_symbol = expected_symbol
|
6
|
-
@expected_arg = expected_arg
|
7
|
-
@caught_symbol = @caught_arg = nil
|
8
|
-
end
|
9
|
-
|
10
|
-
def matches?(given_proc)
|
11
|
-
begin
|
12
|
-
if @expected_symbol.nil?
|
13
|
-
given_proc.call
|
14
|
-
else
|
15
|
-
@caught_arg = catch :proc_did_not_throw_anything do
|
16
|
-
catch @expected_symbol do
|
17
|
-
given_proc.call
|
18
|
-
throw :proc_did_not_throw_anything, :nothing_thrown
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
if @caught_arg == :nothing_thrown
|
23
|
-
@caught_arg = nil
|
24
|
-
else
|
25
|
-
@caught_symbol = @expected_symbol
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# Ruby 1.8 uses NameError with `symbol'
|
30
|
-
# Ruby 1.9 uses ArgumentError with :symbol
|
31
|
-
rescue NameError, ArgumentError => e
|
32
|
-
unless e.message =~ /uncaught throw (`|\:)([a-zA-Z0-9_]*)(')?/
|
33
|
-
other_exception = e
|
34
|
-
raise
|
35
|
-
end
|
36
|
-
@caught_symbol = $2.to_sym
|
37
|
-
rescue => other_exception
|
38
|
-
raise
|
39
|
-
ensure
|
40
|
-
unless other_exception
|
41
|
-
if @expected_symbol.nil?
|
42
|
-
return !@caught_symbol.nil?
|
43
|
-
else
|
44
|
-
if @expected_arg.nil?
|
45
|
-
return @caught_symbol == @expected_symbol
|
46
|
-
else
|
47
|
-
return (@caught_symbol == @expected_symbol) & (@caught_arg == @expected_arg)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def failure_message_for_should
|
55
|
-
"expected #{expected} to be thrown, got #{caught}"
|
56
|
-
end
|
57
|
-
|
58
|
-
def failure_message_for_should_not
|
59
|
-
"expected #{expected('no Symbol')}#{' not' if @expected_symbol} to be thrown, got #{caught}"
|
60
|
-
end
|
61
|
-
|
62
|
-
def description
|
63
|
-
"throw #{expected}"
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
def expected(symbol_desc = 'a Symbol')
|
69
|
-
throw_description(@expected_symbol || symbol_desc, @expected_arg)
|
70
|
-
end
|
71
|
-
|
72
|
-
def caught
|
73
|
-
throw_description(@caught_symbol || 'nothing', @caught_arg)
|
74
|
-
end
|
75
|
-
|
76
|
-
def throw_description(symbol, arg)
|
77
|
-
symbol_description = symbol.is_a?(String) ? symbol : symbol.inspect
|
78
|
-
|
79
|
-
arg_description = if arg
|
80
|
-
" with #{arg.inspect}"
|
81
|
-
elsif @expected_arg && @caught_symbol == @expected_symbol
|
82
|
-
" with no argument"
|
83
|
-
else
|
84
|
-
""
|
85
|
-
end
|
86
|
-
|
87
|
-
symbol_description + arg_description
|
88
|
-
end
|
89
|
-
|
90
|
-
end
|
91
|
-
|
92
|
-
# Given no argument, matches if a proc throws any Symbol.
|
93
|
-
#
|
94
|
-
# Given a Symbol, matches if the given proc throws the specified Symbol.
|
95
|
-
#
|
96
|
-
# Given a Symbol and an arg, matches if the given proc throws the
|
97
|
-
# specified Symbol with the specified arg.
|
98
|
-
#
|
99
|
-
# @example
|
100
|
-
#
|
101
|
-
# lambda { do_something_risky }.should throw_symbol
|
102
|
-
# lambda { do_something_risky }.should throw_symbol(:that_was_risky)
|
103
|
-
# lambda { do_something_risky }.should throw_symbol(:that_was_risky, culprit)
|
104
|
-
#
|
105
|
-
# lambda { do_something_risky }.should_not throw_symbol
|
106
|
-
# lambda { do_something_risky }.should_not throw_symbol(:that_was_risky)
|
107
|
-
# lambda { do_something_risky }.should_not throw_symbol(:that_was_risky, culprit)
|
108
|
-
def throw_symbol(expected_symbol=nil, expected_arg=nil)
|
109
|
-
Matchers::ThrowSymbol.new(expected_symbol, expected_arg)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|