spectus 2.0.3 → 2.1.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 +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +12 -0
- data/README.md +51 -11
- data/Rakefile +0 -1
- data/VERSION.semver +1 -1
- data/lib/spectus.rb +3 -3
- data/lib/spectus/challenge.rb +22 -0
- data/lib/spectus/expectation_target.rb +35 -39
- data/lib/spectus/level/base.rb +72 -0
- data/lib/spectus/level/high.rb +25 -0
- data/lib/spectus/level/low.rb +25 -0
- data/lib/spectus/level/medium.rb +25 -0
- data/lib/spectus/result/base.rb +83 -0
- data/lib/spectus/result/fail.rb +28 -0
- data/lib/spectus/result/pass.rb +30 -0
- data/lib/spectus/sandbox.rb +24 -8
- data/spectus.gemspec +10 -10
- data/test/support/coverage.rb +3 -0
- data/test/test_high_fail.rb +140 -0
- data/test/test_high_pass.rb +44 -0
- data/test/test_low_fail.rb +51 -0
- data/test/test_low_pass.rb +47 -0
- data/test/test_medium_fail.rb +50 -0
- data/test/test_medium_pass.rb +82 -0
- metadata +72 -89
- metadata.gz.sig +0 -0
- data/lib/spectus/matcher.rb +0 -20
- data/lib/spectus/requirement.rb +0 -29
- data/lib/spectus/requirement_level/high.rb +0 -16
- data/lib/spectus/requirement_level/low.rb +0 -22
- data/lib/spectus/requirement_level/medium.rb +0 -22
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Spectus
|
4
|
+
module RequirementLevel
|
5
|
+
# Medium requirement level's class.
|
6
|
+
#
|
7
|
+
# @api private
|
8
|
+
#
|
9
|
+
class Medium < Base
|
10
|
+
# Evaluate the expectation.
|
11
|
+
#
|
12
|
+
# @return [Result::Fail, Result::Pass] report if the medium expectation
|
13
|
+
# pass or fail.
|
14
|
+
def result
|
15
|
+
state = sandbox
|
16
|
+
|
17
|
+
if state.valid? || state.exception.nil?
|
18
|
+
pass!(state)
|
19
|
+
else
|
20
|
+
fail!(state)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Spectus
|
2
|
+
module Result
|
3
|
+
# Result base's module.
|
4
|
+
#
|
5
|
+
# @api public
|
6
|
+
#
|
7
|
+
module Base
|
8
|
+
# Initialize the result class.
|
9
|
+
#
|
10
|
+
# @param message [String] It is describing the actual/error value.
|
11
|
+
# @param subject [#object_id] The untrusted object to be tested.
|
12
|
+
# @param challenge [Symbol] The method to call on the subject.
|
13
|
+
# @param context [Array] Parameters of the challenge.
|
14
|
+
# @param actual [#object_id] The value that the subject return through
|
15
|
+
# its challenge.
|
16
|
+
# @param expected [Array, Hash, Symbol] The definition of the expected
|
17
|
+
# value.
|
18
|
+
# @param got [#object_id] The result of the boolean comparison
|
19
|
+
# between the actual value and the expected value.
|
20
|
+
# @param error [#exception, nil] Any possible raised exception.
|
21
|
+
# @param level [:High, :Medium, :Low] The level of the expectation.
|
22
|
+
# @param negate [Boolean] Evaluate to a negative assertion.
|
23
|
+
# @param valid [Boolean] Report if the test was true or false.
|
24
|
+
def initialize(message, subject, challenge, context, actual, expected,
|
25
|
+
got, error, level, negate, valid)
|
26
|
+
|
27
|
+
if respond_to?(:exception)
|
28
|
+
super(message)
|
29
|
+
else
|
30
|
+
@message = message
|
31
|
+
end
|
32
|
+
|
33
|
+
@subject = subject
|
34
|
+
@challenge = challenge
|
35
|
+
@context = context
|
36
|
+
@actual = actual
|
37
|
+
@expected = expected
|
38
|
+
@got = got
|
39
|
+
@error = error
|
40
|
+
@level = level
|
41
|
+
@negate = negate
|
42
|
+
@valid = valid
|
43
|
+
end
|
44
|
+
|
45
|
+
attr_reader :subject, :challenge, :context, :actual, :expected, :got,
|
46
|
+
:error, :level
|
47
|
+
|
48
|
+
# The value of the negate instance variable.
|
49
|
+
#
|
50
|
+
# @return [Boolean] evaluated to a negative assertion or not.
|
51
|
+
def negate?
|
52
|
+
@negate
|
53
|
+
end
|
54
|
+
|
55
|
+
# The value of the boolean comparison between the actual value and the
|
56
|
+
# expected value.
|
57
|
+
#
|
58
|
+
# @return [Boolean] the test was true or false.
|
59
|
+
def valid?
|
60
|
+
@valid
|
61
|
+
end
|
62
|
+
|
63
|
+
# Report the result.
|
64
|
+
#
|
65
|
+
# @return [Symbol] the properties of the result.
|
66
|
+
def to_h
|
67
|
+
{
|
68
|
+
subject: subject,
|
69
|
+
challenge: challenge,
|
70
|
+
context: context,
|
71
|
+
actual: actual,
|
72
|
+
expected: expected,
|
73
|
+
got: got,
|
74
|
+
error: error,
|
75
|
+
level: level,
|
76
|
+
negate: negate?,
|
77
|
+
valid: valid?,
|
78
|
+
result: result?
|
79
|
+
}
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Spectus
|
4
|
+
module Result
|
5
|
+
# The class that is responsible for reporting that the expectation is false.
|
6
|
+
class Fail < StandardError
|
7
|
+
include Base
|
8
|
+
|
9
|
+
# The value of the expectation of the spec.
|
10
|
+
#
|
11
|
+
# @return [Boolean] the spec was false.
|
12
|
+
def result?
|
13
|
+
false
|
14
|
+
end
|
15
|
+
|
16
|
+
# Identify the state of the result.
|
17
|
+
#
|
18
|
+
# @return [String] the char that identify the state of the result.
|
19
|
+
def to_char
|
20
|
+
if error.nil?
|
21
|
+
'F'
|
22
|
+
else
|
23
|
+
'E'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Spectus
|
4
|
+
module Result
|
5
|
+
# The class that is responsible for reporting that the expectation is true.
|
6
|
+
class Pass
|
7
|
+
include Base
|
8
|
+
|
9
|
+
attr_reader :message
|
10
|
+
|
11
|
+
# The value of the expectation of the spec.
|
12
|
+
#
|
13
|
+
# @return [Boolean] the spec was true.
|
14
|
+
def result?
|
15
|
+
true
|
16
|
+
end
|
17
|
+
|
18
|
+
# Identify the state of the result.
|
19
|
+
#
|
20
|
+
# @return [String] the char that identify the state of the result.
|
21
|
+
def to_char
|
22
|
+
if got
|
23
|
+
'.'
|
24
|
+
else
|
25
|
+
'I'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/spectus/sandbox.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require 'matchi'
|
2
2
|
|
3
3
|
module Spectus
|
4
4
|
# This class evaluate the expectation with the passed block.
|
@@ -6,28 +6,44 @@ module Spectus
|
|
6
6
|
# @api private
|
7
7
|
#
|
8
8
|
class Sandbox
|
9
|
-
attr_reader :exception, :got
|
9
|
+
attr_reader :actual, :exception, :got
|
10
10
|
|
11
11
|
# Execute the untested code from the passed block against the definition.
|
12
12
|
#
|
13
|
-
# @param [Hash] definition
|
13
|
+
# @param [Array, Hash, Symbol] definition
|
14
14
|
# @param [Boolean] negate
|
15
|
-
# @
|
16
|
-
|
17
|
-
|
15
|
+
# @param [#object_id] object the front object which is challenged.
|
16
|
+
# @param [Symbol] meth the name of the method.
|
17
|
+
# @param [Array] args the arguments of the method.
|
18
|
+
def initialize(definition, negate, object, meth, *args)
|
19
|
+
@got = negate ^ matcher(definition).matches? do
|
20
|
+
@actual = object.public_send(meth, *args)
|
21
|
+
end
|
18
22
|
rescue => e
|
19
23
|
@exception = e
|
20
24
|
end
|
21
25
|
|
22
|
-
#
|
26
|
+
# Report to the spec's requirement level if the test is true or false.
|
23
27
|
#
|
24
28
|
# @return [Boolean] Report if the test was true or false.
|
25
|
-
def
|
29
|
+
def valid?
|
26
30
|
if defined?(@exception)
|
27
31
|
false
|
28
32
|
else
|
29
33
|
@got
|
30
34
|
end
|
31
35
|
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
# Load the matcher.
|
40
|
+
#
|
41
|
+
# @param definition [Array, Hash, Symbol]
|
42
|
+
#
|
43
|
+
# @return [#matches?] the matcher
|
44
|
+
def matcher(definition)
|
45
|
+
params = Array(definition).flatten(1)
|
46
|
+
Matchi.fetch(params.first, *params[1..-1])
|
47
|
+
end
|
32
48
|
end
|
33
49
|
end
|
data/spectus.gemspec
CHANGED
@@ -4,23 +4,23 @@ Gem::Specification.new do |spec|
|
|
4
4
|
spec.authors = ['Cyril Wack']
|
5
5
|
spec.email = ['contact@cyril.email']
|
6
6
|
|
7
|
-
spec.summary = 'Expectation library with
|
8
|
-
spec.description =
|
9
|
-
'levels, and some matchers for Ruby.'
|
7
|
+
spec.summary = 'Expectation library with RFC 2119 keywords.'
|
8
|
+
spec.description = "Expectation library with RFC 2119's requirement levels."
|
10
9
|
spec.homepage = 'https://github.com/fixrb/spectus'
|
11
10
|
spec.license = 'MIT'
|
12
11
|
|
13
|
-
spec.files
|
14
|
-
|
12
|
+
spec.files =
|
13
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(/%r{^test}/) }
|
14
|
+
spec.executables = spec.files.grep(/%r{^exe}/) { |f| File.basename(f) }
|
15
15
|
spec.require_paths = ['lib']
|
16
16
|
|
17
|
-
spec.add_dependency 'matchi', '~> 0.0.
|
17
|
+
spec.add_dependency 'matchi', '~> 0.0.6'
|
18
18
|
|
19
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
20
|
-
spec.add_development_dependency 'rake', '~> 10.
|
19
|
+
spec.add_development_dependency 'bundler', '~> 1.9'
|
20
|
+
spec.add_development_dependency 'rake', '~> 10.4'
|
21
21
|
spec.add_development_dependency 'yard', '~> 0.8'
|
22
|
-
spec.add_development_dependency 'simplecov', '~> 0.
|
23
|
-
spec.add_development_dependency 'rubocop', '~> 0.
|
22
|
+
spec.add_development_dependency 'simplecov', '~> 0.10'
|
23
|
+
spec.add_development_dependency 'rubocop', '~> 0.31'
|
24
24
|
|
25
25
|
private_key = File.expand_path '~/.gem/spectus-gem-private_key.pem'
|
26
26
|
if File.exist? private_key
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require_relative File.join 'support', 'coverage'
|
2
|
+
require_relative File.join '..', 'lib', 'spectus'
|
3
|
+
|
4
|
+
subject = -> { 'foo'.upcase }
|
5
|
+
|
6
|
+
begin
|
7
|
+
Spectus.this(&subject).MUST(Eql: 'foo')
|
8
|
+
rescue Spectus::Result::Fail => raised_result
|
9
|
+
raise 'failing test' unless raised_result.to_char == 'F'
|
10
|
+
raise 'failing test' unless raised_result.to_h == {
|
11
|
+
subject: subject,
|
12
|
+
challenge: :call,
|
13
|
+
context: [],
|
14
|
+
actual: 'FOO',
|
15
|
+
expected: { Eql: 'foo' },
|
16
|
+
got: false,
|
17
|
+
error: nil,
|
18
|
+
level: :High,
|
19
|
+
negate: false,
|
20
|
+
valid: false,
|
21
|
+
result: false
|
22
|
+
}
|
23
|
+
|
24
|
+
print '.'
|
25
|
+
end
|
26
|
+
|
27
|
+
begin
|
28
|
+
Spectus.this(&subject).MUST_NOT(Eql: 'FOO')
|
29
|
+
rescue Spectus::Result::Fail => raised_result
|
30
|
+
raise 'failing test' unless raised_result.to_char == 'F'
|
31
|
+
raise 'failing test' unless raised_result.to_h == {
|
32
|
+
subject: subject,
|
33
|
+
challenge: :call,
|
34
|
+
context: [],
|
35
|
+
actual: 'FOO',
|
36
|
+
expected: { Eql: 'FOO' },
|
37
|
+
got: false,
|
38
|
+
error: nil,
|
39
|
+
level: :High,
|
40
|
+
negate: true,
|
41
|
+
valid: false,
|
42
|
+
result: false
|
43
|
+
}
|
44
|
+
|
45
|
+
print '.'
|
46
|
+
end
|
47
|
+
|
48
|
+
subject = -> { 'foo'.bar }
|
49
|
+
|
50
|
+
begin
|
51
|
+
Spectus.this(&subject).MUST(Eql: 'foo')
|
52
|
+
rescue Spectus::Result::Fail => raised_result
|
53
|
+
raise 'failing test' unless raised_result.error.class == NoMethodError
|
54
|
+
raise 'failing test' unless raised_result.to_char == 'E'
|
55
|
+
raise 'failing test' unless raised_result.to_h == {
|
56
|
+
subject: subject,
|
57
|
+
challenge: :call,
|
58
|
+
context: [],
|
59
|
+
actual: nil,
|
60
|
+
expected: { Eql: 'foo' },
|
61
|
+
got: nil,
|
62
|
+
error: raised_result.error,
|
63
|
+
level: :High,
|
64
|
+
negate: false,
|
65
|
+
valid: false,
|
66
|
+
result: false
|
67
|
+
}
|
68
|
+
|
69
|
+
print '.'
|
70
|
+
end
|
71
|
+
|
72
|
+
begin
|
73
|
+
Spectus.this(&subject).MUST_NOT(Eql: 'foo')
|
74
|
+
rescue Spectus::Result::Fail => raised_result
|
75
|
+
raise 'failing test' unless raised_result.error.class == NoMethodError
|
76
|
+
raise 'failing test' unless raised_result.to_char == 'E'
|
77
|
+
raise 'failing test' unless raised_result.to_h == {
|
78
|
+
subject: subject,
|
79
|
+
challenge: :call,
|
80
|
+
context: [],
|
81
|
+
actual: nil,
|
82
|
+
expected: { Eql: 'foo' },
|
83
|
+
got: nil,
|
84
|
+
error: raised_result.error,
|
85
|
+
level: :High,
|
86
|
+
negate: true,
|
87
|
+
valid: false,
|
88
|
+
result: false
|
89
|
+
}
|
90
|
+
|
91
|
+
print '.'
|
92
|
+
end
|
93
|
+
|
94
|
+
subject = -> { 'foo'.upcase(:bar) }
|
95
|
+
|
96
|
+
begin
|
97
|
+
Spectus.this(&subject).MUST(Eql: 'foo')
|
98
|
+
rescue Spectus::Result::Fail => raised_result
|
99
|
+
raise 'failing test' unless raised_result.error.class == ArgumentError
|
100
|
+
raise 'failing test' unless raised_result.to_char == 'E'
|
101
|
+
raise 'failing test' unless raised_result.to_h == {
|
102
|
+
subject: subject,
|
103
|
+
challenge: :call,
|
104
|
+
context: [],
|
105
|
+
actual: nil,
|
106
|
+
expected: { Eql: 'foo' },
|
107
|
+
got: nil,
|
108
|
+
error: raised_result.error,
|
109
|
+
level: :High,
|
110
|
+
negate: false,
|
111
|
+
valid: false,
|
112
|
+
result: false
|
113
|
+
}
|
114
|
+
|
115
|
+
print '.'
|
116
|
+
end
|
117
|
+
|
118
|
+
begin
|
119
|
+
Spectus.this(&subject).MUST_NOT(Eql: 'foo')
|
120
|
+
rescue Spectus::Result::Fail => raised_result
|
121
|
+
raise 'failing test' unless raised_result.error.class == ArgumentError
|
122
|
+
raise 'failing test' unless raised_result.to_char == 'E'
|
123
|
+
raise 'failing test' unless raised_result.to_h == {
|
124
|
+
subject: subject,
|
125
|
+
challenge: :call,
|
126
|
+
context: [],
|
127
|
+
actual: nil,
|
128
|
+
expected: { Eql: 'foo' },
|
129
|
+
got: nil,
|
130
|
+
error: raised_result.error,
|
131
|
+
level: :High,
|
132
|
+
negate: true,
|
133
|
+
valid: false,
|
134
|
+
result: false
|
135
|
+
}
|
136
|
+
|
137
|
+
print '.'
|
138
|
+
end
|
139
|
+
|
140
|
+
puts
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative File.join 'support', 'coverage'
|
2
|
+
require_relative File.join '..', 'lib', 'spectus'
|
3
|
+
|
4
|
+
subject = -> { 'foo'.upcase }
|
5
|
+
|
6
|
+
result = Spectus.this(&subject).MUST(Eql: 'FOO')
|
7
|
+
|
8
|
+
fail 'failing test' unless result.to_char == '.'
|
9
|
+
fail 'failing test' unless result.to_h == {
|
10
|
+
subject: subject,
|
11
|
+
challenge: :call,
|
12
|
+
context: [],
|
13
|
+
actual: 'FOO',
|
14
|
+
expected: { Eql: 'FOO' },
|
15
|
+
got: true,
|
16
|
+
error: nil,
|
17
|
+
level: :High,
|
18
|
+
negate: false,
|
19
|
+
valid: true,
|
20
|
+
result: true
|
21
|
+
}
|
22
|
+
|
23
|
+
print '.'
|
24
|
+
|
25
|
+
result = Spectus.this(&subject).MUST_NOT(Eql: 'foo')
|
26
|
+
|
27
|
+
fail 'failing test' unless result.to_char == '.'
|
28
|
+
fail 'failing test' unless result.to_h == {
|
29
|
+
subject: subject,
|
30
|
+
challenge: :call,
|
31
|
+
context: [],
|
32
|
+
actual: 'FOO',
|
33
|
+
expected: { Eql: 'foo' },
|
34
|
+
got: true,
|
35
|
+
error: nil,
|
36
|
+
level: :High,
|
37
|
+
negate: true,
|
38
|
+
valid: true,
|
39
|
+
result: true
|
40
|
+
}
|
41
|
+
|
42
|
+
print '.'
|
43
|
+
|
44
|
+
puts
|