r_spec 1.0.0.beta6 → 1.0.0.beta11
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.
- checksums.yaml +4 -4
- data/README.md +26 -14
- data/lib/r_spec.rb +96 -3
- data/lib/r_spec/dsl.rb +42 -66
- data/lib/r_spec/error.rb +1 -0
- data/lib/r_spec/error/pending_expectation.rb +1 -2
- data/lib/r_spec/error/reserved_method.rb +11 -0
- data/lib/r_spec/expectation_helper.rb +1 -1
- data/lib/r_spec/expectation_helper/it.rb +3 -3
- data/lib/r_spec/expectation_helper/its.rb +3 -3
- data/lib/r_spec/expectation_helper/{base.rb → shared.rb} +1 -1
- data/lib/r_spec/expectation_target/base.rb +4 -4
- data/lib/r_spec/expectation_target/block.rb +9 -11
- data/lib/r_spec/expectation_target/value.rb +10 -6
- metadata +25 -11
- data/lib/r_spec/sandbox.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c7957c4316cd89f58118ce544d50f3b5f401962648415b535c97da57ae4b7db
|
4
|
+
data.tar.gz: a1e8ec62ac5d695203917c85674a1d9b5dccbf1993c4fb55569fdd9d9401220b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51375c2f10d7cc11e71041c538940956e94721ae8f6e72af2bbb770d0b73041f6845b0100e9ebec2f7ec5d178fef388d5a5ece60e41076d7ff659d1d035afabd
|
7
|
+
data.tar.gz: 512ec78cc25d9ec8e0b5661c9a14b1fae3ae73714d8dc21e291721277ee6741035f5ccf130e190d661e8b19caf5d356d603a9951b40ad74b7fbdd20f7f9e6fec
|
data/README.md
CHANGED
@@ -7,13 +7,14 @@ A minimalist __[RSpec](https://github.com/rspec/rspec) clone__ with all the esse
|
|
7
7
|
## Status
|
8
8
|
|
9
9
|
[](https://badge.fury.io/rb/r_spec)
|
10
|
-
[](https://travis-ci.org/cyril/r_spec.rb)
|
11
|
-
[](https://inch-ci.org/github/cyril/r_spec.rb)
|
12
10
|
[](https://rubydoc.info/gems/r_spec/frames)
|
11
|
+
[](https://github.com/cyril/r_spec.rb/actions?query=workflow%3Aci+branch%3Amain)
|
12
|
+
[](https://github.com/cyril/r_spec.rb/actions?query=workflow%3Arubocop+branch%3Amain)
|
13
13
|
|
14
|
-
##
|
14
|
+
## Project goals
|
15
15
|
|
16
|
-
|
16
|
+
* Enforce the guidelines and best practices outlined in the community [RSpec style guide](https://rspec.rubystyle.guide/).
|
17
|
+
* Provide most of RSpec's DSL to express expected outcomes of a code example without magic power.
|
17
18
|
|
18
19
|
## Some differences
|
19
20
|
|
@@ -28,6 +29,8 @@ This clone attempts to provide most of RSpec's DSL to express expected outcomes
|
|
28
29
|
* [Arbitrary helper methods](https://relishapp.com/rspec/rspec-core/v/3-10/docs/helper-methods/arbitrary-helper-methods) are not exposed to examples.
|
29
30
|
* The `let` method defines a helper method rather than a memoized helper method.
|
30
31
|
* The one-liner `is_expected` syntax also works with block expectations.
|
32
|
+
* `subject`, `before`, `after` and `let` definitions must come before examples.
|
33
|
+
* Each `context` runs its tests in _isolation_ to prevent side effects.
|
31
34
|
|
32
35
|
## Important ⚠️
|
33
36
|
|
@@ -46,7 +49,7 @@ Following [RubyGems naming conventions](https://guides.rubygems.org/name-your-ge
|
|
46
49
|
Add this line to your application's Gemfile:
|
47
50
|
|
48
51
|
```ruby
|
49
|
-
gem "r_spec", ">= 1.0.0.
|
52
|
+
gem "r_spec", ">= 1.0.0.beta11"
|
50
53
|
```
|
51
54
|
|
52
55
|
And then execute:
|
@@ -100,7 +103,8 @@ For unit tests, it is recommended to follow the conventions for method names:
|
|
100
103
|
* instance methods are prefixed with `#`, class methods with `.`.
|
101
104
|
|
102
105
|
To establish certain contexts — think _empty array_ versus _array with elements_ — the `context` method may be used to communicate this to the reader.
|
103
|
-
|
106
|
+
Its behavior is slightly different from `describe` because each `context` runs its tests in isolation,
|
107
|
+
so side effects caused by testing do not propagate out of contexts.
|
104
108
|
|
105
109
|
`describe` and `context` take an optional description as argument and a block containing the individual specs or nested groupings.
|
106
110
|
|
@@ -215,13 +219,11 @@ task default: :test
|
|
215
219
|
|
216
220
|
## Performance
|
217
221
|
|
218
|
-
|
222
|
+
### Runtime
|
219
223
|
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
| RSpec | [32.7](https://github.com/cyril/r_spec.rb/blob/main/benchmark/rspec.rb) |
|
224
|
-
| minitest | [17.6](https://github.com/cyril/r_spec.rb/blob/main/benchmark/minitest.rb) |
|
224
|
+
Benchmark against [100 executions of a file containing one expectation](https://github.com/cyril/r_spec.rb/blob/main/benchmark/) (lower is better).
|
225
|
+
|
226
|
+

|
225
227
|
|
226
228
|
## Test suite
|
227
229
|
|
@@ -229,8 +231,10 @@ __RSpec clone__'s specifications are self-described here: [spec/](https://github
|
|
229
231
|
|
230
232
|
## Contact
|
231
233
|
|
232
|
-
* Home page: https://r-spec.dev
|
233
|
-
*
|
234
|
+
* Home page: [https://r-spec.dev/](https://r-spec.dev/)
|
235
|
+
* Cheatsheet: [https://r-spec.dev/cheatsheet.html](https://r-spec.dev/cheatsheet.html)
|
236
|
+
* Source code: [https://github.com/cyril/r_spec.rb](https://github.com/cyril/r_spec.rb)
|
237
|
+
* API Doc: [https://rubydoc.info/gems/r_spec](https://rubydoc.info/gems/r_spec)
|
234
238
|
* Twitter: [https://twitter.com/cyri\_](https://twitter.com/cyri\_)
|
235
239
|
|
236
240
|
## Special thanks ❤️
|
@@ -253,3 +257,11 @@ __RSpec clone__ follows [Semantic Versioning 2.0](https://semver.org/).
|
|
253
257
|
## License
|
254
258
|
|
255
259
|
The [gem](https://rubygems.org/gems/r_spec) is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
260
|
+
|
261
|
+
## One more thing
|
262
|
+
|
263
|
+
Under the hood, __RSpec clone__ is largely animated by [a collection of testing libraries designed to make programmers happy](https://github.com/fixrb/).
|
264
|
+
|
265
|
+
It's a living example of what we can do combining small libraries together that can boost the fun of programming.
|
266
|
+
|
267
|
+

|
data/lib/r_spec.rb
CHANGED
@@ -7,7 +7,7 @@ require_relative File.join("r_spec", "dsl")
|
|
7
7
|
# @example The true from the false
|
8
8
|
# require "r_spec"
|
9
9
|
#
|
10
|
-
# RSpec.describe do
|
10
|
+
# RSpec.describe "The true from the false" do
|
11
11
|
# it { expect(false).not_to be true }
|
12
12
|
# end
|
13
13
|
#
|
@@ -65,13 +65,106 @@ require_relative File.join("r_spec", "dsl")
|
|
65
65
|
#
|
66
66
|
# @api public
|
67
67
|
module RSpec
|
68
|
-
#
|
68
|
+
# Defines an example group that establishes a specific context, like _empty
|
69
|
+
# array_ versus _array with elements_.
|
70
|
+
#
|
71
|
+
# Unlike {.describe}, the block is evaluated in isolation in order to scope
|
72
|
+
# possible side effects inside its context.
|
73
|
+
#
|
74
|
+
# @example
|
75
|
+
# require "r_spec"
|
76
|
+
#
|
77
|
+
# RSpec.context "when divided by zero" do
|
78
|
+
# subject { 42 / 0 }
|
79
|
+
#
|
80
|
+
# it { is_expected.to raise_exception ZeroDivisionError }
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
# # Output to the console
|
84
|
+
# # Success: divided by 0.
|
85
|
+
#
|
86
|
+
# @param description [String] A description that usually begins with "when",
|
87
|
+
# "with" or "without".
|
88
|
+
# @param block [Proc] The block to define the specs.
|
89
|
+
#
|
90
|
+
# @api public
|
91
|
+
def self.context(description, &block)
|
92
|
+
Dsl.context(description, &block)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Defines an example group that describes a unit to be tested.
|
96
|
+
#
|
97
|
+
# @example
|
98
|
+
# require "r_spec"
|
99
|
+
#
|
100
|
+
# RSpec.describe String do
|
101
|
+
# describe "+" do
|
102
|
+
# it("concats") { expect("foo" + "bar").to eq "foobar" }
|
103
|
+
# end
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
# # Output to the console
|
107
|
+
# # Success: expected to eq "foobar".
|
69
108
|
#
|
70
109
|
# @param const [Module, String] A module to include in block context.
|
71
110
|
# @param block [Proc] The block to define the specs.
|
72
111
|
#
|
73
112
|
# @api public
|
74
|
-
def self.describe(const
|
113
|
+
def self.describe(const, &block)
|
75
114
|
Dsl.describe(const, &block)
|
76
115
|
end
|
116
|
+
|
117
|
+
# Defines a concrete test case.
|
118
|
+
#
|
119
|
+
# The test is performed by the block supplied to &block.
|
120
|
+
#
|
121
|
+
# @example The integer after 41
|
122
|
+
# require "r_spec"
|
123
|
+
#
|
124
|
+
# RSpec.it { expect(41.next).to be 42 }
|
125
|
+
#
|
126
|
+
# # Output to the console
|
127
|
+
# # Success: expected to be 42.
|
128
|
+
#
|
129
|
+
# It is usually used inside a {Dsl.describe} or {Dsl.context} section.
|
130
|
+
#
|
131
|
+
# @param name [String, nil] The name of the spec.
|
132
|
+
# @param block [Proc] An expectation to evaluate.
|
133
|
+
#
|
134
|
+
# @raise (see RSpec::ExpectationTarget::Base#result)
|
135
|
+
# @return (see RSpec::ExpectationTarget::Base#result)
|
136
|
+
#
|
137
|
+
# @api public
|
138
|
+
def self.it(name = nil, &block)
|
139
|
+
Dsl.it(name, &block)
|
140
|
+
end
|
141
|
+
|
142
|
+
# Defines a pending test case.
|
143
|
+
#
|
144
|
+
# `&block` is never evaluated. It can be used to describe behaviour that is
|
145
|
+
# not yet implemented.
|
146
|
+
#
|
147
|
+
# @example
|
148
|
+
# require "r_spec"
|
149
|
+
#
|
150
|
+
# RSpec.pending "is implemented but waiting" do
|
151
|
+
# expect something to be finished
|
152
|
+
# end
|
153
|
+
#
|
154
|
+
# RSpec.pending "is not yet implemented and waiting"
|
155
|
+
#
|
156
|
+
# # Output to the console
|
157
|
+
# # Warning: is implemented but waiting.
|
158
|
+
# # Warning: is not yet implemented and waiting.
|
159
|
+
#
|
160
|
+
# It is usually used inside a {Dsl.describe} or {Dsl.context} section.
|
161
|
+
#
|
162
|
+
# @param message [String] The reason why the example is pending.
|
163
|
+
#
|
164
|
+
# @return [nil] Write a message to STDOUT.
|
165
|
+
#
|
166
|
+
# @api public
|
167
|
+
def self.pending(message)
|
168
|
+
Dsl.pending(message)
|
169
|
+
end
|
77
170
|
end
|
data/lib/r_spec/dsl.rb
CHANGED
@@ -1,15 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "aw"
|
4
4
|
|
5
5
|
require_relative "console"
|
6
6
|
require_relative "error"
|
7
7
|
require_relative "expectation_helper"
|
8
|
-
require_relative "sandbox"
|
9
8
|
|
10
9
|
module RSpec
|
11
10
|
# Abstract class for handling the domain-specific language.
|
12
11
|
class Dsl
|
12
|
+
BEFORE_METHOD = :initialize
|
13
|
+
AFTER_METHOD = :terminate
|
14
|
+
|
15
|
+
private_constant :BEFORE_METHOD, :AFTER_METHOD
|
16
|
+
|
13
17
|
# Executes the given block before each spec in the current context runs.
|
14
18
|
#
|
15
19
|
# @example
|
@@ -40,12 +44,12 @@ module RSpec
|
|
40
44
|
#
|
41
45
|
# @param block [Proc] The content to execute at the class initialization.
|
42
46
|
def self.before(&block)
|
43
|
-
define_method(
|
47
|
+
define_method(BEFORE_METHOD) do
|
44
48
|
super()
|
45
49
|
instance_eval(&block)
|
46
50
|
end
|
47
51
|
|
48
|
-
private
|
52
|
+
private BEFORE_METHOD
|
49
53
|
end
|
50
54
|
|
51
55
|
# Executes the given block after each spec in the current context runs.
|
@@ -67,12 +71,12 @@ module RSpec
|
|
67
71
|
#
|
68
72
|
# @param block [Proc] The content to execute at the class initialization.
|
69
73
|
def self.after(&block)
|
70
|
-
define_method(
|
74
|
+
define_method(AFTER_METHOD) do
|
71
75
|
instance_exec(&block)
|
72
76
|
super()
|
73
77
|
end
|
74
78
|
|
75
|
-
private
|
79
|
+
private AFTER_METHOD
|
76
80
|
end
|
77
81
|
|
78
82
|
# Sets a user-defined property.
|
@@ -80,7 +84,7 @@ module RSpec
|
|
80
84
|
# @example
|
81
85
|
# require "r_spec"
|
82
86
|
#
|
83
|
-
# RSpec.describe do
|
87
|
+
# RSpec.describe "Name stories" do
|
84
88
|
# let(:name) { "Bob" }
|
85
89
|
#
|
86
90
|
# it { expect(name).to eq "Bob" }
|
@@ -99,9 +103,11 @@ module RSpec
|
|
99
103
|
# @param name [String, Symbol] The name of the property.
|
100
104
|
# @param block [Proc] The content of the method to define.
|
101
105
|
#
|
102
|
-
# @return [Symbol] A
|
106
|
+
# @return [Symbol] A private method that define the block content.
|
103
107
|
def self.let(name, *args, **kwargs, &block)
|
104
|
-
|
108
|
+
raise Error::ReservedMethod if [BEFORE_METHOD, AFTER_METHOD].include?(name.to_sym)
|
109
|
+
|
110
|
+
private define_method(name, *args, **kwargs, &block)
|
105
111
|
end
|
106
112
|
|
107
113
|
# Sets a user-defined property named {#subject}.
|
@@ -140,28 +146,24 @@ module RSpec
|
|
140
146
|
# # Output to the console
|
141
147
|
# # Success: expected to eq "foobar".
|
142
148
|
#
|
143
|
-
# @param const [Module,
|
149
|
+
# @param const [Module, String] A module to include in block context.
|
144
150
|
# @param block [Proc] The block to define the specs.
|
145
|
-
def self.describe(const
|
146
|
-
desc =
|
147
|
-
|
148
|
-
if const.is_a?(::Module)
|
149
|
-
desc.define_method(:described_class) { const }
|
150
|
-
desc.send(:protected, :described_class)
|
151
|
-
end
|
152
|
-
|
151
|
+
def self.describe(const, &block)
|
152
|
+
desc = ::Class.new(self)
|
153
|
+
desc.let(:described_class) { const } if const.is_a?(::Module)
|
153
154
|
desc.instance_eval(&block)
|
154
155
|
end
|
155
156
|
|
156
157
|
# Defines an example group that establishes a specific context, like _empty
|
157
158
|
# array_ versus _array with elements_.
|
158
159
|
#
|
159
|
-
#
|
160
|
+
# Unlike {.describe}, the block is evaluated in isolation in order to scope
|
161
|
+
# possible side effects inside its context.
|
160
162
|
#
|
161
163
|
# @example
|
162
164
|
# require "r_spec"
|
163
165
|
#
|
164
|
-
# RSpec.describe do
|
166
|
+
# RSpec.describe "web resource" do
|
165
167
|
# context "when resource is not found" do
|
166
168
|
# pending "responds with 404"
|
167
169
|
# end
|
@@ -179,8 +181,8 @@ module RSpec
|
|
179
181
|
# "when", "with" or "without".
|
180
182
|
# @param block [Proc] The block to define the specs.
|
181
183
|
def self.context(_description = nil, &block)
|
182
|
-
desc =
|
183
|
-
desc.instance_eval(&block)
|
184
|
+
desc = ::Class.new(self)
|
185
|
+
::Aw.fork! { desc.instance_eval(&block) }
|
184
186
|
end
|
185
187
|
|
186
188
|
# Defines a concrete test case.
|
@@ -224,14 +226,14 @@ module RSpec
|
|
224
226
|
def self.it(_name = nil, &block)
|
225
227
|
raise ::ArgumentError, "Missing example block" unless block
|
226
228
|
|
227
|
-
|
228
|
-
|
229
|
+
example = ::Class.new(self) { include ExpectationHelper::It }.new
|
230
|
+
example.instance_eval(&block)
|
229
231
|
rescue ::SystemExit
|
230
232
|
Console.source(*block.source_location)
|
231
233
|
|
232
234
|
exit false
|
233
235
|
ensure
|
234
|
-
|
236
|
+
example&.send(AFTER_METHOD)
|
235
237
|
end
|
236
238
|
|
237
239
|
# Use the {.its} method to define a single spec that specifies the actual
|
@@ -282,19 +284,21 @@ module RSpec
|
|
282
284
|
def self.its(attribute, *args, **kwargs, &block)
|
283
285
|
raise ::ArgumentError, "Missing example block" unless block
|
284
286
|
|
285
|
-
|
287
|
+
example = ::Class.new(self) do
|
288
|
+
include ExpectationHelper::Its
|
286
289
|
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
+
define_method(:actual) do
|
291
|
+
subject.public_send(attribute, *args, **kwargs)
|
292
|
+
end
|
293
|
+
end.new
|
290
294
|
|
291
|
-
|
295
|
+
example.instance_eval(&block)
|
292
296
|
rescue ::SystemExit
|
293
297
|
Console.source(*block.source_location)
|
294
298
|
|
295
299
|
exit false
|
296
300
|
ensure
|
297
|
-
|
301
|
+
example&.send(AFTER_METHOD)
|
298
302
|
end
|
299
303
|
|
300
304
|
# Defines a pending test case.
|
@@ -305,23 +309,16 @@ module RSpec
|
|
305
309
|
# @example
|
306
310
|
# require "r_spec"
|
307
311
|
#
|
308
|
-
# RSpec.describe do
|
312
|
+
# RSpec.describe "an example" do
|
309
313
|
# pending "is implemented but waiting" do
|
310
|
-
# expect
|
314
|
+
# expect something to be finished
|
311
315
|
# end
|
312
|
-
# end
|
313
316
|
#
|
314
|
-
# # Output to the console
|
315
|
-
# # Warning: is implemented but waiting.
|
316
|
-
#
|
317
|
-
# @example
|
318
|
-
# require "r_spec"
|
319
|
-
#
|
320
|
-
# RSpec.describe do
|
321
317
|
# pending "is not yet implemented and waiting"
|
322
318
|
# end
|
323
319
|
#
|
324
320
|
# # Output to the console
|
321
|
+
# # Warning: is implemented but waiting.
|
325
322
|
# # Warning: is not yet implemented and waiting.
|
326
323
|
#
|
327
324
|
# @param message [String] The reason why the example is pending.
|
@@ -333,30 +330,7 @@ module RSpec
|
|
333
330
|
Console.passed_spec Error::PendingExpectation.result(message)
|
334
331
|
end
|
335
332
|
|
336
|
-
|
337
|
-
#
|
338
|
-
# @return [Class<Dsl>] The class of the example to be tested.
|
339
|
-
def self.it_example
|
340
|
-
::Class.new(self) { include ExpectationHelper::It }
|
341
|
-
end
|
342
|
-
|
343
|
-
# @private
|
344
|
-
#
|
345
|
-
# @return [Class<Dsl>] The class of the example to be tested.
|
346
|
-
def self.its_example
|
347
|
-
::Class.new(self) { include ExpectationHelper::Its }
|
348
|
-
end
|
349
|
-
|
350
|
-
# @private
|
351
|
-
#
|
352
|
-
# @return [String] A random constant name for a test class.
|
353
|
-
def self.random_context_const_name
|
354
|
-
"Context#{::SecureRandom.hex(4).to_i(16)}"
|
355
|
-
end
|
356
|
-
|
357
|
-
private_class_method :it_example, :its_example, :random_context_const_name
|
358
|
-
|
359
|
-
protected
|
333
|
+
private
|
360
334
|
|
361
335
|
def described_class
|
362
336
|
raise Error::UndefinedDescribedClass,
|
@@ -367,6 +341,8 @@ module RSpec
|
|
367
341
|
raise Error::UndefinedSubject, "subject not explicitly defined"
|
368
342
|
end
|
369
343
|
|
370
|
-
|
344
|
+
define_method(AFTER_METHOD) do
|
345
|
+
# do nothing by default
|
346
|
+
end
|
371
347
|
end
|
372
348
|
end
|
data/lib/r_spec/error.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative File.join("error", "pending_expectation")
|
4
|
+
require_relative File.join("error", "reserved_method")
|
4
5
|
require_relative File.join("error", "undefined_described_class")
|
5
6
|
require_relative File.join("error", "undefined_subject")
|
6
7
|
|
@@ -4,7 +4,7 @@ require_relative File.join("expectation_helper", "it")
|
|
4
4
|
require_relative File.join("expectation_helper", "its")
|
5
5
|
|
6
6
|
module RSpec
|
7
|
-
# Namespace for
|
7
|
+
# Namespace for {Dsl.it} and {Dsl.its}'s helper modules.
|
8
8
|
module ExpectationHelper
|
9
9
|
end
|
10
10
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "
|
3
|
+
require_relative "shared"
|
4
4
|
require_relative File.join("..", "expectation_target")
|
5
5
|
|
6
6
|
module RSpec
|
7
7
|
module ExpectationHelper
|
8
|
-
# {RSpec::
|
8
|
+
# {RSpec::Dsl.it}'s expectation helper module.
|
9
9
|
module It
|
10
|
-
include
|
10
|
+
include Shared
|
11
11
|
|
12
12
|
# Create an expectation for a spec.
|
13
13
|
#
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "
|
3
|
+
require_relative "shared"
|
4
4
|
require_relative File.join("..", "expectation_target", "block")
|
5
5
|
|
6
6
|
module RSpec
|
7
7
|
module ExpectationHelper
|
8
|
-
# {RSpec::
|
8
|
+
# {RSpec::Dsl.its}'s expectation helper module.
|
9
9
|
module Its
|
10
|
-
include
|
10
|
+
include Shared
|
11
11
|
|
12
12
|
# Wraps the target of an expectation with the actual value.
|
13
13
|
#
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "expresenter"
|
4
|
+
require "test_tube"
|
4
5
|
|
5
6
|
require_relative File.join("..", "console")
|
6
7
|
|
@@ -50,12 +51,12 @@ module RSpec
|
|
50
51
|
|
51
52
|
protected
|
52
53
|
|
54
|
+
# @param passed [Boolean] The high expectation passed or failed.
|
53
55
|
# @param actual [#object_id] The actual value.
|
54
56
|
# @param error [Exception, nil] Any raised exception.
|
55
57
|
# @param got [Boolean, nil] Any returned value.
|
56
58
|
# @param matcher [#matches?] The matcher.
|
57
59
|
# @param negate [Boolean] The assertion is positive or negative.
|
58
|
-
# @param valid [Boolean] The result of an expectation.
|
59
60
|
#
|
60
61
|
# @return [nil] Write a message to STDOUT.
|
61
62
|
#
|
@@ -63,14 +64,13 @@ module RSpec
|
|
63
64
|
# `Kernel.exit(false)` with a failure message written to STDERR.
|
64
65
|
#
|
65
66
|
# @api private
|
66
|
-
def result(actual:, error:, got:, matcher:, negate
|
67
|
-
Console.passed_spec ::Expresenter.call(
|
67
|
+
def result(passed, actual:, error:, got:, matcher:, negate:)
|
68
|
+
Console.passed_spec ::Expresenter.call(passed).with(
|
68
69
|
actual: actual,
|
69
70
|
error: error,
|
70
71
|
expected: matcher.expected,
|
71
72
|
got: got,
|
72
73
|
negate: negate,
|
73
|
-
valid: valid,
|
74
74
|
matcher: matcher.class.to_sym,
|
75
75
|
level: :MUST
|
76
76
|
)
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "spectus/exam"
|
4
|
-
|
5
3
|
require_relative "base"
|
6
4
|
|
7
5
|
module RSpec
|
@@ -30,20 +28,20 @@ module RSpec
|
|
30
28
|
# @raise [SystemExit] Terminate execution immediately by calling
|
31
29
|
# `Kernel.exit(false)` with a failure message written to STDERR.
|
32
30
|
def absolute_requirement(matcher:, negate:)
|
33
|
-
|
34
|
-
|
31
|
+
experiment = ::TestTube.invoke(
|
32
|
+
@actual,
|
35
33
|
isolation: false,
|
36
|
-
|
37
|
-
|
34
|
+
matcher: matcher,
|
35
|
+
negate: negate
|
38
36
|
)
|
39
37
|
|
40
38
|
result(
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
experiment.got.equal?(true),
|
40
|
+
actual: experiment.actual,
|
41
|
+
error: experiment.error,
|
42
|
+
got: experiment.got,
|
44
43
|
matcher: matcher,
|
45
|
-
negate: negate
|
46
|
-
valid: exam.valid?
|
44
|
+
negate: negate
|
47
45
|
)
|
48
46
|
end
|
49
47
|
end
|
@@ -28,15 +28,19 @@ module RSpec
|
|
28
28
|
# @raise [SystemExit] Terminate execution immediately by calling
|
29
29
|
# `Kernel.exit(false)` with a failure message written to STDERR.
|
30
30
|
def absolute_requirement(matcher:, negate:)
|
31
|
-
|
31
|
+
experiment = ::TestTube.pass(
|
32
|
+
@actual,
|
33
|
+
matcher: matcher,
|
34
|
+
negate: negate
|
35
|
+
)
|
32
36
|
|
33
37
|
result(
|
34
|
-
|
35
|
-
|
36
|
-
|
38
|
+
experiment.got.equal?(true),
|
39
|
+
actual: experiment.actual,
|
40
|
+
error: experiment.error,
|
41
|
+
got: experiment.got,
|
37
42
|
matcher: matcher,
|
38
|
-
negate: negate
|
39
|
-
valid: valid
|
43
|
+
negate: negate
|
40
44
|
)
|
41
45
|
end
|
42
46
|
end
|
metadata
CHANGED
@@ -1,57 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: r_spec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cyril Kato
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-06-
|
11
|
+
date: 2021-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aw
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.1.12
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.1.12
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: expresenter
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - "~>"
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
33
|
+
version: 1.3.0
|
20
34
|
type: :runtime
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
38
|
- - "~>"
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
40
|
+
version: 1.3.0
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: matchi-rspec
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
45
|
- - "~>"
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.1.
|
47
|
+
version: 1.1.2
|
34
48
|
type: :runtime
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
52
|
- - "~>"
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.1.
|
54
|
+
version: 1.1.2
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
56
|
+
name: test_tube
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
61
|
+
version: 1.1.0
|
48
62
|
type: :runtime
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
68
|
+
version: 1.1.0
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: bundler
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -191,17 +205,17 @@ files:
|
|
191
205
|
- lib/r_spec/dsl.rb
|
192
206
|
- lib/r_spec/error.rb
|
193
207
|
- lib/r_spec/error/pending_expectation.rb
|
208
|
+
- lib/r_spec/error/reserved_method.rb
|
194
209
|
- lib/r_spec/error/undefined_described_class.rb
|
195
210
|
- lib/r_spec/error/undefined_subject.rb
|
196
211
|
- lib/r_spec/expectation_helper.rb
|
197
|
-
- lib/r_spec/expectation_helper/base.rb
|
198
212
|
- lib/r_spec/expectation_helper/it.rb
|
199
213
|
- lib/r_spec/expectation_helper/its.rb
|
214
|
+
- lib/r_spec/expectation_helper/shared.rb
|
200
215
|
- lib/r_spec/expectation_target.rb
|
201
216
|
- lib/r_spec/expectation_target/base.rb
|
202
217
|
- lib/r_spec/expectation_target/block.rb
|
203
218
|
- lib/r_spec/expectation_target/value.rb
|
204
|
-
- lib/r_spec/sandbox.rb
|
205
219
|
homepage: https://r-spec.dev/
|
206
220
|
licenses:
|
207
221
|
- MIT
|