assay 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|