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,141 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module RSpec
4
- module Matchers
5
- describe "expect(actual).to be_within(delta).of(expected)" do
6
- it_behaves_like "an RSpec matcher", :valid_value => 5, :invalid_value => -5 do
7
- let(:matcher) { be_within(2).of(4.0) }
8
- end
9
-
10
- it "passes when actual == expected" do
11
- expect(5.0).to be_within(0.5).of(5.0)
12
- end
13
-
14
- it "passes when actual < (expected + delta)" do
15
- expect(5.49).to be_within(0.5).of(5.0)
16
- end
17
-
18
- it "passes when actual > (expected - delta)" do
19
- expect(4.51).to be_within(0.5).of(5.0)
20
- end
21
-
22
- it "passes when actual == (expected - delta)" do
23
- expect(4.5).to be_within(0.5).of(5.0)
24
- end
25
-
26
- it "passes when actual == (expected + delta)" do
27
- expect(5.5).to be_within(0.5).of(5.0)
28
- end
29
-
30
- it "passes with integer arguments that are near each other" do
31
- expect(1.0001).to be_within(5).percent_of(1)
32
- end
33
-
34
- it "passes with negative arguments" do
35
- expect(-1.0001).to be_within(5).percent_of(-1)
36
- end
37
-
38
- it "fails when actual < (expected - delta)" do
39
- expect {
40
- expect(4.49).to be_within(0.5).of(5.0)
41
- }.to fail_with("expected 4.49 to be within 0.5 of 5.0")
42
- end
43
-
44
- it "fails when actual > (expected + delta)" do
45
- expect {
46
- expect(5.51).to be_within(0.5).of(5.0)
47
- }.to fail_with("expected 5.51 to be within 0.5 of 5.0")
48
- end
49
-
50
- it "works with Time" do
51
- expect(Time.now).to be_within(0.1).of(Time.now)
52
- end
53
-
54
- it "provides a description" do
55
- matcher = be_within(0.5).of(5.0)
56
- matcher.matches?(5.1)
57
- expect(matcher.description).to eq "be within 0.5 of 5.0"
58
- end
59
-
60
- it "raises an error if no expected value is given" do
61
- expect {
62
- expect(5.1).to be_within(0.5)
63
- }.to raise_error(ArgumentError, /must set an expected value using #of/)
64
- end
65
-
66
- it "fails if the actual is not numeric" do
67
- expect {
68
- expect(nil).to be_within(0.1).of(0)
69
- }.to fail_with("expected nil to be within 0.1 of 0, but it could not be treated as a numeric value")
70
- end
71
- end
72
-
73
- describe "expect(actual).to be_within(delta).percent_of(expected)" do
74
- it "passes when actual is within the given percent variance" do
75
- expect(9.0).to be_within(10).percent_of(10.0)
76
- expect(10.0).to be_within(10).percent_of(10.0)
77
- expect(11.0).to be_within(10).percent_of(10.0)
78
- end
79
-
80
- it "fails when actual is outside the given percent variance" do
81
- expect {
82
- expect(8.9).to be_within(10).percent_of(10.0)
83
- }.to fail_with("expected 8.9 to be within 10% of 10.0")
84
-
85
- expect {
86
- expect(11.1).to be_within(10).percent_of(10.0)
87
- }.to fail_with("expected 11.1 to be within 10% of 10.0")
88
- end
89
-
90
- it "provides a description" do
91
- matcher = be_within(0.5).percent_of(5.0)
92
- matcher.matches?(5.1)
93
- expect(matcher.description).to eq "be within 0.5% of 5.0"
94
- end
95
- end
96
-
97
- describe "expect(actual).not_to be_within(delta).of(expected)" do
98
- it "passes when actual < (expected - delta)" do
99
- expect(4.49).not_to be_within(0.5).of(5.0)
100
- end
101
-
102
- it "passes when actual > (expected + delta)" do
103
- expect(5.51).not_to be_within(0.5).of(5.0)
104
- end
105
-
106
- it "fails when actual == expected" do
107
- expect {
108
- expect(5.0).not_to be_within(0.5).of(5.0)
109
- }.to fail_with("expected 5.0 not to be within 0.5 of 5.0")
110
- end
111
-
112
- it "fails when actual < (expected + delta)" do
113
- expect {
114
- expect(5.49).not_to be_within(0.5).of(5.0)
115
- }.to fail_with("expected 5.49 not to be within 0.5 of 5.0")
116
- end
117
-
118
- it "fails when actual > (expected - delta)" do
119
- expect {
120
- expect(4.51).not_to be_within(0.5).of(5.0)
121
- }.to fail_with("expected 4.51 not to be within 0.5 of 5.0")
122
- end
123
-
124
- it "fails when actual == (expected - delta)" do
125
- expect {
126
- expect(4.5).not_to be_within(0.5).of(5.0)
127
- }.to fail_with("expected 4.5 not to be within 0.5 of 5.0")
128
- end
129
-
130
- it "fails when actual == (expected + delta)" do
131
- expect {
132
- expect(5.5).not_to be_within(0.5).of(5.0)
133
- }.to fail_with("expected 5.5 not to be within 0.5 of 5.0")
134
- end
135
-
136
- it "passes if the actual is not numeric" do
137
- expect(nil).not_to be_within(0.1).of(0)
138
- end
139
- end
140
- end
141
- end
@@ -1,808 +0,0 @@
1
- #Based on patch from Wilson Bilkovich
2
-
3
- require 'spec_helper'
4
-
5
- class SomethingExpected
6
- attr_accessor :some_value
7
- end
8
-
9
- describe "expect { ... }.to change(actual, message)" do
10
- context "with a numeric value" do
11
- before(:each) do
12
- @instance = SomethingExpected.new
13
- @instance.some_value = 5
14
- end
15
-
16
- it "passes when actual is modified by the block" do
17
- expect {@instance.some_value = 6.0}.to change(@instance, :some_value)
18
- end
19
-
20
- it "fails when actual is not modified by the block" do
21
- expect do
22
- expect {}.to change(@instance, :some_value)
23
- end.to fail_with("expected #some_value to have changed, but is still 5")
24
- end
25
-
26
- it "provides a #description" do
27
- expect(change(@instance, :some_value).description).to eq "change #some_value"
28
- end
29
- end
30
-
31
- it "can specify the change of a variable's class" do
32
- val = nil
33
-
34
- expect {
35
- val = 42
36
- }.to change { val.class }.from(NilClass).to(Fixnum)
37
-
38
- expect {
39
- expect {
40
- val = "string"
41
- }.to change { val.class }.from(Fixnum).to(NilClass)
42
- }.to fail_with(/but is now String/)
43
- end
44
-
45
- context "with boolean values" do
46
- before(:each) do
47
- @instance = SomethingExpected.new
48
- @instance.some_value = true
49
- end
50
-
51
- it "passes when actual is modified by the block" do
52
- expect {@instance.some_value = false}.to change(@instance, :some_value)
53
- end
54
-
55
- it "fails when actual is not modified by the block" do
56
- expect do
57
- expect {}.to change(@instance, :some_value)
58
- end.to fail_with("expected #some_value to have changed, but is still true")
59
- end
60
- end
61
-
62
- context "with nil value" do
63
- before(:each) do
64
- @instance = SomethingExpected.new
65
- @instance.some_value = nil
66
- end
67
-
68
- it "passes when actual is modified by the block" do
69
- expect {@instance.some_value = false}.to change(@instance, :some_value)
70
- end
71
-
72
- it "fails when actual is not modified by the block" do
73
- expect do
74
- expect {}.to change(@instance, :some_value)
75
- end.to fail_with("expected #some_value to have changed, but is still nil")
76
- end
77
- end
78
-
79
- context "with an array" do
80
- before(:each) do
81
- @instance = SomethingExpected.new
82
- @instance.some_value = []
83
- end
84
-
85
- it "passes when actual is modified by the block" do
86
- expect {@instance.some_value << 1}.to change(@instance, :some_value)
87
- end
88
-
89
- it "fails when a predicate on the actual fails" do
90
- expect do
91
- expect {@instance.some_value << 1}.to change { @instance.some_value }.to be_empty
92
- end.to fail_with(/result to have changed to/)
93
- end
94
-
95
- it "passes when a predicate on the actual passes" do
96
- @instance.some_value = [1]
97
- expect {@instance.some_value.pop}.to change { @instance.some_value }.to be_empty
98
- end
99
-
100
- it "fails when actual is not modified by the block" do
101
- expect do
102
- expect {}.to change(@instance, :some_value)
103
- end.to fail_with("expected #some_value to have changed, but is still []")
104
- end
105
- end
106
-
107
- context "with a hash" do
108
- before(:each) do
109
- @instance = SomethingExpected.new
110
- @instance.some_value = {:a => 'a'}
111
- end
112
-
113
- it "passes when actual is modified by the block" do
114
- expect {@instance.some_value[:a] = 'A'}.to change(@instance, :some_value)
115
- end
116
-
117
- it "fails when actual is not modified by the block" do
118
- expect do
119
- expect {}.to change(@instance, :some_value)
120
- end.to fail
121
- end
122
- end
123
-
124
- context "with a string" do
125
- it "passes when actual is modified by the block" do
126
- string = "ab"
127
- expect { string << "c" }.to change { string }
128
- end
129
-
130
- it 'fails when actual is not modified by the block' do
131
- string = "ab"
132
- expect {
133
- expect { }.to change { string }
134
- }.to fail_with(/to have changed/)
135
- end
136
- end
137
-
138
- context "with an arbitrary enumerable" do
139
- before(:each) do
140
- @instance = SomethingExpected.new
141
- @instance.some_value = Class.new do
142
- include Enumerable
143
-
144
- attr_reader :elements
145
-
146
- def initialize(*elements)
147
- @elements = elements.dup
148
- end
149
-
150
- def <<(element)
151
- elements << element
152
- end
153
-
154
- def dup
155
- self.class.new(*elements)
156
- end
157
-
158
- def ==(other)
159
- elements == other.elements
160
- end
161
- end.new
162
- end
163
-
164
- it "passes when actual is modified by the block" do
165
- expect {@instance.some_value << 1}.to change(@instance, :some_value)
166
- end
167
-
168
- it "fails when actual is not modified by the block" do
169
- expect do
170
- expect {}.to change(@instance, :some_value)
171
- end.to fail_with(/^expected #some_value to have changed, but is still/)
172
- end
173
-
174
- end
175
- end
176
-
177
- describe "expect { ... }.not_to change(actual, message)" do
178
- before(:each) do
179
- @instance = SomethingExpected.new
180
- @instance.some_value = 5
181
- end
182
-
183
- it "passes when actual is not modified by the block" do
184
- expect { }.not_to change(@instance, :some_value)
185
- end
186
-
187
- it "fails when actual is not modified by the block" do
188
- expect do
189
- expect {@instance.some_value = 6}.not_to change(@instance, :some_value)
190
- end.to fail_with("expected #some_value not to have changed, but did change from 5 to 6")
191
- end
192
- end
193
-
194
- describe "expect { ... }.to change { block }" do
195
-
196
- before(:each) do
197
- @instance = SomethingExpected.new
198
- @instance.some_value = 5
199
- end
200
-
201
- it "passes when actual is modified by the block" do
202
- expect {@instance.some_value = 6}.to change { @instance.some_value }
203
- end
204
-
205
- it "fails when actual is not modified by the block" do
206
- expect do
207
- expect {}.to change{ @instance.some_value }
208
- end.to fail_with("expected result to have changed, but is still 5")
209
- end
210
-
211
- it "warns if passed a block using do/end instead of {}" do
212
- expect do
213
- expect {}.to change do; end
214
- end.to raise_error(SyntaxError, /block passed to the `change` matcher/)
215
- end
216
-
217
- it "provides a #description" do
218
- expect(change { @instance.some_value }.description).to eq "change result"
219
- end
220
- end
221
-
222
- describe "expect { ... }.not_to change { block }" do
223
- before(:each) do
224
- @instance = SomethingExpected.new
225
- @instance.some_value = 5
226
- end
227
-
228
- it "passes when actual is modified by the block" do
229
- expect {}.not_to change{ @instance.some_value }
230
- end
231
-
232
- it "fails when actual is not modified by the block" do
233
- expect do
234
- expect {@instance.some_value = 6}.not_to change { @instance.some_value }
235
- end.to fail_with("expected result not to have changed, but did change from 5 to 6")
236
- end
237
-
238
- it "warns if passed a block using do/end instead of {}" do
239
- expect do
240
- expect {}.not_to change do; end
241
- end.to raise_error(SyntaxError, /block passed to the `change` matcher/)
242
- end
243
- end
244
-
245
-
246
- describe "expect { ... }.not_to change { }.from" do
247
- context 'when the value starts at the from value' do
248
- it 'passes when the value does not change' do
249
- k = 5
250
- expect { }.not_to change { k }.from(5)
251
- end
252
-
253
- it 'fails when the value does change' do
254
- expect {
255
- k = 5
256
- expect { k += 1 }.not_to change { k }.from(5)
257
- }.to fail_with(/but did change from 5 to 6/)
258
- end
259
- end
260
-
261
- context 'when the value starts at a different value' do
262
- it 'fails when the value does not change' do
263
- expect {
264
- k = 6
265
- expect { }.not_to change { k }.from(5)
266
- }.to fail_with(/expected result to have initially been 5/)
267
- end
268
-
269
- it 'fails when the value does change' do
270
- expect {
271
- k = 6
272
- expect { k += 1 }.not_to change { k }.from(5)
273
- }.to fail_with(/expected result to have initially been 5/)
274
- end
275
- end
276
- end
277
-
278
- describe "expect { ... }.not_to change { }.to" do
279
- it 'is not supported' do
280
- expect {
281
- expect { }.not_to change { }.to(3)
282
- }.to raise_error(NotImplementedError)
283
- end
284
-
285
- it 'is not supported when it comes after `from`' do
286
- expect {
287
- expect { }.not_to change { }.from(nil).to(3)
288
- }.to raise_error(NotImplementedError)
289
- end
290
- end
291
-
292
- describe "expect { ... }.not_to change { }.by" do
293
- it 'is not supported' do
294
- expect {
295
- expect { }.not_to change { }.by(3)
296
- }.to raise_error(NotImplementedError)
297
- end
298
- end
299
-
300
- describe "expect { ... }.not_to change { }.by_at_least" do
301
- it 'is not supported' do
302
- expect {
303
- expect { }.not_to change { }.by_at_least(3)
304
- }.to raise_error(NotImplementedError)
305
- end
306
- end
307
-
308
- describe "expect { ... }.not_to change { }.by_at_most" do
309
- it 'is not supported' do
310
- expect {
311
- expect { }.not_to change { }.by_at_most(3)
312
- }.to raise_error(NotImplementedError)
313
- end
314
- end
315
-
316
- describe "expect { ... }.to change(actual, message).by(expected)" do
317
- before(:each) do
318
- @instance = SomethingExpected.new
319
- @instance.some_value = 5
320
- end
321
-
322
- it "passes when attribute is changed by expected amount" do
323
- expect { @instance.some_value += 1 }.to change(@instance, :some_value).by(1)
324
- end
325
-
326
- it "passes when attribute is not changed and expected amount is 0" do
327
- expect { @instance.some_value += 0 }.to change(@instance, :some_value).by(0)
328
- end
329
-
330
- it "fails when the attribute is changed by unexpected amount" do
331
- expect do
332
- expect { @instance.some_value += 2 }.to change(@instance, :some_value).by(1)
333
- end.to fail_with("expected #some_value to have changed by 1, but was changed by 2")
334
- end
335
-
336
- it "fails when the attribute is changed by unexpected amount in the opposite direction" do
337
- expect do
338
- expect { @instance.some_value -= 1 }.to change(@instance, :some_value).by(1)
339
- end.to fail_with("expected #some_value to have changed by 1, but was changed by -1")
340
- end
341
-
342
- it "provides a #description" do
343
- expect(change(@instance, :some_value).by(3).description).to eq "change #some_value by 3"
344
- end
345
- end
346
-
347
- describe "expect { ... }.to change { block }.by(expected)" do
348
- before(:each) do
349
- @instance = SomethingExpected.new
350
- @instance.some_value = 5
351
- end
352
-
353
- it "passes when attribute is changed by expected amount" do
354
- expect { @instance.some_value += 1 }.to change{@instance.some_value}.by(1)
355
- end
356
-
357
- it "fails when the attribute is changed by unexpected amount" do
358
- expect do
359
- expect { @instance.some_value += 2 }.to change{@instance.some_value}.by(1)
360
- end.to fail_with("expected result to have changed by 1, but was changed by 2")
361
- end
362
-
363
- it "fails when the attribute is changed by unexpected amount in the opposite direction" do
364
- expect do
365
- expect { @instance.some_value -= 1 }.to change{@instance.some_value}.by(1)
366
- end.to fail_with("expected result to have changed by 1, but was changed by -1")
367
- end
368
-
369
- it "provides a #description" do
370
- expect(change { @instance.some_value }.by(3).description).to eq "change result by 3"
371
- end
372
- end
373
-
374
- describe "expect { ... }.to change(actual, message).by_at_least(expected)" do
375
- before(:each) do
376
- @instance = SomethingExpected.new
377
- @instance.some_value = 5
378
- end
379
-
380
- it "passes when attribute is changed by greater than the expected amount" do
381
- expect { @instance.some_value += 2 }.to change(@instance, :some_value).by_at_least(1)
382
- end
383
-
384
- it "passes when attribute is changed by the expected amount" do
385
- expect { @instance.some_value += 2 }.to change(@instance, :some_value).by_at_least(2)
386
- end
387
-
388
- it "fails when the attribute is changed by less than the expected amount" do
389
- expect do
390
- expect { @instance.some_value += 1 }.to change(@instance, :some_value).by_at_least(2)
391
- end.to fail_with("expected #some_value to have changed by at least 2, but was changed by 1")
392
- end
393
-
394
- it "provides a #description" do
395
- expect(change(@instance, :some_value).by_at_least(3).description).to eq "change #some_value by at least 3"
396
- end
397
- end
398
-
399
- describe "expect { ... }.to change { block }.by_at_least(expected)" do
400
- before(:each) do
401
- @instance = SomethingExpected.new
402
- @instance.some_value = 5
403
- end
404
-
405
- it "passes when attribute is changed by greater than expected amount" do
406
- expect { @instance.some_value += 2 }.to change{@instance.some_value}.by_at_least(1)
407
- end
408
-
409
- it "passes when attribute is changed by the expected amount" do
410
- expect { @instance.some_value += 2 }.to change{@instance.some_value}.by_at_least(2)
411
- end
412
-
413
- it "fails when the attribute is changed by less than the unexpected amount" do
414
- expect do
415
- expect { @instance.some_value += 1 }.to change{@instance.some_value}.by_at_least(2)
416
- end.to fail_with("expected result to have changed by at least 2, but was changed by 1")
417
- end
418
-
419
- it "provides a #description" do
420
- expect(change { @instance.some_value }.by_at_least(3).description).to eq "change result by at least 3"
421
- end
422
- end
423
-
424
-
425
- describe "expect { ... }.to change(actual, message).by_at_most(expected)" do
426
- before(:each) do
427
- @instance = SomethingExpected.new
428
- @instance.some_value = 5
429
- end
430
-
431
- it "passes when attribute is changed by less than the expected amount" do
432
- expect { @instance.some_value += 2 }.to change(@instance, :some_value).by_at_most(3)
433
- end
434
-
435
- it "passes when attribute is changed by the expected amount" do
436
- expect { @instance.some_value += 2 }.to change(@instance, :some_value).by_at_most(2)
437
- end
438
-
439
- it "fails when the attribute is changed by greater than the expected amount" do
440
- expect do
441
- expect { @instance.some_value += 2 }.to change(@instance, :some_value).by_at_most(1)
442
- end.to fail_with("expected #some_value to have changed by at most 1, but was changed by 2")
443
- end
444
-
445
- it "provides a #description" do
446
- expect(change(@instance, :some_value).by_at_most(3).description).to eq "change #some_value by at most 3"
447
- end
448
- end
449
-
450
- describe "expect { ... }.to change { block }.by_at_most(expected)" do
451
- before(:each) do
452
- @instance = SomethingExpected.new
453
- @instance.some_value = 5
454
- end
455
-
456
- it "passes when attribute is changed by less than expected amount" do
457
- expect { @instance.some_value += 2 }.to change{@instance.some_value}.by_at_most(3)
458
- end
459
-
460
- it "passes when attribute is changed by the expected amount" do
461
- expect { @instance.some_value += 2 }.to change{@instance.some_value}.by_at_most(2)
462
- end
463
-
464
- it "fails when the attribute is changed by greater than the unexpected amount" do
465
- expect do
466
- expect { @instance.some_value += 2 }.to change{@instance.some_value}.by_at_most(1)
467
- end.to fail_with("expected result to have changed by at most 1, but was changed by 2")
468
- end
469
-
470
- it "provides a #description" do
471
- expect(change { @instance.some_value }.by_at_most(3).description).to eq "change result by at most 3"
472
- end
473
- end
474
-
475
- describe "expect { ... }.to change(actual, message).from(old)" do
476
- context "with boolean values" do
477
- before(:each) do
478
- @instance = SomethingExpected.new
479
- @instance.some_value = true
480
- end
481
-
482
- it "passes when attribute is == to expected value before executing block" do
483
- expect { @instance.some_value = false }.to change(@instance, :some_value).from(true)
484
- end
485
-
486
- it "fails when attribute is not == to expected value before executing block" do
487
- expect do
488
- expect { @instance.some_value = 'foo' }.to change(@instance, :some_value).from(false)
489
- end.to fail_with("expected #some_value to have initially been false, but was true")
490
- end
491
- end
492
- context "with non-boolean values" do
493
- before(:each) do
494
- @instance = SomethingExpected.new
495
- @instance.some_value = 'string'
496
- end
497
-
498
- it "passes when attribute matches expected value before executing block" do
499
- expect { @instance.some_value = "astring" }.to change(@instance, :some_value).from("string")
500
- end
501
-
502
- it "fails when attribute does not match expected value before executing block" do
503
- expect do
504
- expect { @instance.some_value = "knot" }.to change(@instance, :some_value).from("cat")
505
- end.to fail_with("expected #some_value to have initially been \"cat\", but was \"string\"")
506
- end
507
-
508
- it "provides a #description" do
509
- expect(change(@instance, :some_value).from(3).description).to eq "change #some_value from 3"
510
- end
511
- end
512
- end
513
-
514
- describe "expect { ... }.to change { block }.from(old)" do
515
- before(:each) do
516
- @instance = SomethingExpected.new
517
- @instance.some_value = 'string'
518
- end
519
-
520
- it "passes when attribute matches expected value before executing block" do
521
- expect { @instance.some_value = "astring" }.to change{@instance.some_value}.from("string")
522
- end
523
-
524
- it "fails when attribute does not match expected value before executing block" do
525
- expect do
526
- expect { @instance.some_value = "knot" }.to change{@instance.some_value}.from("cat")
527
- end.to fail_with("expected result to have initially been \"cat\", but was \"string\"")
528
- end
529
-
530
- it "fails when attribute does not change" do
531
- expect do
532
- expect { }.to change { @instance.some_value }.from("string")
533
- end.to fail_with('expected result to have changed from "string", but did not change')
534
- end
535
-
536
- it "provides a #description" do
537
- expect(change { }.from(3).description).to eq "change result from 3"
538
- end
539
- end
540
-
541
- describe "expect { ... }.to change(actual, message).to(new)" do
542
- context "with boolean values" do
543
- before(:each) do
544
- @instance = SomethingExpected.new
545
- @instance.some_value = true
546
- end
547
-
548
- it "passes when attribute is == to expected value after executing block" do
549
- expect { @instance.some_value = false }.to change(@instance, :some_value).to(false)
550
- end
551
-
552
- it "fails when attribute is not == to expected value after executing block" do
553
- expect do
554
- expect { @instance.some_value = 1 }.to change(@instance, :some_value).from(true).to(false)
555
- end.to fail_with("expected #some_value to have changed to false, but is now 1")
556
- end
557
- end
558
-
559
- context "with non-boolean values" do
560
- before(:each) do
561
- @instance = SomethingExpected.new
562
- @instance.some_value = 'string'
563
- end
564
-
565
- it "passes when attribute matches expected value after executing block" do
566
- expect { @instance.some_value = "cat" }.to change(@instance, :some_value).to("cat")
567
- end
568
-
569
- it "fails when attribute does not match expected value after executing block" do
570
- expect do
571
- expect { @instance.some_value = "cat" }.to change(@instance, :some_value).from("string").to("dog")
572
- end.to fail_with("expected #some_value to have changed to \"dog\", but is now \"cat\"")
573
- end
574
-
575
- it "fails with a clear message when it ends with the right value but did not change" do
576
- expect {
577
- expect { }.to change(@instance, :some_value).to("string")
578
- }.to fail_with('expected #some_value to have changed to "string", but did not change')
579
- end
580
- end
581
- end
582
-
583
- describe "expect { ... }.to change { block }.to(new)" do
584
- before(:each) do
585
- @instance = SomethingExpected.new
586
- @instance.some_value = 'string'
587
- end
588
-
589
- it "passes when attribute matches expected value after executing block" do
590
- expect { @instance.some_value = "cat" }.to change{@instance.some_value}.to("cat")
591
- end
592
-
593
- it "fails when attribute does not match expected value after executing block" do
594
- expect do
595
- expect { @instance.some_value = "cat" }.to change{@instance.some_value}.from("string").to("dog")
596
- end.to fail_with("expected result to have changed to \"dog\", but is now \"cat\"")
597
- end
598
-
599
- it "provides a #description" do
600
- expect(change { }.to(3).description).to eq "change result to 3"
601
- end
602
- end
603
-
604
- describe "expect { ... }.to change(actual, message).from(old).to(new)" do
605
- before(:each) do
606
- @instance = SomethingExpected.new
607
- @instance.some_value = 'string'
608
- end
609
-
610
- it "passes when #to comes before #from" do
611
- expect { @instance.some_value = "cat" }.to change(@instance, :some_value).to("cat").from("string")
612
- end
613
-
614
- it "passes when #from comes before #to" do
615
- expect { @instance.some_value = "cat" }.to change(@instance, :some_value).from("string").to("cat")
616
- end
617
-
618
- it "shows the correct messaging when #after and #to are different" do
619
- expect do
620
- expect { @instance.some_value = "cat" }.to change(@instance, :some_value).from("string").to("dog")
621
- end.to fail_with("expected #some_value to have changed to \"dog\", but is now \"cat\"")
622
- end
623
-
624
- it "shows the correct messaging when #before and #from are different" do
625
- expect do
626
- expect { @instance.some_value = "cat" }.to change(@instance, :some_value).from("not_string").to("cat")
627
- end.to fail_with("expected #some_value to have initially been \"not_string\", but was \"string\"")
628
- end
629
- end
630
-
631
- describe "expect { ... }.to change { block }.from(old).to(new)" do
632
- before(:each) do
633
- @instance = SomethingExpected.new
634
- @instance.some_value = 'string'
635
- end
636
-
637
- context "when #to comes before #from" do
638
- it "passes" do
639
- expect { @instance.some_value = "cat" }.to change{@instance.some_value}.to("cat").from("string")
640
- end
641
-
642
- it "provides a #description" do
643
- expect(change { }.to(1).from(3).description).to eq "change result to 1 from 3"
644
- end
645
- end
646
-
647
- context "when #from comes before #to" do
648
- it "passes" do
649
- expect { @instance.some_value = "cat" }.to change{@instance.some_value}.from("string").to("cat")
650
- end
651
-
652
- it "provides a #description" do
653
- expect(change { }.from(1).to(3).description).to eq "change result from 1 to 3"
654
- end
655
- end
656
- end
657
-
658
- describe "Composing a matcher with `change`" do
659
- describe "expect { ... }.to change { ... }" do
660
- context ".from(matcher).to(matcher)" do
661
- it 'passes when the matchers match the from and to values' do
662
- k = 0.51
663
- expect { k += 1 }.to change { k }.
664
- from( a_value_within(0.1).of(0.5) ).
665
- to( a_value_within(0.1).of(1.5) )
666
- end
667
-
668
- it 'fails with a clear message when the `from` does not match' do
669
- expect {
670
- k = 0.51
671
- expect { k += 1 }.to change { k }.
672
- from( a_value_within(0.1).of(0.7) ).
673
- to( a_value_within(0.1).of(1.5) )
674
- }.to fail_with(/expected result to have initially been a value within 0.1 of 0.7, but was 0.51/)
675
- end
676
-
677
- it 'fails with a clear message when the `to` does not match' do
678
- expect {
679
- k = 0.51
680
- expect { k += 1 }.to change { k }.
681
- from( a_value_within(0.1).of(0.5) ).
682
- to( a_value_within(0.1).of(2.5) )
683
- }.to fail_with(/expected result to have changed to a value within 0.1 of 2.5, but is now 1.51/)
684
- end
685
-
686
- it 'provides a description' do
687
- expect(change(nil, :foo).
688
- from( a_value_within(0.1).of(0.5) ).
689
- to( a_value_within(0.1).of(1.5) ).description
690
- ).to eq("change #foo from a value within 0.1 of 0.5 to a value within 0.1 of 1.5")
691
- end
692
- end
693
-
694
- context ".to(matcher).from(matcher)" do
695
- it 'passes when the matchers match the from and to values' do
696
- k = 0.51
697
- expect { k += 1 }.to change { k }.
698
- to( a_value_within(0.1).of(1.5) ).
699
- from( a_value_within(0.1).of(0.5) )
700
- end
701
-
702
- it 'fails with a clear message when the `from` does not match' do
703
- expect {
704
- k = 0.51
705
- expect { k += 1 }.to change { k }.
706
- to( a_value_within(0.1).of(1.5) ).
707
- from( a_value_within(0.1).of(0.7) )
708
- }.to fail_with(/expected result to have initially been a value within 0.1 of 0.7, but was 0.51/)
709
- end
710
-
711
- it 'fails with a clear message when the `to` does not match' do
712
- expect {
713
- k = 0.51
714
- expect { k += 1 }.to change { k }.
715
- to( a_value_within(0.1).of(2.5) ).
716
- from( a_value_within(0.1).of(0.5) )
717
- }.to fail_with(/expected result to have changed to a value within 0.1 of 2.5, but is now 1.51/)
718
- end
719
-
720
- it 'provides a description' do
721
- expect(change(nil, :foo).
722
- to( a_value_within(0.1).of(0.5) ).
723
- from( a_value_within(0.1).of(1.5) ).description
724
- ).to eq("change #foo to a value within 0.1 of 0.5 from a value within 0.1 of 1.5")
725
- end
726
- end
727
-
728
- context ".by(matcher)" do
729
- it "passes when the matcher matches" do
730
- k = 0.5
731
- expect { k += 1.05 }.to change { k }.by( a_value_within(0.1).of(1) )
732
- end
733
-
734
- it 'fails with a clear message when the `by` does not match' do
735
- expect {
736
- k = 0.5
737
- expect { k += 1.05 }.to change { k }.by( a_value_within(0.1).of(0.5) )
738
- }.to fail_with(/expected result to have changed by a value within 0.1 of 0.5, but was changed by 1.05/)
739
- end
740
-
741
- it 'provides a description' do
742
- expect(change(nil, :foo).
743
- by( a_value_within(0.1).of(0.5) ).description
744
- ).to eq("change #foo by a value within 0.1 of 0.5")
745
- end
746
- end
747
- end
748
-
749
- describe "expect { ... }.not_to change { ... }.from(matcher).to(matcher)" do
750
- it 'passes when the matcher matches the `from` value and it does not change' do
751
- k = 0.51
752
- expect { }.not_to change { k }.from( a_value_within(0.1).of(0.5) )
753
- end
754
-
755
- it 'fails with a clear message when the `from` matcher does not match' do
756
- expect {
757
- k = 0.51
758
- expect { }.not_to change { k }.from( a_value_within(0.1).of(1.5) )
759
- }.to fail_with(/expected result to have initially been a value within 0.1 of 1.5, but was 0.51/)
760
- end
761
- end
762
- end
763
-
764
- describe RSpec::Matchers::BuiltIn::Change do
765
- it "works when the receiver has implemented #send" do
766
- @instance = SomethingExpected.new
767
- @instance.some_value = "string"
768
- def @instance.send(*args); raise "DOH! Library developers shouldn't use #send!" end
769
-
770
- expect {
771
- expect { @instance.some_value = "cat" }.to change(@instance, :some_value)
772
- }.not_to raise_error
773
- end
774
-
775
- k = 1
776
- before { k = 1 }
777
- it_behaves_like "an RSpec matcher", :valid_value => lambda { k += 1 },
778
- :invalid_value => lambda { } do
779
- let(:matcher) { change { k } }
780
- end
781
- end
782
-
783
- describe RSpec::Matchers::BuiltIn::ChangeRelatively do
784
- k = 0
785
- before { k = 0 }
786
- it_behaves_like "an RSpec matcher", :valid_value => lambda { k += 1 },
787
- :invalid_value => lambda { k += 2 } do
788
- let(:matcher) { change { k }.by(1) }
789
- end
790
- end
791
-
792
- describe RSpec::Matchers::BuiltIn::ChangeFromValue do
793
- k = 0
794
- before { k = 0 }
795
- it_behaves_like "an RSpec matcher", :valid_value => lambda { k += 1 },
796
- :invalid_value => lambda { } do
797
- let(:matcher) { change { k }.from(0) }
798
- end
799
- end
800
-
801
- describe RSpec::Matchers::BuiltIn::ChangeToValue do
802
- k = 0
803
- before { k = 0 }
804
- it_behaves_like "an RSpec matcher", :valid_value => lambda { k = 2 },
805
- :invalid_value => lambda { k = 3 } do
806
- let(:matcher) { change { k }.to(2) }
807
- end
808
- end