rspec-expectations 3.0.0.beta1 → 3.0.0.beta2

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 (122) hide show
  1. data.tar.gz.sig +2 -2
  2. data/.yardopts +1 -0
  3. data/Changelog.md +138 -0
  4. data/README.md +75 -8
  5. data/features/README.md +2 -2
  6. data/features/built_in_matchers/README.md +12 -9
  7. data/features/built_in_matchers/comparisons.feature +2 -2
  8. data/features/built_in_matchers/contain_exactly.feature +46 -0
  9. data/features/built_in_matchers/expect_change.feature +2 -2
  10. data/features/built_in_matchers/include.feature +0 -48
  11. data/features/built_in_matchers/output.feature +70 -0
  12. data/features/composing_matchers.feature +250 -0
  13. data/features/compound_expectations.feature +45 -0
  14. data/features/custom_matchers/access_running_example.feature +1 -1
  15. data/features/custom_matchers/define_matcher.feature +6 -6
  16. data/features/custom_matchers/define_matcher_outside_rspec.feature +4 -8
  17. data/features/test_frameworks/{test_unit.feature → minitest.feature} +11 -11
  18. data/lib/rspec/expectations.rb +31 -42
  19. data/lib/rspec/expectations/diff_presenter.rb +141 -0
  20. data/lib/rspec/expectations/differ.rb +22 -132
  21. data/lib/rspec/expectations/encoded_string.rb +56 -0
  22. data/lib/rspec/expectations/expectation_target.rb +0 -30
  23. data/lib/rspec/expectations/fail_with.rb +2 -2
  24. data/lib/rspec/expectations/handler.rb +128 -31
  25. data/lib/rspec/expectations/minitest_integration.rb +16 -0
  26. data/lib/rspec/expectations/syntax.rb +4 -58
  27. data/lib/rspec/expectations/version.rb +1 -1
  28. data/lib/rspec/matchers.rb +298 -60
  29. data/lib/rspec/matchers/aliased_matcher.rb +35 -0
  30. data/lib/rspec/matchers/built_in.rb +37 -33
  31. data/lib/rspec/matchers/built_in/base_matcher.rb +25 -15
  32. data/lib/rspec/matchers/built_in/be.rb +23 -31
  33. data/lib/rspec/matchers/built_in/be_between.rb +55 -0
  34. data/lib/rspec/matchers/built_in/be_within.rb +15 -11
  35. data/lib/rspec/matchers/built_in/change.rb +198 -81
  36. data/lib/rspec/matchers/built_in/compound.rb +106 -0
  37. data/lib/rspec/matchers/built_in/contain_exactly.rb +245 -0
  38. data/lib/rspec/matchers/built_in/eq.rb +43 -4
  39. data/lib/rspec/matchers/built_in/eql.rb +2 -2
  40. data/lib/rspec/matchers/built_in/equal.rb +35 -18
  41. data/lib/rspec/matchers/built_in/has.rb +16 -15
  42. data/lib/rspec/matchers/built_in/include.rb +45 -23
  43. data/lib/rspec/matchers/built_in/match.rb +6 -3
  44. data/lib/rspec/matchers/built_in/operators.rb +103 -0
  45. data/lib/rspec/matchers/built_in/output.rb +108 -0
  46. data/lib/rspec/matchers/built_in/raise_error.rb +9 -15
  47. data/lib/rspec/matchers/built_in/respond_to.rb +5 -4
  48. data/lib/rspec/matchers/built_in/satisfy.rb +4 -3
  49. data/lib/rspec/matchers/built_in/start_and_end_with.rb +37 -16
  50. data/lib/rspec/matchers/built_in/throw_symbol.rb +6 -5
  51. data/lib/rspec/matchers/built_in/yield.rb +31 -29
  52. data/lib/rspec/matchers/composable.rb +138 -0
  53. data/lib/rspec/matchers/dsl.rb +330 -0
  54. data/lib/rspec/matchers/generated_descriptions.rb +6 -6
  55. data/lib/rspec/matchers/matcher_delegator.rb +33 -0
  56. data/lib/rspec/matchers/pretty.rb +13 -2
  57. data/spec/rspec/expectations/{differ_spec.rb → diff_presenter_spec.rb} +56 -36
  58. data/spec/rspec/expectations/encoded_string_spec.rb +74 -0
  59. data/spec/rspec/expectations/extensions/kernel_spec.rb +11 -11
  60. data/spec/rspec/expectations/fail_with_spec.rb +8 -8
  61. data/spec/rspec/expectations/handler_spec.rb +27 -49
  62. data/spec/rspec/expectations/minitest_integration_spec.rb +27 -0
  63. data/spec/rspec/expectations/syntax_spec.rb +17 -67
  64. data/spec/rspec/expectations_spec.rb +7 -52
  65. data/spec/rspec/matchers/aliased_matcher_spec.rb +48 -0
  66. data/spec/rspec/matchers/aliases_spec.rb +449 -0
  67. data/spec/rspec/matchers/{base_matcher_spec.rb → built_in/base_matcher_spec.rb} +24 -3
  68. data/spec/rspec/matchers/built_in/be_between_spec.rb +159 -0
  69. data/spec/rspec/matchers/{be_instance_of_spec.rb → built_in/be_instance_of_spec.rb} +0 -0
  70. data/spec/rspec/matchers/{be_kind_of_spec.rb → built_in/be_kind_of_spec.rb} +0 -0
  71. data/spec/rspec/matchers/{be_spec.rb → built_in/be_spec.rb} +76 -32
  72. data/spec/rspec/matchers/{be_within_spec.rb → built_in/be_within_spec.rb} +6 -2
  73. data/spec/rspec/matchers/{change_spec.rb → built_in/change_spec.rb} +310 -69
  74. data/spec/rspec/matchers/built_in/compound_spec.rb +292 -0
  75. data/spec/rspec/matchers/built_in/contain_exactly_spec.rb +441 -0
  76. data/spec/rspec/matchers/{cover_spec.rb → built_in/cover_spec.rb} +0 -0
  77. data/spec/rspec/matchers/built_in/eq_spec.rb +156 -0
  78. data/spec/rspec/matchers/{eql_spec.rb → built_in/eql_spec.rb} +2 -2
  79. data/spec/rspec/matchers/built_in/equal_spec.rb +106 -0
  80. data/spec/rspec/matchers/{exist_spec.rb → built_in/exist_spec.rb} +1 -1
  81. data/spec/rspec/matchers/{has_spec.rb → built_in/has_spec.rb} +39 -0
  82. data/spec/rspec/matchers/{include_spec.rb → built_in/include_spec.rb} +118 -109
  83. data/spec/rspec/matchers/{match_spec.rb → built_in/match_spec.rb} +30 -2
  84. data/spec/rspec/matchers/{operator_matcher_spec.rb → built_in/operators_spec.rb} +26 -26
  85. data/spec/rspec/matchers/built_in/output_spec.rb +165 -0
  86. data/spec/rspec/matchers/{raise_error_spec.rb → built_in/raise_error_spec.rb} +81 -11
  87. data/spec/rspec/matchers/{respond_to_spec.rb → built_in/respond_to_spec.rb} +0 -0
  88. data/spec/rspec/matchers/{satisfy_spec.rb → built_in/satisfy_spec.rb} +0 -0
  89. data/spec/rspec/matchers/{start_with_end_with_spec.rb → built_in/start_and_end_with_spec.rb} +82 -15
  90. data/spec/rspec/matchers/{throw_symbol_spec.rb → built_in/throw_symbol_spec.rb} +29 -10
  91. data/spec/rspec/matchers/{yield_spec.rb → built_in/yield_spec.rb} +90 -0
  92. data/spec/rspec/matchers/configuration_spec.rb +7 -39
  93. data/spec/rspec/matchers/description_generation_spec.rb +22 -6
  94. data/spec/rspec/matchers/dsl_spec.rb +838 -0
  95. data/spec/rspec/matchers/legacy_spec.rb +101 -0
  96. data/spec/rspec/matchers_spec.rb +74 -0
  97. data/spec/spec_helper.rb +35 -21
  98. data/spec/support/shared_examples.rb +26 -4
  99. metadata +172 -116
  100. metadata.gz.sig +3 -4
  101. checksums.yaml +0 -15
  102. checksums.yaml.gz.sig +0 -0
  103. data/features/built_in_matchers/match_array.feature +0 -37
  104. data/lib/rspec/expectations/errors.rb +0 -9
  105. data/lib/rspec/expectations/extensions.rb +0 -1
  106. data/lib/rspec/expectations/extensions/object.rb +0 -29
  107. data/lib/rspec/matchers/built_in/match_array.rb +0 -51
  108. data/lib/rspec/matchers/compatibility.rb +0 -14
  109. data/lib/rspec/matchers/matcher.rb +0 -301
  110. data/lib/rspec/matchers/method_missing.rb +0 -12
  111. data/lib/rspec/matchers/operator_matcher.rb +0 -99
  112. data/lib/rspec/matchers/test_unit_integration.rb +0 -11
  113. data/spec/rspec/matchers/eq_spec.rb +0 -60
  114. data/spec/rspec/matchers/equal_spec.rb +0 -78
  115. data/spec/rspec/matchers/include_matcher_integration_spec.rb +0 -30
  116. data/spec/rspec/matchers/match_array_spec.rb +0 -194
  117. data/spec/rspec/matchers/matcher_spec.rb +0 -706
  118. data/spec/rspec/matchers/matchers_spec.rb +0 -36
  119. data/spec/rspec/matchers/method_missing_spec.rb +0 -28
  120. data/spec/support/classes.rb +0 -56
  121. data/spec/support/in_sub_process.rb +0 -37
  122. data/spec/support/ruby_version.rb +0 -10
data.tar.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- x�-w��//�ԭ㽞��%s�6�F�+C1[͞*������ ��(2K���8��*��r�%Z׵��X�-d�ي�98l���{�:�4
2
- {���d3��ReDm���gb=�����/fu����uWh��5[��y������k��q�ѓ���CWAl�% t-S
1
+ b��y8W����O~����(���^WK� "ڴj�z\�fF�~���0"�6��KSVv/�t��K�rz[x�� (�����n�BA?L�.=R���O}l=D�8�.��dI��S���~�� 4�Y����A+�����8��`��H�W� �Oh"k���D�_�
2
+ _���{�0�]��e��Ƭj����*Pz@�docLt�t���C�;��F(J����6���<7�v�X�r�gmi��I�-�B0
data/.yardopts CHANGED
@@ -1,3 +1,4 @@
1
+ --load ./yard/alias_matcher.rb
1
2
  --exclude features
2
3
  --no-private
3
4
  --markup markdown
@@ -1,3 +1,101 @@
1
+ ### 3.0.0.beta2 / 2014-02-17
2
+ [full changelog](http://github.com/rspec/rspec-expectations/compare/v3.0.0.beta1...v3.0.0.beta2)
3
+
4
+ Breaking Changes for 3.0.0:
5
+
6
+ * Remove deprecated support for accessing the `RSpec` constant using
7
+ `Rspec` or `Spec`. (Myron Marston)
8
+ * Remove deprecated `RSpec::Expectations.differ=`. (Myron Marston)
9
+ * Remove support for deprecated `expect(...).should`. (Myron Marston)
10
+ * Explicitly disallow `expect { }.not_to change { }` with `by`,
11
+ `by_at_least`, `by_at_most` or `to`. These have never been supported
12
+ but did not raise explicit errors. (Myron Marston)
13
+ * Provide `===` rather than `==` as an alias of `matches?` for
14
+ all matchers. The semantics of `===` are closer to an RSpec
15
+ matcher than `==`. (Myron Marston)
16
+ * Remove deprecated `RSpec::Matchers::OperatorMatcher` constant.
17
+ (Myron Marston)
18
+ * Make `RSpec::Expectations::ExpectationNotMetError` subclass
19
+ `Exception` rather than `StandardError` so they can bypass
20
+ a bare `rescue` in end-user code (e.g. when an expectation is
21
+ set from within a rspec-mocks stub implementation). (Myron Marston)
22
+ * Remove Test::Unit and Minitest 4.x integration. (Myron Marston)
23
+
24
+ Enhancements:
25
+
26
+ * Simplify the failure message of the `be` matcher when matching against:
27
+ `true`, `false` and `nil`. (Sam Phippen)
28
+ * Update matcher protocol and custom matcher DSL to better align
29
+ with the newer `expect` syntax. If you want your matchers to
30
+ maintain compatibility with multiple versions of RSpec, you can
31
+ alias the new names to the old. (Myron Marston)
32
+ * `failure_message_for_should` => `failure_message`
33
+ * `failure_message_for_should_not` => `failure_message_when_negated`
34
+ * `match_for_should` => `match`
35
+ * `match_for_should_not` => `match_when_negated`
36
+ * Improve generated descriptions from `change` matcher. (Myron Marston)
37
+ * Add support for compound matcher expressions using `and` and `or`.
38
+ Simply chain them off of any existing matcher to create an expression
39
+ like `expect(alphabet).to start_with("a").and end_with("z")`.
40
+ (Eloy Espinaco)
41
+ * Add `contain_exactly` as a less ambiguous version of `match_array`.
42
+ Note that it expects the expected array to be splatted as
43
+ individual args: `expect(array).to contain_exactly(1, 2)` is
44
+ the same as `expect(array).to match_array([1, 2])`. (Myron Marston)
45
+ * Update `contain_exactly`/`match_array` so that it can match against
46
+ other non-array collections (such as a `Set`). (Myron Marston)
47
+ * Update built-in matchers so that they can accept matchers as arguments
48
+ to allow you to compose matchers in arbitrary ways. (Myron Marston)
49
+ * Add `RSpec::Matchers::Composable` mixin that can be used to make
50
+ a custom matcher composable as well. Note that custom matchers
51
+ defined via `RSpec::Matchers.define` already have this. (Myron
52
+ Marston)
53
+ * Define noun-phrase aliases for built-in matchers, which can be
54
+ used when creating composed matcher expressions that read better
55
+ and provide better failure messages. (Myron Marston)
56
+ * Add `RSpec::Machers.alias_matcher` so users can define their own
57
+ matcher aliases. The `description` of the matcher will reflect the
58
+ alternate matcher name. (Myron Marston)
59
+ * Add explicit `be_between` matcher. `be_between` has worked for a
60
+ long time as a dynamic predicate matcher, but the failure message
61
+ was suboptimal. The new matcher provides a much better failure
62
+ message. (Erik Michaels-Ober)
63
+ * Enhance the `be_between` matcher to allow for `inclusive` or `exclusive`
64
+ comparison (e.g. inclusive of min/max or exclusive of min/max).
65
+ (Pedro Gimenez)
66
+ * Make failure message for `not_to be #{operator}` less confusing by
67
+ only saying it's confusing when comparison operators are used.
68
+ (Prathamesh Sonpatki)
69
+ * Improve failure message of `eq` matcher when `Time` or `DateTime`
70
+ objects are used so that the full sub-second precision is included.
71
+ (Thomas Holmes, Jeff Wallace)
72
+ * Add `output` matcher for expecting that a block outputs `to_stdout`
73
+ or `to_stderr`. (Luca Pette, Matthias Günther)
74
+ * Forward a provided block on to the `has_xyz?` method call when
75
+ the `have_xyz` matcher is used. (Damian Galarza)
76
+ * Provide integration with Minitest 5.x. Require
77
+ `rspec/expectations/minitest_integration` after loading minitest
78
+ to use rspec-expectations with minitest. (Myron Marston)
79
+
80
+ Bug Fixes:
81
+
82
+ * Fix wrong matcher descriptions with falsey expected value (yujinakayama)
83
+ * Fix `expect { }.not_to change { }.from(x)` so that the matcher only
84
+ passes if the starting value is `x`. (Tyler Rick, Myron Marston)
85
+ * Fix hash diffing, so that it colorizes properly and doesn't consider trailing
86
+ commas when performing the diff. (Jared Norman)
87
+ * Fix built-in matchers to fail normally rather than raising
88
+ `ArgumentError` when given an object of the wrong type to match
89
+ against, so that they work well in composite matcher expressions like
90
+ `expect([1.51, "foo"]).to include(a_string_matching(/foo/), a_value_within(0.1).of(1.5))`.
91
+ (Myron Marston)
92
+
93
+ Deprecations:
94
+
95
+ * Retain support for RSpec 2 matcher protocol (e.g. for matchers
96
+ in 3rd party extension gems like `shoulda`), but it will print
97
+ a deprecation warning. (Myron Marston)
98
+
1
99
  ### 3.0.0.beta1 / 2013-11-07
2
100
  [full changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0.beta1...v3.0.0.beta1)
3
101
 
@@ -6,6 +104,10 @@ Breaking Changes for 3.0.0:
6
104
  * Remove explicit support for 1.8.6. (Jon Rowe)
7
105
  * Remove the deprecated `be_close` matcher, preferring `be_within` instead.
8
106
  (Sam Phippen)
107
+ * Remove the deprecated `have`, `have_at_least` and `have_at_most` matchers.
108
+ You can continue using those matchers through https://github.com/rspec/rspec-collection_matchers,
109
+ or you can rewrite your expectations with something like
110
+ `expect(your_object.size).to eq(num)`. (Hugo Baraúna)
9
111
  * Rename `be_true` and `be_false` to `be_truthy` and `be_falsey`. (Sam Phippen)
10
112
  * Make `expect { }.to_not raise_error(SomeSpecificClass, message)`,
11
113
  `expect { }.to_not raise_error(SomeSpecificClass)` and
@@ -17,6 +119,7 @@ Breaking Changes for 3.0.0:
17
119
  available to the `match` block (or any of the others). Instead
18
120
  `include` your helper module and define the helper method as an
19
121
  instance method. (Myron Marston)
122
+ * Force upgrading Diff::LCS for encoding compatbility with diffs. (Jon Rowe)
20
123
 
21
124
  Enhancements:
22
125
 
@@ -34,6 +137,7 @@ Bug Fixes:
34
137
 
35
138
  * Allow `include` and `match` matchers to be used from within a
36
139
  DSL-defined custom matcher's `match` block. (Myron Marston)
140
+ * Correct encoding error message on diff failure (Jon Rowe)
37
141
 
38
142
  Deprecations:
39
143
 
@@ -41,6 +145,32 @@ Deprecations:
41
145
  It will continue to work but will emit a deprecation warning in RSpec 3 if
42
146
  you do not explicitly enable it. (Sam Phippen)
43
147
 
148
+ ### 2.99.0.beta2 / 2014-02-17
149
+ [full changelog](http://github.com/rspec/rspec-expectations/compare/v2.99.0.beta1...v2.99.0.beta2)
150
+
151
+ Deprecations:
152
+
153
+ * Deprecate chaining `by`, `by_at_least`, `by_at_most` or `to` off of
154
+ `expect { }.not_to change { }`. The docs have always said these are
155
+ not supported for the negative form but now they explicitly raise
156
+ errors in RSpec 3. (Myron Marston)
157
+ * Change the semantics of `expect { }.not_to change { x }.from(y)`.
158
+ In RSpec 2.x, this expectation would only fail if `x` started with
159
+ the value of `y` and changed. If it started with a different value
160
+ and changed, it would pass. In RSpec 3, it will pass only if the
161
+ value starts at `y` and it does not change. (Myron Marston)
162
+ * Deprecate `matcher == value` as an alias for `matcher.matches?(value)`,
163
+ in favor of `matcher === value`. (Myron Marston)
164
+ * Deprecate `RSpec::Matchers::OperatorMatcher` in favor of
165
+ `RSpec::Matchers::BuiltIn::OperatorMatcher`. (Myron Marston)
166
+ * Deprecate auto-integration with Test::Unit and minitest.
167
+ Instead, include `RSpec::Matchers` in the appropriate test case
168
+ base class yourself. (Myron Marston)
169
+ * Deprecate treating `#expected` on a DSL-generated custom matcher
170
+ as an array when only 1 argument is passed to the matcher method.
171
+ In RSpec 3 it will be the single value in order to make diffs
172
+ work properly. (Jon Rowe)
173
+
44
174
  ### 2.99.0.beta1 / 2013-11-07
45
175
  [full changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.4...v2.99.0.beta1)
46
176
 
@@ -66,6 +196,14 @@ Deprecations
66
196
  * RSpec 2.x allowed helper methods defined either way to be used for
67
197
  either purpose, but RSpec 3.0 will not.
68
198
 
199
+ ### 2.14.5 / 2014-02-01
200
+ [full changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.4...v2.14.5)
201
+
202
+ Bug fixes
203
+
204
+ * Fix wrong matcher descriptions with falsey expected value
205
+ (yujinakayama)
206
+
69
207
  ### 2.14.4 / 2013-11-06
70
208
  [full changelog](http://github.com/rspec/rspec-expectations/compare/v2.14.3...v2.14.4)
71
209
 
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # RSpec Expectations [![Build Status](https://secure.travis-ci.org/rspec/rspec-expectations.png?branch=master)](http://travis-ci.org/rspec/rspec-expectations) [![Code Climate](https://codeclimate.com/github/rspec/rspec-expectations.png)](https://codeclimate.com/github/rspec/rspec-expectations) [![Coverage Status](https://coveralls.io/repos/rspec/rspec-expectations/badge.png?branch=master)](https://coveralls.io/r/rspec/rspec-expectations?branch=master)
1
+ # RSpec Expectations [![Build Status](https://secure.travis-ci.org/rspec/rspec-expectations.png?branch=master)](http://travis-ci.org/rspec/rspec-expectations) [![Code Climate](https://codeclimate.com/github/rspec/rspec-expectations.png)](https://codeclimate.com/github/rspec/rspec-expectations)
2
2
 
3
3
  RSpec::Expectations lets you express expected outcomes on an object in an
4
4
  example.
@@ -71,7 +71,6 @@ expect(actual).to be >= expected
71
71
  expect(actual).to be <= expected
72
72
  expect(actual).to be < expected
73
73
  expect(actual).to be_within(delta).of(expected)
74
- expect(array).to match_array(expected)
75
74
  ```
76
75
 
77
76
  ### Regular expressions
@@ -152,21 +151,27 @@ expect(1..10).to cover(3)
152
151
  expect(actual).to include(expected)
153
152
  expect(actual).to start_with(expected)
154
153
  expect(actual).to end_with(expected)
154
+
155
+ expect(actual).to contain_exactly(individual, items)
156
+ # ...which is the same as:
157
+ expect(actual).to match_array(expected_array)
155
158
  ```
156
159
 
157
160
  #### Examples
158
161
 
159
162
  ```ruby
160
- expect([1,2,3]).to include(1)
161
- expect([1,2,3]).to include(1, 2)
162
- expect([1,2,3]).to start_with(1)
163
- expect([1,2,3]).to start_with(1,2)
164
- expect([1,2,3]).to end_with(3)
165
- expect([1,2,3]).to end_with(2,3)
163
+ expect([1, 2, 3]).to include(1)
164
+ expect([1, 2, 3]).to include(1, 2)
165
+ expect([1, 2, 3]).to start_with(1)
166
+ expect([1, 2, 3]).to start_with(1, 2)
167
+ expect([1, 2, 3]).to end_with(3)
168
+ expect([1, 2, 3]).to end_with(2, 3)
166
169
  expect({:a => 'b'}).to include(:a => 'b')
167
170
  expect("this string").to include("is str")
168
171
  expect("this string").to start_with("this")
169
172
  expect("this string").to end_with("ring")
173
+ expect([1, 2, 3]).to contain_exactly(2, 3, 1)
174
+ expect([1, 2, 3]).to match_array([3, 2, 1])
170
175
  ```
171
176
 
172
177
  ## `should` syntax
@@ -182,6 +187,68 @@ actual.should be > 3
182
187
 
183
188
  See [detailed information on the `should` syntax and its usage.](https://github.com/rspec/rspec-expectations/blob/master/Should.md)
184
189
 
190
+ ## Compound Matcher Expressions
191
+
192
+ You can also create compound matcher expressions using `and` or `or`:
193
+
194
+ ``` ruby
195
+ expect(alphabet).to start_with("a").and end_with("z")
196
+ expect(stoplight.color).to eq("red").or eq("green").or eq("yellow")
197
+ ```
198
+
199
+ ## Composing Matchers
200
+
201
+ Many of the built-in matchers are designed to take matchers as
202
+ arguments, to allow you to flexibly specify only the essential
203
+ aspects of an object or data structure. In addition, all of the
204
+ built-in matchers have one or more aliases that provide better
205
+ phrasing for when they are used as arguments to another matcher.
206
+
207
+ ### Examples
208
+
209
+ ```ruby
210
+ expect { k += 1.05 }.to change { k }.by( a_value_within(0.1).of(1.0) )
211
+
212
+ expect { s = "barn" }.to change { s }
213
+ .from( a_string_matching(/foo/) )
214
+ .to( a_string_matching(/bar/) )
215
+
216
+ expect(["barn", 2.45]).to contain_exactly(
217
+ a_value_within(0.1).of(2.5),
218
+ a_string_starting_with("bar")
219
+ )
220
+
221
+ expect(["barn", "food", 2.45]).to end_with(
222
+ a_string_matching("foo"),
223
+ a_value > 2
224
+ )
225
+
226
+ expect(["barn", 2.45]).to include( a_string_starting_with("bar") )
227
+
228
+ expect(:a => "food", :b => "good").to include(:a => a_string_matching(/foo/))
229
+
230
+ hash = {
231
+ :a => {
232
+ :b => ["foo", 5],
233
+ :c => { :d => 2.05 }
234
+ }
235
+ }
236
+
237
+ expect(hash).to match(
238
+ :a => {
239
+ :b => a_collection_containing_exactly(
240
+ a_string_starting_with("f"),
241
+ an_instance_of(Fixnum)
242
+ ),
243
+ :c => { :d => (a_value < 3) }
244
+ }
245
+ )
246
+
247
+ expect { |probe|
248
+ [1, 2, 3].each(&probe)
249
+ }.to yield_successive_args( a_value < 2, 2, a_value > 2 )
250
+ ```
251
+
185
252
  ## Also see
186
253
 
187
254
  * [http://github.com/rspec/rspec](http://github.com/rspec/rspec)
@@ -26,12 +26,12 @@ Note: You can also use `expect(..).to_not` instead of `expect(..).not_to`.
26
26
  A Matcher is any object that responds to the following methods:
27
27
 
28
28
  matches?(actual)
29
- failure_message_for_should
29
+ failure_message
30
30
 
31
31
  These methods are also part of the matcher protocol, but are optional:
32
32
 
33
33
  does_not_match?(actual)
34
- failure_message_for_should_not
34
+ failure_message_when_negated
35
35
  description
36
36
 
37
37
  RSpec ships with a number of built-in matchers and a DSL for writing custom
@@ -46,10 +46,11 @@ e.g.
46
46
 
47
47
  ## Truthiness and existentialism
48
48
 
49
- expect(actual).to be_true # passes if actual is truthy (not nil or false)
50
- expect(actual).to be_false # passes if actual is falsy (nil or false)
51
- expect(actual).to be_nil # passes if actual is nil
52
- expect(actual).to be # passes if actual is truthy (not nil or false)
49
+ expect(actual).to be_truthy # passes if actual is truthy (not nil or false)
50
+ expect(actual).to be true # passes if actual == true
51
+ expect(actual).to be_falsey # passes if actual is falsy (nil or false)
52
+ expect(actual).to be false # passes if actual == false
53
+ expect(actual).to be_nil # passes if actual is nil
53
54
 
54
55
  ## Expecting errors
55
56
 
@@ -77,16 +78,18 @@ e.g.
77
78
  ## Collection membership
78
79
 
79
80
  expect(actual).to include(expected)
80
- expect(array).to match_array(expected)
81
+ expect(array).to match_array(expected_array)
82
+ # ...which is the same as:
83
+ expect(array).to contain_exactly(individual, elements)
81
84
 
82
85
  ### Examples
83
86
 
84
- expect([1,2,3]).to include(1)
85
- expect([1,2,3]).to include(1, 2)
87
+ expect([1, 2, 3]).to include(1)
88
+ expect([1, 2, 3]).to include(1, 2)
86
89
  expect(:a => 'b').to include(:a => 'b')
87
90
  expect("this string").to include("is str")
88
- expect([1,2,3]).to match_array([1,2,3])
89
- expect([1,2,3]).to match_array([3,2,1])
91
+ expect([1, 2, 3]).to contain_exactly(2, 1, 3)
92
+ expect([1, 2, 3]).to match_array([3, 2, 1])
90
93
 
91
94
  ## Ranges (1.9 only)
92
95
 
@@ -1,7 +1,7 @@
1
- Feature: comparsion matchers
1
+ Feature: comparison matchers
2
2
 
3
3
  RSpec provides a number of matchers that are based on Ruby's built-in
4
- operators. These can be used for generalized comparsion of values. E.g.
4
+ operators. These can be used for generalized comparison of values. E.g.
5
5
 
6
6
  ```ruby
7
7
  expect(9).to be > 6
@@ -0,0 +1,46 @@
1
+ Feature: contain_exactly matcher
2
+
3
+ The `contain_exactly` matcher provides a way to test arrays against each other
4
+ in a way that disregards differences in the ordering between the actual
5
+ and expected array. For example:
6
+
7
+ ```ruby
8
+ expect([1, 2, 3]).to contain_exactly(2, 3, 1) # pass
9
+ expect([:a, :c, :b]).to contain_exactly(:a, :c ) # fail
10
+ ```
11
+
12
+ This matcher is also available as `match_array`, which expects the
13
+ expected array to be given as a single array argument rather than
14
+ as individual splatted elements. The above could also be written as:
15
+
16
+ ```ruby
17
+ expect([1, 2, 3]).to match_array [2, 3, 1] # pass
18
+ expect([:a, :c, :b]).to match_array [:a, :c] # fail
19
+ ```
20
+
21
+ Scenario: array operator matchers
22
+ Given a file named "contain_exactly_matcher_spec.rb" with:
23
+ """ruby
24
+ describe do
25
+ example { expect([1, 2, 3]).to contain_exactly(1, 2, 3) }
26
+ example { expect([1, 2, 3]).to contain_exactly(1, 3, 2) }
27
+ example { expect([1, 2, 3]).to contain_exactly(2, 1, 3) }
28
+ example { expect([1, 2, 3]).to contain_exactly(2, 3, 1) }
29
+ example { expect([1, 2, 3]).to contain_exactly(3, 1, 2) }
30
+ example { expect([1, 2, 3]).to contain_exactly(3, 2, 1) }
31
+
32
+ # deliberate failures
33
+ example { expect([1, 2, 3]).to contain_exactly(1, 2, 1) }
34
+ end
35
+ """
36
+ When I run `rspec contain_exactly_matcher_spec.rb`
37
+ Then the output should contain "7 examples, 1 failure"
38
+ And the output should contain:
39
+ """
40
+ Failure/Error: example { expect([1, 2, 3]).to contain_exactly(1, 2, 1) }
41
+ expected collection contained: [1, 1, 2]
42
+ actual collection contained: [1, 2, 3]
43
+ the missing elements were: [1]
44
+ the extra elements were: [3]
45
+ """
46
+
@@ -37,7 +37,7 @@ Feature: expect change
37
37
  """
38
38
  When I run `rspec spec/example_spec.rb`
39
39
  Then the output should contain "1 failure"
40
- Then the output should contain "should have been changed by 2, but was changed by 1"
40
+ Then the output should contain "expected result to have changed by 2, but was changed by 1"
41
41
 
42
42
  Scenario: expect no change
43
43
  Given a file named "spec/example_spec.rb" with:
@@ -56,4 +56,4 @@ Feature: expect change
56
56
  """
57
57
  When I run `rspec spec/example_spec.rb`
58
58
  Then the output should contain "2 failures"
59
- Then the output should contain "should not have changed, but did change from 1 to 2"
59
+ Then the output should contain "expected result not to have changed, but did change from 1 to 2"
@@ -124,51 +124,3 @@ Feature: include matcher
124
124
  When I run `rspec hash_include_matcher_spec.rb`
125
125
  Then the output should contain "13 failure"
126
126
 
127
- Scenario: fuzzy usage with matchers
128
- Given a file named "fuzzy_include_matcher_spec.rb" with:
129
- """
130
- require 'ostruct'
131
-
132
- class User < OpenStruct
133
- def inspect
134
- name
135
- end
136
- end
137
-
138
- RSpec::Matchers.define :a_user_named do |expected|
139
- match do |actual|
140
- actual.is_a?(User) && (actual.name == expected)
141
- end
142
- description do
143
- "a user named '#{expected}'"
144
- end
145
- end
146
-
147
- describe "Collection of users" do
148
- subject do
149
- [User.new(:name => "Joe"),
150
- User.new(:name => "Fred"),
151
- User.new(:name => "John"),
152
- User.new(:name => "Luke"),
153
- User.new(:name => "David")]
154
- end
155
-
156
- it { should include( a_user_named "Joe" ) }
157
- it { should include( a_user_named "Luke" ) }
158
- it { should_not include( a_user_named "Richard" ) }
159
- it { should_not include( a_user_named "Hayley" ) }
160
-
161
- # deliberate failures
162
- it { should include( a_user_named "Richard" ) }
163
- it { should_not include( a_user_named "Fred" ) }
164
- it { should include( a_user_named "Sarah" ) }
165
- it { should_not include( a_user_named "Luke" ) }
166
- end
167
- """
168
- When I run `rspec fuzzy_include_matcher_spec.rb`
169
- Then the output should contain all of these:
170
- | 8 examples, 4 failures |
171
- | expected [Joe, Fred, John, Luke, David] to include a user named 'Richard' |
172
- | expected [Joe, Fred, John, Luke, David] not to include a user named 'Fred' |
173
- | expected [Joe, Fred, John, Luke, David] to include a user named 'Sarah' |
174
- | expected [Joe, Fred, John, Luke, David] not to include a user named 'Luke' |