sus 0.1.1 → 0.2.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/lib/sus/be_within.rb +53 -0
- data/lib/sus/expect.rb +2 -50
- data/lib/sus/have_duration.rb +63 -0
- data/lib/sus/progress.rb +6 -6
- data/lib/sus/raise_exception.rb +49 -0
- data/lib/sus/version.rb +1 -1
- data/lib/sus.rb +4 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b8522f7949cf5d7a523ff1e7496b6141bc0d122f9953d73b4ce9b94b8f89d4b
|
4
|
+
data.tar.gz: fdaf10677d1ca3933bc5ccdff4cd9e8ebfd912bc4347fb6db0e20e982e2b7914
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5083ba29bcdfe6e408dce0df6639eb053463af08e23e82fafc9442e2f2b65f90972ac21449885d0b14b2ba6fca25479fb584f624b4f4335bf53e319e39a6483f
|
7
|
+
data.tar.gz: 8ad0800f437d7e76496fdce3b9407bec4d8e0bc57700e45c3d3df3bcf3708965080bf080f128ac4c72811a84363304f2ac282ad1328b0fb1f6be387dda50cfff
|
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
module Sus
|
3
|
+
class BeWithin
|
4
|
+
class Bounded
|
5
|
+
def initialize(range)
|
6
|
+
@range = range
|
7
|
+
end
|
8
|
+
|
9
|
+
def print(output)
|
10
|
+
output.write("be within ", :variable, @range)
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(assertions, subject)
|
14
|
+
assertions.nested(self) do |assertions|
|
15
|
+
assertions.assert(@range.include?(subject), self)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(tolerance)
|
21
|
+
@tolerance = tolerance
|
22
|
+
end
|
23
|
+
|
24
|
+
def of(value)
|
25
|
+
Bounded.new(Range.new(value - @tolerance, value + @tolerance))
|
26
|
+
end
|
27
|
+
|
28
|
+
def percent_of(value)
|
29
|
+
of(value * Rational(@tolerance, 100))
|
30
|
+
end
|
31
|
+
|
32
|
+
def print(output)
|
33
|
+
output.write("be within ", :variable, @tolerance)
|
34
|
+
end
|
35
|
+
|
36
|
+
def call(assertions, subject)
|
37
|
+
assertions.nested(self) do |assertions|
|
38
|
+
assertions.assert(subject < @tolerance, self)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Base
|
44
|
+
def be_within(value)
|
45
|
+
case value
|
46
|
+
when Range
|
47
|
+
BeWithin::Bounded.new(value)
|
48
|
+
else
|
49
|
+
BeWithin.new(value)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/sus/expect.rb
CHANGED
@@ -30,59 +30,11 @@ module Sus
|
|
30
30
|
|
31
31
|
return self
|
32
32
|
end
|
33
|
-
|
34
|
-
def to_throw(...)
|
35
|
-
predicate = ThrowException.new(...)
|
36
|
-
|
37
|
-
@assertions.nested(self, inverted: @inverted) do |assertions|
|
38
|
-
predicate.call(assertions, @subject)
|
39
|
-
end
|
40
|
-
|
41
|
-
return self
|
42
|
-
end
|
43
33
|
end
|
44
34
|
|
45
35
|
class Base
|
46
|
-
def expect(subject)
|
47
|
-
Expect.new(@assertions, subject)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class ThrowException
|
52
|
-
def initialize(exception_class, message = nil)
|
53
|
-
@exception_class = exception_class
|
54
|
-
@message = message
|
55
|
-
end
|
56
|
-
|
57
|
-
def call(assertions, value)
|
58
|
-
assertions.nested(self) do |assertions|
|
59
|
-
begin
|
60
|
-
value.call
|
61
|
-
|
62
|
-
# Didn't throw any exception, so the expectation failed:
|
63
|
-
assertions.assert(false, self)
|
64
|
-
rescue => exception
|
65
|
-
# Did we throw the right kind of exception?
|
66
|
-
if exception.is_a?(@exception_class)
|
67
|
-
# Did it have the right message?
|
68
|
-
if @message
|
69
|
-
assertions.assert(@message === exception.message)
|
70
|
-
else
|
71
|
-
assertions.assert(true, self)
|
72
|
-
end
|
73
|
-
else
|
74
|
-
raise
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def print(output)
|
81
|
-
output << "throw exception " << output.style(@exception_class, :variable)
|
82
|
-
|
83
|
-
if @message
|
84
|
-
output << "with message " << output.style(@message, :variable)
|
85
|
-
end
|
36
|
+
def expect(subject = nil, &block)
|
37
|
+
Expect.new(@assertions, subject || block)
|
86
38
|
end
|
87
39
|
end
|
88
40
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
|
2
|
+
module Sus
|
3
|
+
class HaveDuration
|
4
|
+
def initialize(predicate)
|
5
|
+
@predicate = predicate
|
6
|
+
end
|
7
|
+
|
8
|
+
def print(output)
|
9
|
+
output.write("have duration ")
|
10
|
+
@predicate.print(output)
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(assertions, subject)
|
14
|
+
assertions.nested(self) do |assertions|
|
15
|
+
duration = measure(subject)
|
16
|
+
|
17
|
+
@predicate.call(assertions, duration)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class << self
|
22
|
+
def < duration
|
23
|
+
new(Be < duration)
|
24
|
+
end
|
25
|
+
|
26
|
+
def <= duration
|
27
|
+
new(Be <= duration)
|
28
|
+
end
|
29
|
+
|
30
|
+
def > duration
|
31
|
+
new(Be > duration)
|
32
|
+
end
|
33
|
+
|
34
|
+
def >= duration
|
35
|
+
new(Be >= duration)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def measure(subject)
|
42
|
+
start_time = now
|
43
|
+
|
44
|
+
subject.call
|
45
|
+
|
46
|
+
return now - start_time
|
47
|
+
end
|
48
|
+
|
49
|
+
def now
|
50
|
+
::Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class Base
|
55
|
+
def have_duration(*arguments)
|
56
|
+
if arguments.any?
|
57
|
+
HaveDuration.new(be_within(*arguments))
|
58
|
+
else
|
59
|
+
HaveDuration
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/sus/progress.rb
CHANGED
@@ -78,8 +78,8 @@ module Sus
|
|
78
78
|
def increment(amount = 1)
|
79
79
|
@current += amount
|
80
80
|
|
81
|
-
@bar
|
82
|
-
@lines
|
81
|
+
@bar&.update(@current, @total, self.to_s)
|
82
|
+
@lines&.redraw(0)
|
83
83
|
|
84
84
|
return self
|
85
85
|
end
|
@@ -88,20 +88,20 @@ module Sus
|
|
88
88
|
def expand(amount = 1)
|
89
89
|
@total += amount
|
90
90
|
|
91
|
-
@bar
|
92
|
-
@lines
|
91
|
+
@bar&.update(@current, @total, self.to_s)
|
92
|
+
@lines&.redraw(0)
|
93
93
|
|
94
94
|
return self
|
95
95
|
end
|
96
96
|
|
97
97
|
def report(index, context, state)
|
98
|
-
@lines[index+1
|
98
|
+
@lines&.[]=(index+1, Output::Status.new(state, context))
|
99
99
|
|
100
100
|
return self
|
101
101
|
end
|
102
102
|
|
103
103
|
def clear
|
104
|
-
@lines
|
104
|
+
@lines&.clear
|
105
105
|
end
|
106
106
|
|
107
107
|
def to_s
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Sus
|
2
|
+
class RaiseException
|
3
|
+
def initialize(exception_class = nil, message: nil)
|
4
|
+
@exception_class = exception_class
|
5
|
+
@message = message
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(assertions, subject)
|
9
|
+
assertions.nested(self) do |assertions|
|
10
|
+
begin
|
11
|
+
subject.call
|
12
|
+
|
13
|
+
# Didn't throw any exception, so the expectation failed:
|
14
|
+
assertions.assert(false, self)
|
15
|
+
rescue => exception
|
16
|
+
# Did we throw the right kind of exception?
|
17
|
+
if exception.is_a?(@exception_class)
|
18
|
+
# Did it have the right message?
|
19
|
+
if @message
|
20
|
+
assertions.assert(@message === exception.message)
|
21
|
+
else
|
22
|
+
assertions.assert(true, self)
|
23
|
+
end
|
24
|
+
else
|
25
|
+
raise
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def print(output)
|
32
|
+
output.write("raise exception")
|
33
|
+
|
34
|
+
if @exception_class
|
35
|
+
output.write(" ", :variable, @exception_class, :reset)
|
36
|
+
end
|
37
|
+
|
38
|
+
if @message
|
39
|
+
output.write(" with message ", :variable, @message, :reset)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Base
|
45
|
+
def raise_exception(...)
|
46
|
+
RaiseException.new(...)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/sus/version.rb
CHANGED
data/lib/sus.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-12-
|
11
|
+
date: 2021-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -23,10 +23,12 @@ files:
|
|
23
23
|
- lib/sus/assertions.rb
|
24
24
|
- lib/sus/base.rb
|
25
25
|
- lib/sus/be.rb
|
26
|
+
- lib/sus/be_within.rb
|
26
27
|
- lib/sus/context.rb
|
27
28
|
- lib/sus/describe.rb
|
28
29
|
- lib/sus/expect.rb
|
29
30
|
- lib/sus/filter.rb
|
31
|
+
- lib/sus/have_duration.rb
|
30
32
|
- lib/sus/identity.rb
|
31
33
|
- lib/sus/include_context.rb
|
32
34
|
- lib/sus/it.rb
|
@@ -41,6 +43,7 @@ files:
|
|
41
43
|
- lib/sus/output/text.rb
|
42
44
|
- lib/sus/output/xterm.rb
|
43
45
|
- lib/sus/progress.rb
|
46
|
+
- lib/sus/raise_exception.rb
|
44
47
|
- lib/sus/registry.rb
|
45
48
|
- lib/sus/shared.rb
|
46
49
|
- lib/sus/version.rb
|
@@ -65,7 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
68
|
- !ruby/object:Gem::Version
|
66
69
|
version: '0'
|
67
70
|
requirements: []
|
68
|
-
rubygems_version: 3.
|
71
|
+
rubygems_version: 3.3.0.dev
|
69
72
|
signing_key:
|
70
73
|
specification_version: 4
|
71
74
|
summary: A fast and scalable test runner.
|