rspec-expectations 3.0.0.beta2 → 3.0.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 (135) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -2
  4. data/.yardopts +0 -1
  5. data/Changelog.md +115 -35
  6. data/README.md +2 -2
  7. data/lib/rspec/expectations.rb +13 -8
  8. data/lib/rspec/{matchers → expectations}/configuration.rb +38 -13
  9. data/lib/rspec/expectations/expectation_target.rb +72 -8
  10. data/lib/rspec/expectations/fail_with.rb +10 -52
  11. data/lib/rspec/expectations/handler.rb +9 -11
  12. data/lib/rspec/expectations/syntax.rb +37 -35
  13. data/lib/rspec/expectations/version.rb +1 -1
  14. data/lib/rspec/matchers.rb +60 -9
  15. data/lib/rspec/matchers/aliased_matcher.rb +6 -0
  16. data/lib/rspec/matchers/built_in.rb +9 -1
  17. data/lib/rspec/matchers/built_in/all.rb +78 -0
  18. data/lib/rspec/matchers/built_in/base_matcher.rb +39 -1
  19. data/lib/rspec/matchers/built_in/be.rb +117 -42
  20. data/lib/rspec/matchers/built_in/be_between.rb +22 -0
  21. data/lib/rspec/matchers/built_in/be_instance_of.rb +11 -3
  22. data/lib/rspec/matchers/built_in/be_kind_of.rb +5 -0
  23. data/lib/rspec/matchers/built_in/be_within.rb +26 -6
  24. data/lib/rspec/matchers/built_in/change.rb +89 -13
  25. data/lib/rspec/matchers/built_in/compound.rb +19 -3
  26. data/lib/rspec/matchers/built_in/contain_exactly.rb +17 -6
  27. data/lib/rspec/matchers/built_in/cover.rb +3 -0
  28. data/lib/rspec/matchers/built_in/eq.rb +20 -5
  29. data/lib/rspec/matchers/built_in/eql.rb +15 -3
  30. data/lib/rspec/matchers/built_in/equal.rb +23 -6
  31. data/lib/rspec/matchers/built_in/exist.rb +74 -10
  32. data/lib/rspec/matchers/built_in/has.rb +58 -3
  33. data/lib/rspec/matchers/built_in/include.rb +16 -1
  34. data/lib/rspec/matchers/built_in/match.rb +14 -4
  35. data/lib/rspec/matchers/built_in/operators.rb +16 -0
  36. data/lib/rspec/matchers/built_in/output.rb +47 -5
  37. data/lib/rspec/matchers/built_in/raise_error.rb +40 -23
  38. data/lib/rspec/matchers/built_in/respond_to.rb +37 -16
  39. data/lib/rspec/matchers/built_in/satisfy.rb +15 -0
  40. data/lib/rspec/matchers/built_in/start_and_end_with.rb +29 -14
  41. data/lib/rspec/matchers/built_in/throw_symbol.rb +32 -3
  42. data/lib/rspec/matchers/built_in/yield.rb +148 -44
  43. data/lib/rspec/matchers/composable.rb +48 -7
  44. data/lib/rspec/matchers/dsl.rb +45 -17
  45. data/lib/rspec/matchers/generated_descriptions.rb +7 -0
  46. data/lib/rspec/matchers/matcher_delegator.rb +6 -2
  47. data/lib/rspec/matchers/pretty.rb +15 -19
  48. metadata +33 -236
  49. metadata.gz.sig +0 -0
  50. data/features/README.md +0 -48
  51. data/features/Upgrade.md +0 -53
  52. data/features/built_in_matchers/README.md +0 -96
  53. data/features/built_in_matchers/be.feature +0 -175
  54. data/features/built_in_matchers/be_within.feature +0 -48
  55. data/features/built_in_matchers/comparisons.feature +0 -97
  56. data/features/built_in_matchers/contain_exactly.feature +0 -46
  57. data/features/built_in_matchers/cover.feature +0 -47
  58. data/features/built_in_matchers/end_with.feature +0 -48
  59. data/features/built_in_matchers/equality.feature +0 -136
  60. data/features/built_in_matchers/exist.feature +0 -45
  61. data/features/built_in_matchers/expect_change.feature +0 -59
  62. data/features/built_in_matchers/expect_error.feature +0 -144
  63. data/features/built_in_matchers/include.feature +0 -126
  64. data/features/built_in_matchers/match.feature +0 -51
  65. data/features/built_in_matchers/output.feature +0 -70
  66. data/features/built_in_matchers/predicates.feature +0 -161
  67. data/features/built_in_matchers/respond_to.feature +0 -84
  68. data/features/built_in_matchers/satisfy.feature +0 -33
  69. data/features/built_in_matchers/start_with.feature +0 -48
  70. data/features/built_in_matchers/throw_symbol.feature +0 -91
  71. data/features/built_in_matchers/types.feature +0 -116
  72. data/features/built_in_matchers/yield.feature +0 -161
  73. data/features/composing_matchers.feature +0 -250
  74. data/features/compound_expectations.feature +0 -45
  75. data/features/custom_matchers/access_running_example.feature +0 -53
  76. data/features/custom_matchers/define_diffable_matcher.feature +0 -27
  77. data/features/custom_matchers/define_matcher.feature +0 -340
  78. data/features/custom_matchers/define_matcher_outside_rspec.feature +0 -34
  79. data/features/custom_matchers/define_matcher_with_fluent_interface.feature +0 -24
  80. data/features/customized_message.feature +0 -39
  81. data/features/diffing.feature +0 -85
  82. data/features/implicit_docstrings.feature +0 -52
  83. data/features/step_definitions/additional_cli_steps.rb +0 -22
  84. data/features/support/env.rb +0 -21
  85. data/features/support/rubinius.rb +0 -6
  86. data/features/syntax_configuration.feature +0 -71
  87. data/features/test_frameworks/minitest.feature +0 -44
  88. data/lib/rspec-expectations.rb +0 -1
  89. data/lib/rspec/expectations/diff_presenter.rb +0 -141
  90. data/lib/rspec/expectations/differ.rb +0 -44
  91. data/lib/rspec/expectations/encoded_string.rb +0 -56
  92. data/spec/rspec/expectations/diff_presenter_spec.rb +0 -249
  93. data/spec/rspec/expectations/encoded_string_spec.rb +0 -74
  94. data/spec/rspec/expectations/expectation_target_spec.rb +0 -82
  95. data/spec/rspec/expectations/extensions/kernel_spec.rb +0 -67
  96. data/spec/rspec/expectations/fail_with_spec.rb +0 -114
  97. data/spec/rspec/expectations/handler_spec.rb +0 -205
  98. data/spec/rspec/expectations/minitest_integration_spec.rb +0 -27
  99. data/spec/rspec/expectations/syntax_spec.rb +0 -89
  100. data/spec/rspec/expectations_spec.rb +0 -12
  101. data/spec/rspec/matchers/aliased_matcher_spec.rb +0 -48
  102. data/spec/rspec/matchers/aliases_spec.rb +0 -449
  103. data/spec/rspec/matchers/built_in/base_matcher_spec.rb +0 -83
  104. data/spec/rspec/matchers/built_in/be_between_spec.rb +0 -159
  105. data/spec/rspec/matchers/built_in/be_instance_of_spec.rb +0 -63
  106. data/spec/rspec/matchers/built_in/be_kind_of_spec.rb +0 -41
  107. data/spec/rspec/matchers/built_in/be_spec.rb +0 -592
  108. data/spec/rspec/matchers/built_in/be_within_spec.rb +0 -141
  109. data/spec/rspec/matchers/built_in/change_spec.rb +0 -808
  110. data/spec/rspec/matchers/built_in/compound_spec.rb +0 -292
  111. data/spec/rspec/matchers/built_in/contain_exactly_spec.rb +0 -441
  112. data/spec/rspec/matchers/built_in/cover_spec.rb +0 -69
  113. data/spec/rspec/matchers/built_in/eq_spec.rb +0 -156
  114. data/spec/rspec/matchers/built_in/eql_spec.rb +0 -41
  115. data/spec/rspec/matchers/built_in/equal_spec.rb +0 -106
  116. data/spec/rspec/matchers/built_in/exist_spec.rb +0 -124
  117. data/spec/rspec/matchers/built_in/has_spec.rb +0 -161
  118. data/spec/rspec/matchers/built_in/include_spec.rb +0 -540
  119. data/spec/rspec/matchers/built_in/match_spec.rb +0 -102
  120. data/spec/rspec/matchers/built_in/operators_spec.rb +0 -252
  121. data/spec/rspec/matchers/built_in/output_spec.rb +0 -165
  122. data/spec/rspec/matchers/built_in/raise_error_spec.rb +0 -461
  123. data/spec/rspec/matchers/built_in/respond_to_spec.rb +0 -292
  124. data/spec/rspec/matchers/built_in/satisfy_spec.rb +0 -44
  125. data/spec/rspec/matchers/built_in/start_and_end_with_spec.rb +0 -253
  126. data/spec/rspec/matchers/built_in/throw_symbol_spec.rb +0 -135
  127. data/spec/rspec/matchers/built_in/yield_spec.rb +0 -627
  128. data/spec/rspec/matchers/configuration_spec.rb +0 -213
  129. data/spec/rspec/matchers/description_generation_spec.rb +0 -191
  130. data/spec/rspec/matchers/dsl_spec.rb +0 -895
  131. data/spec/rspec/matchers/legacy_spec.rb +0 -101
  132. data/spec/rspec/matchers_spec.rb +0 -74
  133. data/spec/spec_helper.rb +0 -85
  134. data/spec/support/matchers.rb +0 -22
  135. data/spec/support/shared_examples.rb +0 -35
@@ -1,12 +1,23 @@
1
1
  module RSpec
2
2
  module Matchers
3
3
  module BuiltIn
4
+ # @api private
5
+ # Provides the implementation for `be_between`.
6
+ # Not intended to be instantiated directly.
4
7
  class BeBetween < BaseMatcher
5
8
  def initialize(min, max)
6
9
  @min, @max = min, max
7
10
  inclusive
8
11
  end
9
12
 
13
+ # @api public
14
+ # Makes the between comparison inclusive.
15
+ #
16
+ # @example
17
+ # expect(3).to be_between(2, 3).inclusive
18
+ #
19
+ # @note The matcher is inclusive by default; this simply provides
20
+ # a way to be more explicit about it.
10
21
  def inclusive
11
22
  @less_than_operator = :<=
12
23
  @greater_than_operator = :>=
@@ -14,6 +25,11 @@ module RSpec
14
25
  self
15
26
  end
16
27
 
28
+ # @api public
29
+ # Makes the between comparison exclusive.
30
+ #
31
+ # @example
32
+ # expect(3).to be_between(2, 4).exclusive
17
33
  def exclusive
18
34
  @less_than_operator = :<
19
35
  @greater_than_operator = :>
@@ -21,6 +37,8 @@ module RSpec
21
37
  self
22
38
  end
23
39
 
40
+ # @api private
41
+ # @return [Boolean]
24
42
  def matches?(actual)
25
43
  @actual = actual
26
44
  comparable? && compare
@@ -28,10 +46,14 @@ module RSpec
28
46
  false
29
47
  end
30
48
 
49
+ # @api private
50
+ # @return [String]
31
51
  def failure_message
32
52
  "#{super}#{not_comparable_clause}"
33
53
  end
34
54
 
55
+ # @api private
56
+ # @return [String]
35
57
  def description
36
58
  "be between #{@min.inspect} and #{@max.inspect} (#{@mode})"
37
59
  end
@@ -1,14 +1,22 @@
1
1
  module RSpec
2
2
  module Matchers
3
3
  module BuiltIn
4
+ # @api private
5
+ # Provides the implementation for `be_an_instance_of`.
6
+ # Not intended to be instantiated directly.
4
7
  class BeAnInstanceOf < BaseMatcher
5
- def match(expected, actual)
6
- actual.instance_of? expected
7
- end
8
8
 
9
+ # @api private
10
+ # @return [String]
9
11
  def description
10
12
  "be an instance of #{expected}"
11
13
  end
14
+
15
+ private
16
+
17
+ def match(expected, actual)
18
+ actual.instance_of? expected
19
+ end
12
20
  end
13
21
  end
14
22
  end
@@ -1,7 +1,12 @@
1
1
  module RSpec
2
2
  module Matchers
3
3
  module BuiltIn
4
+ # @api private
5
+ # Provides the implementation for `be_a_kind_of`.
6
+ # Not intended to be instantiated directly.
4
7
  class BeAKindOf < BaseMatcher
8
+
9
+ private
5
10
  def match(expected, actual)
6
11
  actual.kind_of? expected
7
12
  end
@@ -1,6 +1,9 @@
1
1
  module RSpec
2
2
  module Matchers
3
3
  module BuiltIn
4
+ # @api private
5
+ # Provides the implementation for `be_within`.
6
+ # Not intended to be instantiated directly.
4
7
  class BeWithin
5
8
  include Composable
6
9
 
@@ -8,12 +11,8 @@ module RSpec
8
11
  @delta = delta
9
12
  end
10
13
 
11
- def matches?(actual)
12
- @actual = actual
13
- raise needs_expected unless defined? @expected
14
- numeric? && (@actual - @expected).abs <= @tolerance
15
- end
16
-
14
+ # @api public
15
+ # Sets the expected value.
17
16
  def of(expected)
18
17
  @expected = expected
19
18
  @tolerance = @delta
@@ -21,6 +20,9 @@ module RSpec
21
20
  self
22
21
  end
23
22
 
23
+ # @api public
24
+ # Sets the expected value, and makes the matcher do
25
+ # a percent comparison.
24
26
  def percent_of(expected)
25
27
  @expected = expected
26
28
  @tolerance = @delta * @expected.abs / 100.0
@@ -28,18 +30,36 @@ module RSpec
28
30
  self
29
31
  end
30
32
 
33
+ # @private
34
+ def matches?(actual)
35
+ @actual = actual
36
+ raise needs_expected unless defined? @expected
37
+ numeric? && (@actual - @expected).abs <= @tolerance
38
+ end
39
+
40
+ # @api private
41
+ # @return [String]
31
42
  def failure_message
32
43
  "expected #{@actual.inspect} to #{description}#{not_numeric_clause}"
33
44
  end
34
45
 
46
+ # @api private
47
+ # @return [String]
35
48
  def failure_message_when_negated
36
49
  "expected #{@actual.inspect} not to #{description}"
37
50
  end
38
51
 
52
+ # @api private
53
+ # @return [String]
39
54
  def description
40
55
  "be within #{@delta}#{@unit} of #{@expected}"
41
56
  end
42
57
 
58
+ # @private
59
+ def supports_block_expectations?
60
+ false
61
+ end
62
+
43
63
  private
44
64
 
45
65
  def numeric?
@@ -1,10 +1,13 @@
1
1
  module RSpec
2
2
  module Matchers
3
3
  module BuiltIn
4
- # Describes an expected mutation.
4
+ # @api private
5
+ # Provides the implementation for `change`.
6
+ # Not intended to be instantiated directly.
5
7
  class Change
6
8
  include Composable
7
9
 
10
+ # @api public
8
11
  # Specifies the delta of the expected change.
9
12
  def by(expected_delta)
10
13
  ChangeRelatively.new(@change_details, expected_delta, :by) do |actual_delta|
@@ -12,6 +15,7 @@ module RSpec
12
15
  end
13
16
  end
14
17
 
18
+ # @api public
15
19
  # Specifies a minimum delta of the expected change.
16
20
  def by_at_least(minimum)
17
21
  ChangeRelatively.new(@change_details, minimum, :by_at_least) do |actual_delta|
@@ -19,6 +23,7 @@ module RSpec
19
23
  end
20
24
  end
21
25
 
26
+ # @api public
22
27
  # Specifies a maximum delta of the expected change.
23
28
  def by_at_most(maximum)
24
29
  ChangeRelatively.new(@change_details, maximum, :by_at_most) do |actual_delta|
@@ -26,38 +31,55 @@ module RSpec
26
31
  end
27
32
  end
28
33
 
34
+ # @api public
29
35
  # Specifies the new value you expect.
30
36
  def to(value)
31
37
  ChangeToValue.new(@change_details, value)
32
38
  end
33
39
 
40
+ # @api public
34
41
  # Specifies the original value.
35
42
  def from(value)
36
43
  ChangeFromValue.new(@change_details, value)
37
44
  end
38
45
 
39
- # @api private
46
+ # @private
40
47
  def matches?(event_proc)
48
+ @event_proc = event_proc
49
+ return false unless Proc === event_proc
41
50
  raise_block_syntax_error if block_given?
42
51
  @change_details.perform_change(event_proc)
43
52
  @change_details.changed?
44
53
  end
45
54
 
55
+ def does_not_match?(event_proc)
56
+ raise_block_syntax_error if block_given?
57
+ !matches?(event_proc) && Proc === event_proc
58
+ end
59
+
46
60
  # @api private
61
+ # @return [String]
47
62
  def failure_message
48
- "expected #{@change_details.message} to have changed, but is still #{description_of @change_details.actual_before}"
63
+ "expected #{@change_details.message} to have changed, but #{positive_failure_reason}"
49
64
  end
50
65
 
51
66
  # @api private
67
+ # @return [String]
52
68
  def failure_message_when_negated
53
- "expected #{@change_details.message} not to have changed, but did change from #{description_of @change_details.actual_before} to #{description_of @change_details.actual_after}"
69
+ "expected #{@change_details.message} not to have changed, but #{negative_failure_reason}"
54
70
  end
55
71
 
56
72
  # @api private
73
+ # @return [String]
57
74
  def description
58
75
  "change #{@change_details.message}"
59
76
  end
60
77
 
78
+ # @private
79
+ def supports_block_expectations?
80
+ true
81
+ end
82
+
61
83
  private
62
84
 
63
85
  def initialize(receiver=nil, message=nil, &block)
@@ -68,6 +90,16 @@ module RSpec
68
90
  raise SyntaxError,
69
91
  "The block passed to the `change` matcher must use `{ ... }` instead of do/end"
70
92
  end
93
+
94
+ def positive_failure_reason
95
+ return "was not given a block" unless Proc === @event_proc
96
+ "is still #{description_of @change_details.actual_before}"
97
+ end
98
+
99
+ def negative_failure_reason
100
+ return "was not given a block" unless Proc === @event_proc
101
+ "did change from #{description_of @change_details.actual_before} to #{description_of @change_details.actual_after}"
102
+ end
71
103
  end
72
104
 
73
105
  # Used to specify a relative change.
@@ -82,30 +114,47 @@ module RSpec
82
114
  @comparer = comparer
83
115
  end
84
116
 
117
+ # @private
85
118
  def failure_message
86
- "expected #{@change_details.message} to have changed #{@relativity.to_s.gsub("_", " ")} #{description_of @expected_delta}, " +
87
- "but was changed by #{description_of @change_details.actual_delta}"
119
+ "expected #{@change_details.message} to have changed #{@relativity.to_s.gsub("_", " ")} #{description_of @expected_delta}, but #{failure_reason}"
88
120
  end
89
121
 
122
+ # @private
90
123
  def matches?(event_proc)
124
+ @event_proc = event_proc
125
+ return false unless Proc === event_proc
91
126
  @change_details.perform_change(event_proc)
92
127
  @comparer.call(@change_details.actual_delta)
93
128
  end
94
129
 
130
+ # @private
95
131
  def does_not_match?(event_proc)
96
132
  raise NotImplementedError, "`expect { }.not_to change { }.#{@relativity}()` is not supported"
97
133
  end
98
134
 
99
- # @api private
135
+ # @private
100
136
  def description
101
137
  "change #{@change_details.message} #{@relativity.to_s.gsub("_", " ")} #{description_of @expected_delta}"
102
138
  end
139
+
140
+ # @private
141
+ def supports_block_expectations?
142
+ true
143
+ end
144
+
145
+ private
146
+
147
+ def failure_reason
148
+ return "was not given a block" unless Proc === @event_proc
149
+ "was changed by #{description_of @change_details.actual_delta}"
150
+ end
103
151
  end
104
152
 
105
- # Base class for specifying a change from and/or to specific values.
106
153
  # @api private
154
+ # Base class for specifying a change from and/or to specific values.
107
155
  class SpecificValuesChange
108
156
  include Composable
157
+ # @private
109
158
  MATCH_ANYTHING = ::Object.ancestors.last
110
159
 
111
160
  def initialize(change_details, from, to)
@@ -114,21 +163,32 @@ module RSpec
114
163
  @expected_after = to
115
164
  end
116
165
 
166
+ # @private
117
167
  def matches?(event_proc)
168
+ @event_proc = event_proc
169
+ return false unless Proc === event_proc
118
170
  @change_details.perform_change(event_proc)
119
171
  @change_details.changed? && matches_before? && matches_after?
120
172
  end
121
173
 
174
+ # @private
122
175
  def description
123
176
  "change #{@change_details.message} #{change_description}"
124
177
  end
125
178
 
179
+ # @private
126
180
  def failure_message
127
- return before_value_failure unless matches_before?
128
- return did_not_change_failure unless @change_details.changed?
181
+ return not_given_a_block_failure unless Proc === @event_proc
182
+ return before_value_failure unless matches_before?
183
+ return did_not_change_failure unless @change_details.changed?
129
184
  after_value_failure
130
185
  end
131
186
 
187
+ # @private
188
+ def supports_block_expectations?
189
+ true
190
+ end
191
+
132
192
  private
133
193
 
134
194
  def matches_before?
@@ -154,33 +214,44 @@ module RSpec
154
214
  def did_change_failure
155
215
  "expected #{@change_details.message} not to have changed, but did change from #{description_of @change_details.actual_before} to #{description_of @change_details.actual_after}"
156
216
  end
217
+
218
+ def not_given_a_block_failure
219
+ "expected #{@change_details.message} to have changed #{change_description}, but was not given a block"
220
+ end
157
221
  end
158
222
 
223
+ # @api private
159
224
  # Used to specify a change from a specific value
160
225
  # (and, optionally, to a specific value).
161
- # @api private
162
226
  class ChangeFromValue < SpecificValuesChange
163
227
  def initialize(change_details, expected_before)
164
228
  @description_suffix = nil
165
229
  super(change_details, expected_before, MATCH_ANYTHING)
166
230
  end
167
231
 
232
+ # @api public
233
+ # Specifies the new value you expect.
168
234
  def to(value)
169
235
  @expected_after = value
170
236
  @description_suffix = " to #{description_of value}"
171
237
  self
172
238
  end
173
239
 
240
+ # @private
174
241
  def does_not_match?(event_proc)
175
242
  if @description_suffix
176
243
  raise NotImplementedError, "`expect { }.not_to change { }.to()` is not supported"
177
244
  end
178
245
 
246
+ @event_proc = event_proc
247
+ return false unless Proc === event_proc
179
248
  @change_details.perform_change(event_proc)
180
249
  !@change_details.changed? && matches_before?
181
250
  end
182
251
 
252
+ # @private
183
253
  def failure_message_when_negated
254
+ return not_given_a_block_failure unless Proc === @event_proc
184
255
  return before_value_failure unless matches_before?
185
256
  did_change_failure
186
257
  end
@@ -192,21 +263,24 @@ module RSpec
192
263
  end
193
264
  end
194
265
 
266
+ # @api private
195
267
  # Used to specify a change to a specific value
196
268
  # (and, optionally, from a specific value).
197
- # @api private
198
269
  class ChangeToValue < SpecificValuesChange
199
270
  def initialize(change_details, expected_after)
200
271
  @description_suffix = nil
201
272
  super(change_details, MATCH_ANYTHING, expected_after)
202
273
  end
203
274
 
275
+ # @api public
276
+ # Specifies the original value.
204
277
  def from(value)
205
278
  @expected_before = value
206
279
  @description_suffix = " from #{description_of value}"
207
280
  self
208
281
  end
209
282
 
283
+ # @private
210
284
  def does_not_match?(event_proc)
211
285
  raise NotImplementedError, "`expect { }.not_to change { }.to()` is not supported"
212
286
  end
@@ -218,8 +292,8 @@ module RSpec
218
292
  end
219
293
  end
220
294
 
295
+ # @private
221
296
  # Encapsulates the details of the before/after values.
222
- # @api private
223
297
  class ChangeDetails
224
298
  attr_reader :message, :actual_before, :actual_after
225
299
 
@@ -246,6 +320,8 @@ module RSpec
246
320
 
247
321
  def evaluate_value_proc
248
322
  case val = @value_proc.call
323
+ when IO # enumerable, but we don't want to dup it.
324
+ val
249
325
  when Enumerable, String
250
326
  val.dup
251
327
  else
@@ -1,9 +1,10 @@
1
1
  module RSpec
2
2
  module Matchers
3
3
  module BuiltIn
4
- # Base class for `and` and `or` compound matchers.
5
4
  # @api private
5
+ # Base class for `and` and `or` compound matchers.
6
6
  class Compound < BaseMatcher
7
+ # @private
7
8
  attr_reader :matcher_1, :matcher_2
8
9
 
9
10
  def initialize(matcher_1, matcher_2)
@@ -11,17 +12,26 @@ module RSpec
11
12
  @matcher_2 = matcher_2
12
13
  end
13
14
 
15
+ # @private
14
16
  def does_not_match?(actual)
15
17
  raise NotImplementedError,
16
18
  "`expect(...).not_to matcher.#{conjunction} matcher` is not supported"
17
19
  end
18
20
 
21
+ # @api private
22
+ # @return [String]
19
23
  def description
20
24
  singleline_message(matcher_1.description, matcher_2.description)
21
25
  end
22
26
 
23
27
  private
24
28
 
29
+ def initialize_copy(other)
30
+ @matcher_1 = @matcher_1.clone
31
+ @matcher_2 = @matcher_2.clone
32
+ super
33
+ end
34
+
25
35
  def indent_multiline_message(message)
26
36
  message.lines.map do |line|
27
37
  line =~ /\S/ ? ' ' + line : line
@@ -55,9 +65,12 @@ module RSpec
55
65
  [message_1, conjunction, message_2].join(' ')
56
66
  end
57
67
 
58
- # Matcher used to represent a compound `and` expectation.
59
68
  # @api public
69
+ # Matcher used to represent a compound `and` expectation.
60
70
  class And < self
71
+
72
+ # @api private
73
+ # @return [String]
61
74
  def failure_message
62
75
  if @matcher_1_matches
63
76
  matcher_2.failure_message
@@ -82,9 +95,12 @@ module RSpec
82
95
  end
83
96
  end
84
97
 
85
- # Matcher used to represent a compound `or` expectation.
86
98
  # @api public
99
+ # Matcher used to represent a compound `or` expectation.
87
100
  class Or < self
101
+
102
+ # @api private
103
+ # @return [String]
88
104
  def failure_message
89
105
  compound_failure_message
90
106
  end