r_spec 1.0.0.beta6 → 1.0.0.beta11
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Gem Version](https://badge.fury.io/rb/r_spec.svg)](https://badge.fury.io/rb/r_spec)
|
10
|
-
[![Build Status](https://travis-ci.org/cyril/r_spec.rb.svg?branch=main)](https://travis-ci.org/cyril/r_spec.rb)
|
11
|
-
[![Inline Docs](https://inch-ci.org/github/cyril/r_spec.rb.svg)](https://inch-ci.org/github/cyril/r_spec.rb)
|
12
10
|
[![Documentation](https://img.shields.io/:yard-docs-38c800.svg)](https://rubydoc.info/gems/r_spec/frames)
|
11
|
+
[![CI](https://github.com/cyril/r_spec.rb/workflows/CI/badge.svg?branch=main)](https://github.com/cyril/r_spec.rb/actions?query=workflow%3Aci+branch%3Amain)
|
12
|
+
[![RuboCop](https://github.com/cyril/r_spec.rb/workflows/RuboCop/badge.svg?branch=main)](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
|
+
![Runtime](https://r-spec.dev/benchmark-runtime.png)
|
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
|
+
![Fix testing tools logo for Ruby](https://github.com/cyril/r_spec.rb/raw/main/img/fixrb.svg)
|
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
|