assay 0.3.0 → 0.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.
- data/.ruby +46 -41
- data/COPYING.rdoc +38 -0
- data/HISTORY.rdoc +18 -1
- data/QED.rdoc +1100 -0
- data/README.rdoc +139 -16
- data/lib/assay.rb +82 -29
- data/lib/assay.yml +46 -41
- data/lib/assay/{adapters → adapter}/minitest.rb +0 -0
- data/lib/assay/{adapters → adapter}/testunit.rb +0 -0
- data/lib/assay/assertable.rb +174 -0
- data/lib/assay/assertion.rb +98 -124
- data/lib/assay/assertor.rb +187 -0
- data/lib/assay/boolean_assay.rb +15 -0
- data/lib/assay/case_assay.rb +17 -0
- data/lib/assay/compare_assay.rb +38 -0
- data/lib/assay/core_ext/kernel.rb +52 -0
- data/lib/assay/core_ext/na.rb +9 -0
- data/lib/assay/directory_assay.rb +20 -0
- data/lib/assay/empty_assay.rb +17 -0
- data/lib/assay/equal_assay.rb +35 -0
- data/lib/assay/equality_assay.rb +18 -0
- data/lib/assay/execution_assay.rb +59 -0
- data/lib/assay/false_assay.rb +17 -0
- data/lib/assay/file_assay.rb +17 -0
- data/lib/assay/identity_assay.rb +49 -0
- data/lib/assay/include_assay.rb +17 -0
- data/lib/assay/instance_assay.rb +17 -0
- data/lib/assay/kind_assay.rb +18 -0
- data/lib/assay/less_assay.rb +18 -0
- data/lib/assay/less_equal_assay.rb +25 -0
- data/lib/assay/like_assay.rb +17 -0
- data/lib/assay/match_assay.rb +17 -0
- data/lib/assay/more_assay.rb +18 -0
- data/lib/assay/more_equal_assay.rb +25 -0
- data/lib/assay/nil_assay.rb +15 -0
- data/lib/assay/nomatch_assay.rb +17 -0
- data/lib/assay/output_assay.rb +35 -0
- data/lib/assay/path_assay.rb +17 -0
- data/lib/assay/raise_assay.rb +109 -0
- data/lib/assay/rescue_assay.rb +55 -0
- data/lib/assay/respond_assay.rb +17 -0
- data/lib/assay/return_assay.rb +46 -0
- data/lib/assay/silent_assay.rb +59 -0
- data/lib/assay/stderr_assay.rb +30 -0
- data/lib/assay/stdout_assay.rb +30 -0
- data/lib/assay/throw_assay.rb +89 -0
- data/lib/assay/true_assay.rb +20 -0
- data/lib/assay/unequal_assay.rb +37 -0
- data/lib/assay/within_assay.rb +39 -0
- data/test/case_compare_assay.rb +59 -0
- data/test/case_empty_assay.rb +51 -0
- data/test/case_equal_assay.rb +53 -0
- data/test/case_equality_assay.rb +55 -0
- data/test/case_false_assay.rb +48 -0
- data/test/case_identity_assay.rb +51 -0
- data/test/case_include_assay.rb +51 -0
- data/test/case_instance_assay.rb +51 -0
- data/test/case_kind_assay.rb +51 -0
- data/test/case_less_assay.rb +53 -0
- data/test/case_less_equal_assay.rb +53 -0
- data/test/case_like_assay.rb +57 -0
- data/test/case_match_assay.rb +45 -0
- data/test/case_more_assay.rb +53 -0
- data/test/case_more_equal_assay.rb +53 -0
- data/test/case_nil_assay.rb +48 -0
- data/test/case_nomatch_assay.rb +47 -0
- data/test/case_raise_assay.rb +51 -0
- data/test/case_respond_assay.rb +51 -0
- data/test/case_throw_assay.rb +51 -0
- data/test/case_true_assay.rb +48 -0
- data/test/case_unequal_assay.rb +55 -0
- data/test/case_within_assay.rb +61 -0
- data/test/helper.rb +36 -0
- metadata +135 -108
- data/APACHE2.txt +0 -205
- data/NOTICE.rdoc +0 -18
- data/lib/assay/assertions/compare_failure.rb +0 -61
- data/lib/assay/assertions/delta_failure.rb +0 -80
- data/lib/assay/assertions/empty_failure.rb +0 -76
- data/lib/assay/assertions/equality_failure.rb +0 -100
- data/lib/assay/assertions/execution_failure.rb +0 -90
- data/lib/assay/assertions/false_failure.rb +0 -72
- data/lib/assay/assertions/identity_failure.rb +0 -85
- data/lib/assay/assertions/instance_failure.rb +0 -76
- data/lib/assay/assertions/kind_failure.rb +0 -80
- data/lib/assay/assertions/match_failure.rb +0 -85
- data/lib/assay/assertions/nil_failure.rb +0 -75
- data/lib/assay/assertions/raise_failure.rb +0 -134
- data/lib/assay/assertions/response_failure.rb +0 -86
- data/lib/assay/assertions/same_failure.rb +0 -82
- data/lib/assay/assertions/throw_failure.rb +0 -122
- data/lib/assay/assertions/true_failure.rb +0 -79
- data/lib/assay/matcher.rb +0 -48
- data/qed/01_failure_classes.rdoc +0 -75
- data/qed/02_assertives.rdoc +0 -118
- data/qed/03_matchers.rdoc +0 -118
- data/qed/04_lookup.rdoc +0 -10
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative 'output_assay'
|
2
|
+
|
3
|
+
# Assert that there is output $stderr.
|
4
|
+
#
|
5
|
+
# StderrAssay.pass?(/foo/){ $stderr.puts 'foo!' } #=> true
|
6
|
+
#
|
7
|
+
class StderrAssay < OutputAssay
|
8
|
+
|
9
|
+
register :stderr
|
10
|
+
|
11
|
+
#
|
12
|
+
# Check assertion via `#===` method.
|
13
|
+
#
|
14
|
+
def self.pass?(match, &block)
|
15
|
+
require 'stringio'
|
16
|
+
|
17
|
+
begin
|
18
|
+
stderr = $stderr
|
19
|
+
newerr = StringIO.new
|
20
|
+
$stderr = newerr
|
21
|
+
yield
|
22
|
+
ensure
|
23
|
+
$stderr = stderr
|
24
|
+
end
|
25
|
+
|
26
|
+
match === newerr.string.chomp("\n")
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative 'output_assay'
|
2
|
+
|
3
|
+
# Assert that there is output, either from stdout or stderr.
|
4
|
+
#
|
5
|
+
# StdoutAssay.pass?(/foo/){ puts 'foo!' } #=> true
|
6
|
+
#
|
7
|
+
class StdoutAssay < OutputAssay
|
8
|
+
|
9
|
+
register :output
|
10
|
+
|
11
|
+
#
|
12
|
+
# Check assertion via `#===` method.
|
13
|
+
#
|
14
|
+
def self.pass?(match, &block)
|
15
|
+
require 'stringio'
|
16
|
+
|
17
|
+
begin
|
18
|
+
stdout = $stdout
|
19
|
+
newout = StringIO.new
|
20
|
+
$stdout = newout
|
21
|
+
yield
|
22
|
+
ensure
|
23
|
+
$stdout = stdout
|
24
|
+
end
|
25
|
+
|
26
|
+
match === newout.string.chomp("\n")
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require_relative 'execution_assay'
|
2
|
+
|
3
|
+
# Assertion for catching specific throws.
|
4
|
+
#
|
5
|
+
class ThrowAssay < ExecutionAssay
|
6
|
+
|
7
|
+
register :throw
|
8
|
+
|
9
|
+
# TODO: Is it possible to catch _any_ type of throw? If so make the
|
10
|
+
# argument optional for that.
|
11
|
+
|
12
|
+
# Passes if the block throws given symbol.
|
13
|
+
#
|
14
|
+
# ThrowAssay.pass? :done do
|
15
|
+
# throw :done
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# If no symbol is given than passes if any is thrown.
|
19
|
+
# But note that in `#assert!`, the symbol must be `nil`
|
20
|
+
# rather than not given.
|
21
|
+
#
|
22
|
+
def self.pass?(symbol=nil) #:yield:
|
23
|
+
pass = true
|
24
|
+
if symbol
|
25
|
+
catch(symbol) do
|
26
|
+
begin
|
27
|
+
yield
|
28
|
+
rescue ArgumentError => err # 1.9 exception
|
29
|
+
#msg += ", not #{err.message.split(/ /).last}"
|
30
|
+
rescue NameError => err # 1.8 exception
|
31
|
+
#msg += ", not #{err.name.inspect}"
|
32
|
+
end
|
33
|
+
pass = false
|
34
|
+
end
|
35
|
+
else
|
36
|
+
begin
|
37
|
+
yield
|
38
|
+
pass = false
|
39
|
+
rescue ArgumentError => error
|
40
|
+
pass = false if /\Auncaught throw (.+)\z/ !~ error.message
|
41
|
+
end
|
42
|
+
end
|
43
|
+
pass
|
44
|
+
end
|
45
|
+
|
46
|
+
# Passes if the block does not throw given +symbol+.
|
47
|
+
#
|
48
|
+
# ThrowAssay.fail? :done do
|
49
|
+
# throw :chimp
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# If no symbol is given then passes if nothing is thrown.
|
53
|
+
# But note that in `#refute!`, the symbol must be `nil`
|
54
|
+
# rather than not given.
|
55
|
+
#
|
56
|
+
def self.fail?(symbol=nil) #:yield:
|
57
|
+
if symbol
|
58
|
+
pass = false
|
59
|
+
catch(symbol) do
|
60
|
+
begin
|
61
|
+
yield
|
62
|
+
rescue ArgumentError => err # 1.9 exception
|
63
|
+
#msg += ", not #{err.message.split(/ /).last}"
|
64
|
+
rescue NameError => err # 1.8 exception
|
65
|
+
#msg += ", not #{err.name.inspect}"
|
66
|
+
end
|
67
|
+
pass = true
|
68
|
+
end
|
69
|
+
else
|
70
|
+
pass = false
|
71
|
+
begin
|
72
|
+
yield
|
73
|
+
pass = true
|
74
|
+
rescue ArgumentError => error
|
75
|
+
pass = true if /\Auncaught throw (.+)\z/ !~ error.message
|
76
|
+
end
|
77
|
+
end
|
78
|
+
pass
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
#
|
83
|
+
#
|
84
|
+
def self.assert_message(symbol)
|
85
|
+
s = symbol.inspect
|
86
|
+
"throw #{s}"
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'boolean_assay'
|
2
|
+
|
3
|
+
# Comparison assertion for TrueClass.
|
4
|
+
#
|
5
|
+
# TrueAssay.pass?(true) #=> true
|
6
|
+
# TrueAssay.fail?(true) #=> false
|
7
|
+
# TrueAssay.pass?(1) #=> false
|
8
|
+
#
|
9
|
+
class TrueAssay < BooleanAssay
|
10
|
+
|
11
|
+
register :true
|
12
|
+
|
13
|
+
#
|
14
|
+
# Check assertion using `#true?` method.
|
15
|
+
#
|
16
|
+
def self.pass?(subject)
|
17
|
+
subject.true? #TrueClass === subject
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative 'equal_assay'
|
2
|
+
|
3
|
+
# UnequalAssay compares objects with `#!=` operator. Yes, as of Ruby 1.9
|
4
|
+
# the `!=` is a redefinable method, and as such, we need a separate
|
5
|
+
# assay to cover it.
|
6
|
+
#
|
7
|
+
class UnequalAssay < EqualAssay
|
8
|
+
|
9
|
+
register :!=, :unequal
|
10
|
+
|
11
|
+
#
|
12
|
+
# Check assertion using `#!=` method.
|
13
|
+
#
|
14
|
+
def self.pass?(subject, criterion)
|
15
|
+
subject != criterion
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
# Failed assertion message.
|
20
|
+
#
|
21
|
+
def self.assert_message(subject, criterion)
|
22
|
+
a = subject.inspect
|
23
|
+
b = criterion.inspect
|
24
|
+
|
25
|
+
if a.size > SIZE_LIMIT or b.size > SIZE_LIMIT
|
26
|
+
if $ansi
|
27
|
+
d = ANSI::Diff.new(a, b)
|
28
|
+
a, b = d.diff1, d.diff2 # *d.to_a
|
29
|
+
end
|
30
|
+
"a != b\na) #{a}\nb) #{b}"
|
31
|
+
else
|
32
|
+
"#{a} != #{b}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative 'compare_assay'
|
2
|
+
|
3
|
+
# TODO: Support Range for Delta comparisons.
|
4
|
+
|
5
|
+
#
|
6
|
+
class WithinAssay < CompareAssay
|
7
|
+
|
8
|
+
register :within
|
9
|
+
|
10
|
+
#
|
11
|
+
# Check assertion.
|
12
|
+
#
|
13
|
+
def self.pass?(subject, criterion, delta)
|
14
|
+
if [subject, criterion, delta].all?{ |v| Numeric === v }
|
15
|
+
a, b, d = subject.to_f, criterion.to_f, delta.to_f
|
16
|
+
else
|
17
|
+
a, b, d = subject, criterion, delta
|
18
|
+
end
|
19
|
+
|
20
|
+
(b - d) <= a && (b + d) >= a
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# Failed assertion message.
|
25
|
+
#
|
26
|
+
def self.assert_message(subject, criterion, delta)
|
27
|
+
a = subject.inspect
|
28
|
+
b = criterion.inspect
|
29
|
+
d = delta.inspect
|
30
|
+
|
31
|
+
if [a, b, d].any?{ |e| e.size > SIZE_LIMIT }
|
32
|
+
"b - d <= a <= b + d\na) #{a}\nb) #{b}\nd) #{d}"
|
33
|
+
else
|
34
|
+
"#{b} - #{d} <= #{a} <= #{b} + #{d}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,59 @@
|
|
1
|
+
covers 'assay/compare_assay'
|
2
|
+
|
3
|
+
testcase CompareAssay do
|
4
|
+
|
5
|
+
class_method :pass? do
|
6
|
+
|
7
|
+
test do
|
8
|
+
assert CompareAssay.pass?(1, 1, 0)
|
9
|
+
assert CompareAssay.pass?(1, 2, -1)
|
10
|
+
assert CompareAssay.pass?(2, 1, 1)
|
11
|
+
|
12
|
+
refute CompareAssay.pass?(1, 1, 1)
|
13
|
+
refute CompareAssay.pass?(1, 1, -1)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
class_method :fail? do
|
19
|
+
|
20
|
+
test do
|
21
|
+
assert CompareAssay.fail?(1, 1, 1)
|
22
|
+
assert CompareAssay.fail?(1, 1, -1)
|
23
|
+
|
24
|
+
refute CompareAssay.fail?(1, 1, 0)
|
25
|
+
refute CompareAssay.fail?(1, 2, -1)
|
26
|
+
refute CompareAssay.fail?(2, 1, 1)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
class_method :assert! do
|
32
|
+
|
33
|
+
test do
|
34
|
+
CompareAssay.assert!(1, 1, 0)
|
35
|
+
end
|
36
|
+
|
37
|
+
test do
|
38
|
+
expect CompareAssay do
|
39
|
+
CompareAssay.assert!(1, 1, 1)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
class_method :refute! do
|
46
|
+
|
47
|
+
test do
|
48
|
+
CompareAssay.refute!(1, 2, 0)
|
49
|
+
end
|
50
|
+
|
51
|
+
test do
|
52
|
+
expect CompareAssay do
|
53
|
+
CompareAssay.refute!(1, 1, 0)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
covers 'assay/empty_assay'
|
2
|
+
|
3
|
+
testcase EmptyAssay do
|
4
|
+
|
5
|
+
class_method :pass? do
|
6
|
+
|
7
|
+
test do
|
8
|
+
assert EmptyAssay.pass?([])
|
9
|
+
refute EmptyAssay.pass?([1])
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
class_method :fail? do
|
15
|
+
|
16
|
+
test do
|
17
|
+
refute EmptyAssay.fail?([])
|
18
|
+
assert EmptyAssay.fail?([1])
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
class_method :assert! do
|
24
|
+
|
25
|
+
test do
|
26
|
+
EmptyAssay.assert!([])
|
27
|
+
end
|
28
|
+
|
29
|
+
test do
|
30
|
+
expect EmptyAssay do
|
31
|
+
EmptyAssay.assert!([1])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
class_method :refute! do
|
38
|
+
|
39
|
+
test do
|
40
|
+
EmptyAssay.refute!([1])
|
41
|
+
end
|
42
|
+
|
43
|
+
test do
|
44
|
+
expect EmptyAssay do
|
45
|
+
EmptyAssay.refute!([])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
covers 'assay/equal_assay'
|
2
|
+
|
3
|
+
testcase EqualAssay do
|
4
|
+
|
5
|
+
class_method :pass? do
|
6
|
+
|
7
|
+
test do
|
8
|
+
assert EqualAssay.pass?(1, 1)
|
9
|
+
assert EqualAssay.pass?(1, 1.0)
|
10
|
+
refute EqualAssay.pass?(1, 2)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
class_method :fail? do
|
16
|
+
|
17
|
+
test do
|
18
|
+
refute EqualAssay.fail?(1, 1)
|
19
|
+
refute EqualAssay.fail?(1, 1.0)
|
20
|
+
assert EqualAssay.fail?(1, 2)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
class_method :assert! do
|
26
|
+
|
27
|
+
test do
|
28
|
+
EqualAssay.assert!(1, 1)
|
29
|
+
end
|
30
|
+
|
31
|
+
test do
|
32
|
+
expect EqualAssay do
|
33
|
+
EqualAssay.assert!(1, 2)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
class_method :refute! do
|
40
|
+
|
41
|
+
test do
|
42
|
+
EqualAssay.refute!(1, 2)
|
43
|
+
end
|
44
|
+
|
45
|
+
test do
|
46
|
+
expect EqualAssay do
|
47
|
+
EqualAssay.refute!(1, 1)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
covers 'assay/equality_assay'
|
2
|
+
|
3
|
+
testcase EqualityAssay do
|
4
|
+
|
5
|
+
class_method :pass? do
|
6
|
+
|
7
|
+
test do
|
8
|
+
assert EqualityAssay.pass?(1, 1)
|
9
|
+
|
10
|
+
refute EqualityAssay.pass?(1, 1.0)
|
11
|
+
refute EqualityAssay.pass?(1, 2)
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
class_method :fail? do
|
17
|
+
|
18
|
+
test do
|
19
|
+
refute EqualityAssay.fail?(1, 1)
|
20
|
+
|
21
|
+
assert EqualityAssay.fail?(1, 1.0)
|
22
|
+
assert EqualityAssay.fail?(1, 2)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
class_method :assert! do
|
28
|
+
|
29
|
+
test do
|
30
|
+
EqualityAssay.assert!(1, 1)
|
31
|
+
end
|
32
|
+
|
33
|
+
test do
|
34
|
+
expect EqualityAssay do
|
35
|
+
EqualityAssay.assert!(1, 2)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
class_method :refute! do
|
42
|
+
|
43
|
+
test do
|
44
|
+
EqualityAssay.refute!(1, 1.0)
|
45
|
+
end
|
46
|
+
|
47
|
+
test do
|
48
|
+
expect EqualityAssay do
|
49
|
+
EqualityAssay.refute!(1, 1)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|