rspec-expectations 2.6.0 → 2.7.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 (51) hide show
  1. data/README.md +2 -2
  2. data/features/built_in_matchers/README.md +7 -5
  3. data/features/built_in_matchers/be.feature +1 -1
  4. data/features/built_in_matchers/cover.feature +1 -1
  5. data/features/built_in_matchers/expect_error.feature +59 -26
  6. data/features/built_in_matchers/have.feature +2 -2
  7. data/features/built_in_matchers/predicates.feature +1 -1
  8. data/features/step_definitions/additional_cli_steps.rb +1 -1
  9. data/features/support/env.rb +1 -1
  10. data/lib/rspec/expectations.rb +0 -2
  11. data/lib/rspec/expectations/deprecation.rb +6 -4
  12. data/lib/rspec/expectations/errors.rb +4 -7
  13. data/lib/rspec/expectations/extensions.rb +1 -0
  14. data/lib/rspec/expectations/extensions/array.rb +2 -0
  15. data/lib/rspec/expectations/extensions/kernel.rb +18 -44
  16. data/lib/rspec/expectations/{backward_compatibility.rb → extensions/object.rb} +5 -3
  17. data/lib/rspec/expectations/fail_with.rb +8 -5
  18. data/lib/rspec/expectations/version.rb +5 -4
  19. data/lib/rspec/matchers.rb +77 -73
  20. data/lib/rspec/matchers/be.rb +42 -51
  21. data/lib/rspec/matchers/be_within.rb +1 -1
  22. data/lib/rspec/matchers/change.rb +5 -13
  23. data/lib/rspec/matchers/dsl.rb +2 -1
  24. data/lib/rspec/matchers/eq.rb +3 -3
  25. data/lib/rspec/matchers/extensions/{instance_exec.rb → instance_eval_with_args.rb} +15 -7
  26. data/lib/rspec/matchers/has.rb +11 -6
  27. data/lib/rspec/matchers/have.rb +36 -19
  28. data/lib/rspec/matchers/match_array.rb +1 -1
  29. data/lib/rspec/matchers/matcher.rb +5 -5
  30. data/spec/rspec/matchers/change_spec.rb +38 -0
  31. data/spec/rspec/matchers/description_generation_spec.rb +32 -32
  32. data/spec/rspec/matchers/eq_spec.rb +2 -2
  33. data/spec/rspec/matchers/has_spec.rb +33 -1
  34. data/spec/rspec/matchers/have_spec.rb +64 -7
  35. data/spec/rspec/matchers/match_array_spec.rb +0 -3
  36. data/spec/rspec/matchers/operator_matcher_spec.rb +10 -4
  37. data/spec/rspec/matchers/raise_error_spec.rb +6 -6
  38. data/spec/support/classes.rb +21 -10
  39. metadata +51 -62
  40. data/.document +0 -5
  41. data/.gitignore +0 -10
  42. data/.travis.yml +0 -7
  43. data/Gemfile +0 -40
  44. data/Guardfile +0 -5
  45. data/License.txt +0 -22
  46. data/Rakefile +0 -81
  47. data/cucumber.yml +0 -10
  48. data/features/.nav +0 -29
  49. data/features/Changelog.md +0 -101
  50. data/rspec-expectations.gemspec +0 -27
  51. data/specs.watchr +0 -57
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  rspec-expectations adds `should` and `should_not` to every object and includes
4
4
  RSpec::Matchers, a library of standard matchers.
5
5
 
6
- [![build status](http://travis-ci.org/rspec/rspec-expectations.png)](http://travis-ci.org/rspec/rspec-expectations)
6
+ [![build status](https://secure.travis-ci.org/rspec/rspec-expectations.png)](http://travis-ci.org/rspec/rspec-expectations)
7
7
 
8
8
  ## Documentation
9
9
 
@@ -21,7 +21,7 @@ tracker](https://github.com/rspec/rspec-expectations/issues).
21
21
  ## Install
22
22
 
23
23
  gem install rspec # for rspec-core, rspec-expectations, rspec-mocks
24
- gem install rspec-expecctations # for rspec-expectations only
24
+ gem install rspec-expectations # for rspec-expectations only
25
25
 
26
26
  ## Matchers
27
27
 
@@ -29,10 +29,10 @@
29
29
 
30
30
  ## Truthiness and existentialism
31
31
 
32
- actual.should be_true # passes if actual is anything but nil or false
33
- actual.should be_false # passes if actual is nil or false
32
+ actual.should be_true # passes if actual is truthy (not nil or false)
33
+ actual.should be_false # passes if actual is falsy (nil or false)
34
34
  actual.should be_nil # passes if actual is nil
35
- actual.should be # passes if actual is not nil
35
+ actual.should be # passes if actual is truthy (not nil or false)
36
36
 
37
37
  ## Expecting errors
38
38
 
@@ -49,11 +49,13 @@
49
49
 
50
50
  ## Predicate matchers
51
51
 
52
- actual.should be_xxx # passes if actual.xxx?
52
+ actual.should be_xxx # passes if actual.xxx?
53
+ actual.should have_xxx(:arg) # passes if actual.has_xxx?(:arg)
53
54
 
54
- ### Example
55
+ ### Examples
55
56
 
56
57
  [].should be_empty # passes because [].empty? returns true
58
+ { :a => 1 }.should have_key(:a) # passes because the hash has the key :a
57
59
 
58
60
  ## Collection membership
59
61
 
@@ -5,7 +5,7 @@ Feature: "be" matchers
5
5
  obj.should be_true # passes if obj is truthy (not nil or false)
6
6
  obj.should be_false # passes if obj is falsy (nil or false)
7
7
  obj.should be_nil # passes if obj is nil
8
- obj.should be # passes if obj is not nil
8
+ obj.should be # passes if obj is truthy (not nil or false)
9
9
 
10
10
  Scenario: be_true matcher
11
11
  Given a file named "be_true_spec.rb" with:
@@ -28,7 +28,7 @@ Feature: cover matcher
28
28
  it { should_not cover(8) }
29
29
  it { should_not cover(4, 6, 8) }
30
30
 
31
- # both of these should fail since it covers 1 but not 9
31
+ # both of these should fail since it covers 5 but not 11
32
32
  it { should cover(5, 11) }
33
33
  it { should_not cover(5, 11) }
34
34
  end
@@ -15,32 +15,65 @@ Feature: raise_error matcher
15
15
  In addition to the basic form, above, there are a number of ways to specify
16
16
  details of an error/exception:
17
17
 
18
+ expect { raise "oops" }.to raise_error
19
+ expect { raise "oops" }.to raise_error(RuntimeError)
20
+ expect { raise "oops" }.to raise_error("oops")
21
+ expect { raise "oops" }.to raise_error(/op/)
22
+ expect { raise "oops" }.to raise_error(RuntimeError, "oops")
23
+ expect { raise "oops" }.to raise_error(RuntimeError, /op/)
24
+
18
25
  Scenario: expect any error
19
- Given a file named "expect_error_spec.rb" with:
26
+ Given a file named "example_spec" with:
20
27
  """
21
- describe "calling a method that does not exist" do
28
+ describe "calling a missing method" do
22
29
  it "raises" do
23
30
  expect { Object.new.foo }.to raise_error
24
31
  end
25
32
  end
26
33
  """
27
- When I run `rspec expect_error_spec.rb`
34
+ When I run `rspec example_spec`
28
35
  Then the example should pass
29
36
 
30
37
  Scenario: expect specific error
31
- Given a file named "expect_error_spec.rb" with:
38
+ Given a file named "example_spec" with:
32
39
  """
33
- describe "calling a method that does not exist" do
40
+ describe "calling a missing method" do
34
41
  it "raises" do
35
42
  expect { Object.new.foo }.to raise_error(NameError)
36
43
  end
37
44
  end
38
45
  """
39
- When I run `rspec expect_error_spec.rb`
46
+ When I run `rspec example_spec`
47
+ Then the example should pass
48
+
49
+ Scenario: match message with a string
50
+ Given a file named "example_spec.rb" with:
51
+ """
52
+ describe "matching error message with string" do
53
+ it "matches the error message" do
54
+ expect { raise StandardError, 'this message exactly'}.
55
+ to raise_error('this message exactly')
56
+ end
57
+ end
58
+ """
59
+ When I run `rspec example_spec.rb`
60
+ Then the example should pass
61
+
62
+ Scenario: match message with a regexp
63
+ Given a file named "example_spec.rb" with:
64
+ """
65
+ describe "matching error message with regex" do
66
+ it "matches the error message" do
67
+ expect { raise StandardError, "my message" }.
68
+ to raise_error(/my mess/)
69
+ end
70
+ end
71
+ """
72
+ When I run `rspec example_spec.rb`
40
73
  Then the example should pass
41
74
 
42
- Scenario: expect specific error message using a string
43
- Given a file named "expect_error_with_message.rb" with:
75
+ Scenario: match type + message with string
76
+ Given a file named "example_spec.rb" with:
44
77
  """
45
78
  describe "matching error message with string" do
46
79
  it "matches the error message" do
@@ -49,11 +82,11 @@ Feature: raise_error matcher
49
82
  end
50
83
  end
51
84
  """
52
- When I run `rspec expect_error_with_message.rb`
85
+ When I run `rspec example_spec.rb`
53
86
  Then the example should pass
54
87
 
55
- Scenario: expect specific error message using a regular expression
56
- Given a file named "expect_error_with_regex.rb" with:
88
+ Scenario: match type + message with regexp
89
+ Given a file named "example_spec.rb" with:
57
90
  """
58
91
  describe "matching error message with regex" do
59
92
  it "matches the error message" do
@@ -62,11 +95,11 @@ Feature: raise_error matcher
62
95
  end
63
96
  end
64
97
  """
65
- When I run `rspec expect_error_with_regex.rb`
98
+ When I run `rspec example_spec.rb`
66
99
  Then the example should pass
67
100
 
68
101
  Scenario: set expectations on error object passed to block
69
- Given a file named "expect_error_with_block_spec.rb" with:
102
+ Given a file named "example_spec" with:
70
103
  """
71
104
  describe "#foo" do
72
105
  it "raises NameError" do
@@ -76,30 +109,30 @@ Feature: raise_error matcher
76
109
  end
77
110
  end
78
111
  """
79
- When I run `rspec expect_error_with_block_spec.rb`
112
+ When I run `rspec example_spec`
80
113
  Then the example should pass
81
114
 
82
- Scenario: expect no error at all
83
- Given a file named "expect_no_error_spec.rb" with:
115
+ Scenario: expect no occurence of a specific error
116
+ Given a file named "example_spec" with:
84
117
  """
85
- describe "#to_s" do
118
+ describe Object, "#public_instance_methods" do
86
119
  it "does not raise" do
87
- expect { Object.new.to_s }.to_not raise_error
120
+ expect { Object.public_instance_methods }.
121
+ to_not raise_error(NameError)
88
122
  end
89
123
  end
90
124
  """
91
- When I run `rspec expect_no_error_spec.rb`
125
+ When I run `rspec example_spec`
92
126
  Then the example should pass
93
-
94
- Scenario: expect no occurence of a specific error
95
- Given a file named "expect_no_error_spec.rb" with:
127
+
128
+ Scenario: expect no error at all
129
+ Given a file named "example_spec" with:
96
130
  """
97
- describe Object, "#public_instance_methods" do
131
+ describe "#to_s" do
98
132
  it "does not raise" do
99
- expect { Object.public_instance_methods }.
100
- to_not raise_error(NameError)
133
+ expect { Object.new.to_s }.to_not raise_error
101
134
  end
102
135
  end
103
136
  """
104
- When I run `rspec expect_no_error_spec.rb`
137
+ When I run `rspec example_spec`
105
138
  Then the example should pass
@@ -4,8 +4,8 @@ Feature: have(n).items matcher
4
4
  size of a collection. There are three basic forms:
5
5
 
6
6
  * collection.should have(x).items
7
- * collection.should have_at_least(x).items
8
- * collection.should have_at_most(x).items
7
+ * collection.should have\_at\_least(x).items
8
+ * collection.should have\_at\_most(x).items
9
9
 
10
10
  In addition, #have_exactly is provided as an alias to #have.
11
11
 
@@ -101,7 +101,7 @@ Feature: predicate matchers
101
101
  """
102
102
  When I run `rspec should_not_have_all_string_keys_spec.rb`
103
103
  Then the output should contain "2 examples, 1 failure"
104
- And the output should contain "expected #has_all_string_keys?(nil) to return false, got true"
104
+ And the output should contain "expected #has_all_string_keys? to return false, got true"
105
105
 
106
106
  Scenario: matcher arguments are passed on to the predicate method
107
107
  Given a file named "predicate_matcher_argument_spec.rb" with:
@@ -7,7 +7,7 @@ end
7
7
 
8
8
  Then /^the output should contain all of these:$/ do |table|
9
9
  table.raw.flatten.each do |string|
10
- assert_partial_output(string)
10
+ assert_partial_output(string, all_output)
11
11
  end
12
12
  end
13
13
 
@@ -1,5 +1,5 @@
1
1
  require 'aruba/cucumber'
2
2
 
3
3
  Before do
4
- @aruba_timeout_seconds = 3
4
+ @aruba_timeout_seconds = 15
5
5
  end
@@ -5,11 +5,9 @@ require 'rspec/expectations/errors'
5
5
  require 'rspec/expectations/deprecation'
6
6
  require 'rspec/expectations/handler'
7
7
  require 'rspec/expectations/version'
8
- require 'rspec/expectations/backward_compatibility'
9
8
  require 'rspec/expectations/differ'
10
9
 
11
10
  module RSpec
12
-
13
11
  # RSpec::Expectations lets you set expectations on your objects.
14
12
  #
15
13
  # result.should == 37
@@ -1,9 +1,9 @@
1
1
  module RSpec
2
-
3
- # This is defined in rspec-core, but we can't assume it's loaded since
4
- # rspec-expectations should be usable w/o rspec-core.
5
2
  unless respond_to?(:deprecate)
6
3
  class << self
4
+ # Used internally by RSpec to display standard deprecation warnings.
5
+ # This is also defined in rspec-core, but we can't assume it's loaded
6
+ # since rspec-expectations should be usable w/o rspec-core.
7
7
  def deprecate(method, alternate_method=nil, version=nil)
8
8
  version_string = version ? "rspec-#{version}" : "a future version of RSpec"
9
9
 
@@ -27,10 +27,12 @@ ADDITIONAL
27
27
  warn_deprecation(message)
28
28
  end
29
29
 
30
+ # Used internally by RSpec to display custom deprecation warnings. This
31
+ # is also defined in rspec-core, but we can't assume it's loaded since
32
+ # rspec-expectations should be usable w/o rspec-core.
30
33
  def warn_deprecation(message)
31
34
  send :warn, message
32
35
  end
33
36
  end
34
37
  end
35
38
  end
36
-
@@ -1,12 +1,9 @@
1
1
  module RSpec
2
2
  module Expectations
3
- # If Test::Unit is loaed, we'll use its error as baseclass, so that Test::Unit
4
- # will report unmet RSpec expectations as failures rather than errors.
5
- superclass = ['Test::Unit::AssertionFailedError', '::StandardError'].map do |c|
6
- eval(c) rescue nil
7
- end.compact.first
8
-
9
- class ExpectationNotMetError < superclass
3
+ if defined?(Test::Unit::AssertionFailedError)
4
+ class ExpectationNotMetError < Test::Unit::AssertionFailedError; end
5
+ else
6
+ class ExpectationNotMetError < ::StandardError; end
10
7
  end
11
8
  end
12
9
  end
@@ -1,2 +1,3 @@
1
1
  require 'rspec/expectations/extensions/kernel'
2
2
  require 'rspec/expectations/extensions/array'
3
+ require 'rspec/expectations/extensions/object'
@@ -1,5 +1,7 @@
1
+ # @private
1
2
  class Array
2
3
  unless public_instance_methods.map {|m| m.to_s}.include?('none?')
4
+ # Supports +none?+ on early patch levels of Ruby 1.8.6
3
5
  def none?(&block)
4
6
  !any?(&block)
5
7
  end
@@ -1,51 +1,25 @@
1
1
  module Kernel
2
- # :call-seq:
3
- # should(matcher)
4
- # should == expected
5
- # should === expected
6
- # should =~ expected
7
- #
8
- # receiver.should(matcher)
9
- # => Passes if matcher.matches?(receiver)
10
- #
11
- # receiver.should == expected #any value
12
- # => Passes if (receiver == expected)
13
- #
14
- # receiver.should === expected #any value
15
- # => Passes if (receiver === expected)
16
- #
17
- # receiver.should =~ regexp
18
- # => Passes if (receiver =~ regexp)
19
- #
20
- # See RSpec::Matchers for more information about matchers
21
- #
22
- # == Warning
23
- #
24
- # NOTE that this does NOT support receiver.should != expected.
25
- # Instead, use receiver.should_not == expected
2
+ # Passes if +matcher+ returns true. Available on every +Object+.
3
+ # @example
4
+ # actual.should eq(expected)
5
+ # actual.should be > 4
6
+ # @param [Matcher]
7
+ # matcher
8
+ # @param [String] message optional message to display when the expectation fails
9
+ # @return [Boolean] true if the expectation succeeds (else raises)
10
+ # @see RSpec::Matchers
26
11
  def should(matcher=nil, message=nil, &block)
27
12
  RSpec::Expectations::PositiveExpectationHandler.handle_matcher(self, matcher, message, &block)
28
13
  end
29
-
30
- # :call-seq:
31
- # should_not(matcher)
32
- # should_not == expected
33
- # should_not === expected
34
- # should_not =~ expected
35
- #
36
- # receiver.should_not(matcher)
37
- # => Passes unless matcher.matches?(receiver)
38
- #
39
- # receiver.should_not == expected
40
- # => Passes unless (receiver == expected)
41
- #
42
- # receiver.should_not === expected
43
- # => Passes unless (receiver === expected)
44
- #
45
- # receiver.should_not =~ regexp
46
- # => Passes unless (receiver =~ regexp)
47
- #
48
- # See RSpec::Matchers for more information about matchers
14
+
15
+ # Passes if +matcher+ returns false. Available on every +Object+.
16
+ # @example
17
+ # actual.should_not eq(expected)
18
+ # @param [Matcher]
19
+ # matcher
20
+ # @param [String] message optional message to display when the expectation fails
21
+ # @return [Boolean] false if the negative expectation succeeds (else raises)
22
+ # @see RSpec::Matchers
49
23
  def should_not(matcher=nil, message=nil, &block)
50
24
  RSpec::Expectations::NegativeExpectationHandler.handle_matcher(self, matcher, message, &block)
51
25
  end
@@ -1,7 +1,8 @@
1
- # Cucumber 0.7 includes Rspec::Expectations
2
1
  module RSpec
3
2
  module Expectations
4
- module ConstMissing
3
+ module DeprecatedConstants
4
+ # Displays deprecation warning when it captures Rspec and Spec. Otherwise
5
+ # delegates to super.
5
6
  def const_missing(name)
6
7
  case name
7
8
  when :Rspec, :Spec
@@ -28,10 +29,11 @@ WARNING
28
29
  end
29
30
  end
30
31
 
32
+ # @deprecated (no replacement)
31
33
  def differ=(ignore)
32
34
  RSpec.deprecate("RSpec::Expectations.differ=(differ)", "nothing at all (diffing is now automatic and no longer configurable)")
33
35
  end
34
36
  end
35
37
  end
36
38
 
37
- Object.extend(RSpec::Expectations::ConstMissing)
39
+ extend RSpec::Expectations::DeprecatedConstants
@@ -1,16 +1,19 @@
1
1
  module RSpec
2
2
  module Expectations
3
3
  class << self
4
+ # @private
4
5
  def differ
5
6
  @differ ||= Differ.new
6
7
  end
7
8
 
8
- # raises a RSpec::Expectations::ExpectationNotMetError with message
9
+ # Raises an RSpec::Expectations::ExpectationNotMetError with message.
10
+ # @param [String] message
11
+ # @param [Object] expected
12
+ # @param [Object] actual
9
13
  #
10
- # When a differ has been assigned and fail_with is passed
11
- # <code>expected</code> and <code>actual</code>, passes them
12
- # to the differ to append a diff message to the failure message.
13
- def fail_with(message, expected=nil, actual=nil) # :nodoc:
14
+ # Adds a diff to the failure message when +expected+ and +actual+ are
15
+ # both present.
16
+ def fail_with(message, expected=nil, actual=nil)
14
17
  if !message
15
18
  raise ArgumentError, "Failure message is nil. Does your matcher define the " +
16
19
  "appropriate failure_message_for_* method to return a string?"