spectus 3.3.0 → 3.4.0
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 +123 -48
- data/lib/spectus.rb +93 -5
- data/lib/spectus/expectation_target.rb +4 -4
- data/lib/spectus/requirement_level/base.rb +25 -24
- data/lib/spectus/requirement_level/may.rb +1 -1
- data/lib/spectus/requirement_level/must.rb +1 -1
- data/lib/spectus/requirement_level/should.rb +1 -1
- data/lib/spectus/result.rb +3 -3
- data/lib/spectus/result/fail.rb +2 -0
- data/lib/spectus/result/pass.rb +2 -0
- metadata +12 -13
- data/lib/spectus/exam.rb +0 -56
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2fea4a88991addc0a6b69ce46d6422e92df818447818975d6123848cbba9d5a7
|
4
|
+
data.tar.gz: 8dffb97e6e58cdf0c3e5661294238e42f5477f4e677a34868ce918156086cbdb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a4798a255dcf0097dcba1bac46af91552a11348513c0d4af77a00a748cb950e90b113c264404cc745af3c7dc730154ad81893d879a495450f6cda5ca4b07942
|
7
|
+
data.tar.gz: ba56345d554c0483ce27fd6c7d876e7837d59a53a37a9b9e6417df849e0a6047b522a2c00e7f5d4327a76c1ed3e60cea68cff5970e7dcc4718d31ed89e3e6fa4
|
data/README.md
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
# Spectus
|
2
2
|
|
3
|
-
[]
|
4
|
-
[][inchpages]
|
7
|
-
[][rubydoc]
|
3
|
+
[](https://travis-ci.org/fixrb/spectus)
|
4
|
+
[](https://rubygems.org/gems/spectus)
|
5
|
+
[](https://rubydoc.info/gems/spectus/frames)
|
8
6
|
|
9
|
-
> Expectation library with [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt)
|
7
|
+
> Expectation library with [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt) requirement levels 🚥
|
10
8
|
|
11
9
|
## Installation
|
12
10
|
|
@@ -18,80 +16,161 @@ gem "spectus"
|
|
18
16
|
|
19
17
|
And then execute:
|
20
18
|
|
21
|
-
|
19
|
+
```sh
|
20
|
+
bundle
|
21
|
+
```
|
22
22
|
|
23
23
|
Or install it yourself as:
|
24
24
|
|
25
|
-
|
25
|
+
```sh
|
26
|
+
gem install spectus
|
27
|
+
```
|
28
|
+
|
29
|
+
## Overview
|
30
|
+
|
31
|
+
Assuming that an expectation is an assertion that is either `true` or `false`,
|
32
|
+
qualifying it with `MUST`, `SHOULD` and `MAY`, we can draw up several scenarios:
|
33
|
+
|
34
|
+
| Requirement levels | **MUST** | **SHOULD** | **MAY** |
|
35
|
+
| ------------------------- | -------- | ---------- | ------- |
|
36
|
+
| Implemented & Matched | `true` | `true` | `true` |
|
37
|
+
| Implemented & Not matched | `false` | `true` | `false` |
|
38
|
+
| Implemented & Exception | `false` | `false` | `false` |
|
39
|
+
| Not implemented | `false` | `false` | `true` |
|
40
|
+
|
41
|
+
When an expectation is evaluated by __Spectus__,
|
42
|
+
|
43
|
+
* in case of a _passed_ expectation, a `Spectus::Result::Pass` instance is _returned_;
|
44
|
+
* in case of a _failed_ expectation, a `Spectus::Result::Fail` exception is _raised_.
|
26
45
|
|
27
46
|
## Usage
|
28
47
|
|
29
|
-
|
48
|
+
The __Spectus__ library is basically a module containing an `it` instance method that accept a block representing the actual value to be evaluated through an expectation.
|
49
|
+
|
50
|
+
The `Spectus` module can be included inside a class and used as follows:
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
require "spectus"
|
54
|
+
|
55
|
+
class Spec
|
56
|
+
include ::Spectus
|
57
|
+
|
58
|
+
attr_reader :subject
|
59
|
+
|
60
|
+
def initialize(subject)
|
61
|
+
@subject = subject
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_a
|
65
|
+
it { subject.upcase }.MUST eql "FOO"
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_b
|
69
|
+
it { subject.blank? }.MAY be_true
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_c
|
73
|
+
it { subject.length }.SHOULD equal 42
|
74
|
+
end
|
75
|
+
end
|
76
|
+
```
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
t = Spec.new("foo")
|
80
|
+
|
81
|
+
t.test_a # => Spectus::Result::Pass(actual: "FOO", error: nil, expected: "FOO", got: true, matcher: :eql, negate: false, level: :MUST)
|
82
|
+
|
83
|
+
t.test_b # => Spectus::Result::Pass(actual: nil, error: #<NoMethodError: undefined method `blank?' for "foo":String>, expected: nil, got: nil, matcher: :be_true, negate: false, level: :MAY)
|
84
|
+
|
85
|
+
t.test_c # => Spectus::Result::Pass(actual: 3, error: nil, expected: 42, got: false, matcher: :equal, negate: false, level: :SHOULD)
|
86
|
+
```
|
30
87
|
|
31
88
|
```ruby
|
89
|
+
t = Spec.new(4)
|
90
|
+
|
91
|
+
t.test_a # => raises an exception:
|
92
|
+
# Traceback (most recent call last):
|
93
|
+
# 3: from ./bin/console:8:in `<main>'
|
94
|
+
# 2: from (irb):23
|
95
|
+
# 1: from (irb):11:in `test_a'
|
96
|
+
# Spectus::Result::Fail (NoMethodError: undefined method `upcase' for 4:Integer)
|
97
|
+
|
98
|
+
t.test_b # => Spectus::Result::Pass(actual: nil, error: #<NoMethodError: undefined method `blank?' for 4:Integer>, expected: nil, got: nil, matcher: :be_true, negate: false, level: :MAY)
|
99
|
+
|
100
|
+
t.test_c # => raises an exception:
|
101
|
+
# Traceback (most recent call last):
|
102
|
+
# 3: from ./bin/console:8:in `<main>'
|
103
|
+
# 2: from (irb):25
|
104
|
+
# 1: from (irb):19:in `test_c'
|
105
|
+
# Spectus::Result::Fail (NoMethodError: undefined method `length' for 4:Integer.)
|
106
|
+
```
|
107
|
+
|
108
|
+
## More examples
|
109
|
+
|
110
|
+
To make __Spectus__ available:
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
require "spectus"
|
114
|
+
|
32
115
|
include Spectus
|
33
116
|
```
|
34
117
|
|
118
|
+
All examples here assume that this has been done.
|
119
|
+
|
35
120
|
### Absolute Requirement
|
36
121
|
|
37
|
-
|
122
|
+
There's only one bat:
|
38
123
|
|
39
124
|
```ruby
|
40
|
-
it { "
|
41
|
-
# => Spectus::Result::Pass(actual:
|
125
|
+
it { "🦇".size }.MUST equal 1
|
126
|
+
# => Spectus::Result::Pass(actual: 1, error: nil, expected: 1, got: true, matcher: :equal, negate: false, level: :MUST)
|
42
127
|
```
|
43
128
|
|
44
|
-
The result of the test shows that the spec passed.
|
45
|
-
|
46
129
|
### Absolute Prohibition
|
47
130
|
|
48
|
-
|
131
|
+
The true from the false:
|
49
132
|
|
50
133
|
```ruby
|
51
|
-
it {
|
52
|
-
# => Spectus::Result::Pass(actual:
|
134
|
+
it { false }.MUST_NOT be_true
|
135
|
+
# => Spectus::Result::Pass(actual: false, error: nil, expected: nil, got: true, matcher: :be_true, negate: true, level: :MUST)
|
53
136
|
```
|
54
137
|
|
55
|
-
The result of the test shows that the spec passed.
|
56
|
-
|
57
138
|
### Recommended
|
58
139
|
|
59
|
-
|
140
|
+
A well-known joke. An addition of `0.1` and `0.2` is deadly precise:
|
60
141
|
|
61
142
|
```ruby
|
62
|
-
it {
|
63
|
-
# => Spectus::Result::Pass(actual:
|
143
|
+
it { 0.1 + 0.2 }.SHOULD equal 0.3
|
144
|
+
# => Spectus::Result::Pass(actual: 0.30000000000000004, error: nil, expected: 0.3, got: false, matcher: :equal, negate: false, level: :SHOULD)
|
64
145
|
```
|
65
146
|
|
66
|
-
Instead of the expected `NilClass` class, its sole instance (which is `nil`) was returned.
|
67
|
-
However, because there isn't any exception, the result of the test shows that the spec passed.
|
68
|
-
|
69
147
|
### Not Recommended
|
70
148
|
|
71
|
-
|
149
|
+
The situation should still be under control:
|
72
150
|
|
73
151
|
```ruby
|
74
|
-
it {
|
75
|
-
# raise Spectus::Result::Fail(actual: nil, error: #<TypeError: no implicit conversion of Integer into String>, expected: "11", got: nil, matcher: :eql, negate: true, level: :SHOULD, valid: false)
|
152
|
+
it { BOOM }.SHOULD_NOT raise_exception SystemExit
|
76
153
|
```
|
77
154
|
|
78
|
-
|
155
|
+
```txt
|
156
|
+
Traceback (most recent call last):
|
157
|
+
2: from ./bin/console:8:in `<main>'
|
158
|
+
1: from (irb):8
|
159
|
+
Spectus::Result::Fail (NameError: uninitialized constant BOOM.)
|
160
|
+
```
|
79
161
|
|
80
162
|
### Optional
|
81
163
|
|
82
|
-
|
164
|
+
An empty array is blank, right?
|
83
165
|
|
84
166
|
```ruby
|
85
|
-
it {
|
86
|
-
# => Spectus::Result::Pass(actual: nil, error: #<NoMethodError: undefined method `blank?' for
|
167
|
+
it { [].blank? }.MAY be_true
|
168
|
+
# => Spectus::Result::Pass(actual: nil, error: #<NoMethodError: undefined method `blank?' for []:Array>, expected: nil, got: nil, matcher: :be_true, negate: false, level: :MAY)
|
87
169
|
```
|
88
170
|
|
89
|
-
|
90
|
-
|
91
|
-
### More Examples
|
171
|
+
Damn, I forgot to load activesupport. 🤦♂️
|
92
172
|
|
93
|
-
|
94
|
-
[./test.rb](https://github.com/fixrb/spectus/blob/main/test.rb)
|
173
|
+
That said, the test is passing due to the _not-implemented-like_ raised exception: `NoMethodError`.
|
95
174
|
|
96
175
|
## Code Isolation
|
97
176
|
|
@@ -104,20 +183,22 @@ Because they may or may not be desired, each requirement level has 2 versions:
|
|
104
183
|
Example of test without isolation:
|
105
184
|
|
106
185
|
```ruby
|
107
|
-
include Spectus
|
108
186
|
greeting = "Hello, world!"
|
187
|
+
|
109
188
|
it { greeting.gsub!("world", "Alice") }.MUST eql "Hello, Alice!"
|
110
|
-
# => Spectus::Result::Pass(actual: "Hello, Alice!", error: nil, expected: "Hello, Alice!", got: true, matcher: :eql, negate: false, level: :MUST
|
189
|
+
# => Spectus::Result::Pass(actual: "Hello, Alice!", error: nil, expected: "Hello, Alice!", got: true, matcher: :eql, negate: false, level: :MUST)
|
190
|
+
|
111
191
|
greeting # => "Hello, Alice!"
|
112
192
|
```
|
113
193
|
|
114
194
|
Example of test in isolation:
|
115
195
|
|
116
196
|
```ruby
|
117
|
-
include Spectus
|
118
197
|
greeting = "Hello, world!"
|
198
|
+
|
119
199
|
it { greeting.gsub!("world", "Alice") }.MUST! eql "Hello, Alice!"
|
120
|
-
# => Spectus::Result::Pass(actual: "Hello, Alice!", error: nil, expected: "Hello, Alice!", got: true, matcher: :eql, negate: false, level: :MUST
|
200
|
+
# => Spectus::Result::Pass(actual: "Hello, Alice!", error: nil, expected: "Hello, Alice!", got: true, matcher: :eql, negate: false, level: :MUST)
|
201
|
+
|
121
202
|
greeting # => "Hello, world!"
|
122
203
|
```
|
123
204
|
|
@@ -132,7 +213,7 @@ __Spectus__ follows [Semantic Versioning 2.0](https://semver.org/).
|
|
132
213
|
|
133
214
|
## License
|
134
215
|
|
135
|
-
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
216
|
+
The [gem](https://rubygems.org/gems/spectus) is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
136
217
|
|
137
218
|
***
|
138
219
|
|
@@ -142,9 +223,3 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
142
223
|
src="https://github.com/fixrb/spectus/raw/main/img/sashite.png"
|
143
224
|
alt="Sashite" /></a>
|
144
225
|
</p>
|
145
|
-
|
146
|
-
[gem]: https://rubygems.org/gems/spectus
|
147
|
-
[travis]: https://travis-ci.org/fixrb/spectus
|
148
|
-
[codeclimate]: https://codeclimate.com/github/fixrb/spectus
|
149
|
-
[inchpages]: https://inch-ci.org/github/fixrb/spectus
|
150
|
-
[rubydoc]: https://rubydoc.info/gems/spectus/frames
|
data/lib/spectus.rb
CHANGED
@@ -2,18 +2,108 @@
|
|
2
2
|
|
3
3
|
require "matchi/helper"
|
4
4
|
|
5
|
+
require_relative File.join("spectus", "expectation_target")
|
6
|
+
|
5
7
|
# Namespace for the Spectus library.
|
6
8
|
#
|
7
|
-
#
|
9
|
+
# This module defines the {#it} method to create expectations, which can be
|
10
|
+
# automatically included into classes.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# class Spec
|
14
|
+
# include ::Spectus
|
15
|
+
#
|
16
|
+
# attr_reader :subject
|
17
|
+
#
|
18
|
+
# def initialize(subject)
|
19
|
+
# @subject = subject
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# def test_a
|
23
|
+
# it { subject.upcase }.MUST eql "FOO"
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# def test_b
|
27
|
+
# it { subject.blank? }.MAY be_true
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# def test_c
|
31
|
+
# it { subject.length }.SHOULD equal 42
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# t = Spec.new("foo")
|
36
|
+
# t.test_a # => Spectus::Result::Pass(actual: "FOO", error: nil, expected: "FOO", got: true, matcher: :eql, negate: false, level: :MUST)
|
37
|
+
# t.test_b # => Spectus::Result::Pass(actual: nil, error: #<NoMethodError: undefined method `blank?' for "foo":String>, expected: nil, got: nil, matcher: :be_true, negate: false, level: :MAY)
|
38
|
+
# t.test_c # => Spectus::Result::Pass(actual: 3, error: nil, expected: 42, got: false, matcher: :equal, negate: false, level: :SHOULD)
|
39
|
+
#
|
40
|
+
# Or even directly used like this.
|
41
|
+
#
|
42
|
+
# @example
|
8
43
|
# require 'spectus'
|
9
|
-
#
|
44
|
+
#
|
45
|
+
# include Spectus
|
46
|
+
#
|
47
|
+
# it { 42 }.MUST equal 42 # => Spectus::Result::Pass(actual: 42, error: nil, expected: 42, got: true, matcher: :equal, negate: false, level: :MUST
|
48
|
+
#
|
49
|
+
# It also includes a collection of expectation matchers 🤹
|
50
|
+
#
|
51
|
+
# @example Equivalence matcher
|
52
|
+
# matcher = eql("foo") # => Matchi::Matcher::Eql.new("foo")
|
53
|
+
# matcher.matches? { "foo" } # => true
|
54
|
+
# matcher.matches? { "bar" } # => false
|
55
|
+
#
|
56
|
+
# @example Identity matcher
|
57
|
+
# object = "foo"
|
58
|
+
#
|
59
|
+
# matcher = equal(object) # => Matchi::Matcher::Equal.new(object)
|
60
|
+
# matcher.matches? { object } # => true
|
61
|
+
# matcher.matches? { "foo" } # => false
|
62
|
+
#
|
63
|
+
# @example Regular expressions matcher
|
64
|
+
# matcher = match(/^foo$/) # => Matchi::Matcher::Match.new(/^foo$/)
|
65
|
+
# matcher.matches? { "foo" } # => true
|
66
|
+
# matcher.matches? { "bar" } # => false
|
67
|
+
#
|
68
|
+
# @example Expecting errors matcher
|
69
|
+
# matcher = raise_exception(NameError) # => Matchi::Matcher::RaiseException.new(NameError)
|
70
|
+
# matcher.matches? { Boom } # => true
|
71
|
+
# matcher.matches? { true } # => false
|
72
|
+
#
|
73
|
+
# @example Truth matcher
|
74
|
+
# matcher = be_true # => Matchi::Matcher::BeTrue.new
|
75
|
+
# matcher.matches? { true } # => true
|
76
|
+
# matcher.matches? { false } # => false
|
77
|
+
# matcher.matches? { nil } # => false
|
78
|
+
# matcher.matches? { 4 } # => false
|
79
|
+
#
|
80
|
+
# @example Untruth matcher
|
81
|
+
# matcher = be_false # => Matchi::Matcher::BeFalse.new
|
82
|
+
# matcher.matches? { false } # => true
|
83
|
+
# matcher.matches? { true } # => false
|
84
|
+
# matcher.matches? { nil } # => false
|
85
|
+
# matcher.matches? { 4 } # => false
|
86
|
+
#
|
87
|
+
# @example Nil matcher
|
88
|
+
# matcher = be_nil # => Matchi::Matcher::BeNil.new
|
89
|
+
# matcher.matches? { nil } # => true
|
90
|
+
# matcher.matches? { false } # => false
|
91
|
+
# matcher.matches? { true } # => false
|
92
|
+
# matcher.matches? { 4 } # => false
|
93
|
+
#
|
94
|
+
# @example Type/class matcher
|
95
|
+
# matcher = be_an_instance_of(String) # => Matchi::Matcher::BeAnInstanceOf.new(String)
|
96
|
+
# matcher.matches? { "foo" } # => true
|
97
|
+
# matcher.matches? { 4 } # => false
|
98
|
+
#
|
99
|
+
# @see https://github.com/fixrb/matchi
|
10
100
|
module Spectus
|
11
101
|
include ::Matchi::Helper
|
12
102
|
|
13
103
|
# Expectations are built with this method.
|
14
104
|
#
|
15
105
|
# @example An _absolute requirement_ definition.
|
16
|
-
# it { 42 }.MUST equal 42 # =>
|
106
|
+
# it { 42 }.MUST equal 42 # => Spectus::Result::Pass(actual: 42, error: nil, expected: 42, got: true, matcher: :equal, negate: false, level: :MUST
|
17
107
|
#
|
18
108
|
# @param input [Proc] The code to test.
|
19
109
|
#
|
@@ -22,5 +112,3 @@ module Spectus
|
|
22
112
|
ExpectationTarget.new(&input)
|
23
113
|
end
|
24
114
|
end
|
25
|
-
|
26
|
-
require_relative File.join("spectus", "expectation_target")
|
@@ -1,5 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative File.join("requirement_level", "must")
|
4
|
+
require_relative File.join("requirement_level", "should")
|
5
|
+
require_relative File.join("requirement_level", "may")
|
6
|
+
|
3
7
|
module Spectus
|
4
8
|
# Wraps the target of an expectation.
|
5
9
|
#
|
@@ -196,7 +200,3 @@ module Spectus
|
|
196
200
|
attr_reader :callable
|
197
201
|
end
|
198
202
|
end
|
199
|
-
|
200
|
-
require_relative File.join("requirement_level", "must")
|
201
|
-
require_relative File.join("requirement_level", "should")
|
202
|
-
require_relative File.join("requirement_level", "may")
|
@@ -1,5 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "test_tube"
|
4
|
+
|
5
|
+
require_relative File.join("..", "result")
|
6
|
+
|
3
7
|
module Spectus
|
4
8
|
# Namespace for the requirement levels.
|
5
9
|
module RequirementLevel
|
@@ -9,22 +13,21 @@ module Spectus
|
|
9
13
|
#
|
10
14
|
# @param callable [#call] The callable object to test.
|
11
15
|
# @param isolation [Boolean] Compute actual in isolation?
|
12
|
-
# @param negate [Boolean]
|
16
|
+
# @param negate [Boolean] Invert the matcher or not.
|
13
17
|
# @param matcher [#matches?] The matcher.
|
14
|
-
def initialize(callable:, isolation:,
|
15
|
-
@negate
|
16
|
-
@matcher
|
17
|
-
|
18
|
-
|
19
|
-
callable: callable,
|
18
|
+
def initialize(callable:, isolation:, matcher:, negate:)
|
19
|
+
@negate = negate
|
20
|
+
@matcher = matcher
|
21
|
+
@experiment = ::TestTube.invoke(
|
22
|
+
callable,
|
20
23
|
isolation: isolation,
|
21
|
-
|
22
|
-
|
24
|
+
matcher: matcher,
|
25
|
+
negate: negate
|
23
26
|
)
|
24
27
|
end
|
25
28
|
|
26
|
-
# @return [
|
27
|
-
attr_reader :
|
29
|
+
# @return [TestTube::Base] The experiment.
|
30
|
+
attr_reader :experiment
|
28
31
|
|
29
32
|
# @return [#matches?] The matcher that performed a boolean comparison
|
30
33
|
# between the actual value and the expected value.
|
@@ -32,24 +35,25 @@ module Spectus
|
|
32
35
|
|
33
36
|
# The result of the expectation.
|
34
37
|
#
|
35
|
-
# @raise [Spectus::Result::Fail] The expectation
|
36
|
-
# @return [Spectus::Result::Pass] The expectation
|
38
|
+
# @raise [Spectus::Result::Fail] The expectation failed.
|
39
|
+
# @return [Spectus::Result::Pass] The expectation passed.
|
37
40
|
def call
|
38
41
|
Result.call(pass?).with(
|
39
|
-
actual:
|
40
|
-
error:
|
42
|
+
actual: experiment.actual,
|
43
|
+
error: experiment.error,
|
41
44
|
expected: matcher.expected,
|
42
|
-
got:
|
43
|
-
|
44
|
-
valid: exam.valid?,
|
45
|
+
got: experiment.got,
|
46
|
+
level: level,
|
45
47
|
matcher: matcher.class.to_sym,
|
46
|
-
|
48
|
+
negate: negate?
|
47
49
|
)
|
48
50
|
end
|
49
51
|
|
50
52
|
protected
|
51
53
|
|
52
|
-
#
|
54
|
+
# Some key words for use in RFCs to indicate requirement levels.
|
55
|
+
#
|
56
|
+
# @return [:MUST, :SHOULD, :MAY] The requirement level.
|
53
57
|
def level
|
54
58
|
self.class.name.split("::").fetch(-1).upcase.to_sym
|
55
59
|
end
|
@@ -57,13 +61,10 @@ module Spectus
|
|
57
61
|
# @note The boolean comparison between the actual value and the expected
|
58
62
|
# value can be evaluated to a negative assertion.
|
59
63
|
#
|
60
|
-
# @return [Boolean]
|
64
|
+
# @return [Boolean] Invert the matcher or not.
|
61
65
|
def negate?
|
62
66
|
@negate
|
63
67
|
end
|
64
68
|
end
|
65
69
|
end
|
66
70
|
end
|
67
|
-
|
68
|
-
require_relative File.join("..", "exam")
|
69
|
-
require_relative File.join("..", "result")
|
data/lib/spectus/result.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative File.join("result", "fail")
|
4
|
+
require_relative File.join("result", "pass")
|
5
|
+
|
3
6
|
module Spectus
|
4
7
|
# Namespace for the results.
|
5
8
|
module Result
|
@@ -13,6 +16,3 @@ module Spectus
|
|
13
16
|
end
|
14
17
|
end
|
15
18
|
end
|
16
|
-
|
17
|
-
require_relative File.join("result", "fail")
|
18
|
-
require_relative File.join("result", "pass")
|
data/lib/spectus/result/fail.rb
CHANGED
@@ -5,6 +5,8 @@ require "expresenter/fail"
|
|
5
5
|
module Spectus
|
6
6
|
module Result
|
7
7
|
# The class that is responsible for reporting that the expectation is false.
|
8
|
+
#
|
9
|
+
# @see https://github.com/fixrb/expresenter/blob/v1.2.1/lib/expresenter/fail.rb
|
8
10
|
class Fail < ::Expresenter::Fail
|
9
11
|
end
|
10
12
|
end
|
data/lib/spectus/result/pass.rb
CHANGED
@@ -5,6 +5,8 @@ require "expresenter/pass"
|
|
5
5
|
module Spectus
|
6
6
|
module Result
|
7
7
|
# The class that is responsible for reporting that the expectation is true.
|
8
|
+
#
|
9
|
+
# @see https://github.com/fixrb/expresenter/blob/v1.2.1/lib/expresenter/pass.rb
|
8
10
|
class Pass < ::Expresenter::Pass
|
9
11
|
end
|
10
12
|
end
|
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spectus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.4.0
|
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-
|
11
|
+
date: 2021-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: expresenter
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.3.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.3.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: matchi
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 2.1.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 2.1.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: test_tube
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 1.0.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 1.0.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: brutal
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -187,7 +187,6 @@ files:
|
|
187
187
|
- LICENSE.md
|
188
188
|
- README.md
|
189
189
|
- lib/spectus.rb
|
190
|
-
- lib/spectus/exam.rb
|
191
190
|
- lib/spectus/expectation_target.rb
|
192
191
|
- lib/spectus/requirement_level/base.rb
|
193
192
|
- lib/spectus/requirement_level/may.rb
|
@@ -215,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
215
214
|
- !ruby/object:Gem::Version
|
216
215
|
version: '0'
|
217
216
|
requirements: []
|
218
|
-
rubygems_version: 3.1.
|
217
|
+
rubygems_version: 3.1.6
|
219
218
|
signing_key:
|
220
219
|
specification_version: 4
|
221
220
|
summary: "Expectation library with RFC 2119's requirement levels \U0001F6A5"
|
data/lib/spectus/exam.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "defi"
|
4
|
-
|
5
|
-
module Spectus
|
6
|
-
# This class evaluate the expectation with the passed block.
|
7
|
-
class Exam
|
8
|
-
# Execute the untested code from the passed block against the matcher.
|
9
|
-
#
|
10
|
-
# rubocop:disable Lint/RescueException
|
11
|
-
#
|
12
|
-
# @param callable [#call] The callable object to test.
|
13
|
-
# @param isolation [Boolean] Compute actual in isolation?
|
14
|
-
# @param negate [Boolean] Positive or negative assertion?
|
15
|
-
# @param matcher [#matches?] The matcher.
|
16
|
-
def initialize(callable:, isolation:, negate:, matcher:)
|
17
|
-
@got = negate ^ matcher.matches? do
|
18
|
-
value = if isolation
|
19
|
-
send_call.to!(callable)
|
20
|
-
else
|
21
|
-
send_call.to(callable)
|
22
|
-
end
|
23
|
-
|
24
|
-
@actual = value.object
|
25
|
-
|
26
|
-
value.call
|
27
|
-
end
|
28
|
-
rescue ::Exception => e
|
29
|
-
@actual = nil
|
30
|
-
@exception = e
|
31
|
-
end
|
32
|
-
# rubocop:enable Lint/RescueException
|
33
|
-
|
34
|
-
# @return [#object_id] The actual value.
|
35
|
-
attr_reader :actual
|
36
|
-
|
37
|
-
# @return [Exception, nil] An exception.
|
38
|
-
attr_reader :exception
|
39
|
-
|
40
|
-
# @return [Boolean, nil] Report to the spec requirement level if the
|
41
|
-
# expectation is true or false.
|
42
|
-
attr_reader :got
|
43
|
-
|
44
|
-
# @return [Defi::Challenge] The challenge for the callable object.
|
45
|
-
def send_call
|
46
|
-
::Defi.send(:call)
|
47
|
-
end
|
48
|
-
|
49
|
-
# Report to the spec requirement level if the test pass or fail.
|
50
|
-
#
|
51
|
-
# @return [Boolean] Report if the test pass or fail?
|
52
|
-
def valid?
|
53
|
-
exception.nil? ? got : false
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|