assay 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.
- data/.ruby +44 -0
- data/APACHE2.txt +205 -0
- data/HISTORY.rdoc +26 -0
- data/NOTICE.rdoc +18 -0
- data/README.rdoc +50 -0
- data/lib/assay.rb +44 -0
- data/lib/assay.yml +44 -0
- data/lib/assay/adapters/minitest.rb +25 -0
- data/lib/assay/adapters/testunit.rb +42 -0
- data/lib/assay/assertion.rb +148 -0
- data/lib/assay/assertions/compare_failure.rb +60 -0
- data/lib/assay/assertions/delta_failure.rb +80 -0
- data/lib/assay/assertions/empty_failure.rb +76 -0
- data/lib/assay/assertions/equality_failure.rb +105 -0
- data/lib/assay/assertions/execution_failure.rb +91 -0
- data/lib/assay/assertions/false_failure.rb +73 -0
- data/lib/assay/assertions/identity_failure.rb +86 -0
- data/lib/assay/assertions/instance_failure.rb +77 -0
- data/lib/assay/assertions/kind_failure.rb +80 -0
- data/lib/assay/assertions/match_failure.rb +86 -0
- data/lib/assay/assertions/nil_failure.rb +75 -0
- data/lib/assay/assertions/raise_failure.rb +133 -0
- data/lib/assay/assertions/response_failure.rb +87 -0
- data/lib/assay/assertions/same_failure.rb +83 -0
- data/lib/assay/assertions/throw_failure.rb +123 -0
- data/lib/assay/assertions/true_failure.rb +80 -0
- data/lib/assay/matcher.rb +48 -0
- data/qed/01_failure_classes.rdoc +75 -0
- data/qed/02_assertives.rdoc +118 -0
- data/qed/03_matchers.rdoc +118 -0
- data/qed/04_lookup.rdoc +10 -0
- metadata +143 -0
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'assay/assertion'
|
2
|
+
|
3
|
+
module Assay
|
4
|
+
|
5
|
+
# Assert that a block of coded executes without error.
|
6
|
+
#
|
7
|
+
# ExecutionFailure is also the base class of the other
|
8
|
+
# block-executing assertion classes.
|
9
|
+
class ExecutionFailure < Assertion
|
10
|
+
#
|
11
|
+
def self.assertion_name
|
12
|
+
:execution
|
13
|
+
end
|
14
|
+
|
15
|
+
# Check assertion.
|
16
|
+
def self.pass?(_=nil, &block)
|
17
|
+
begin
|
18
|
+
block.call
|
19
|
+
true
|
20
|
+
rescue Exception
|
21
|
+
false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Check negated assertion.
|
26
|
+
def self.fail?(_=nil, &block)
|
27
|
+
begin
|
28
|
+
block.call
|
29
|
+
false
|
30
|
+
rescue Exception
|
31
|
+
true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
def to_s
|
37
|
+
if @_negated
|
38
|
+
"Expected procedure to raise an exception"
|
39
|
+
else
|
40
|
+
"Expected procedure to execute successfully"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
module Assertives
|
48
|
+
# Passes if the block yields successfully.
|
49
|
+
#
|
50
|
+
# assert_executes "Couldn't do the thing" do
|
51
|
+
# do_the_thing
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
def assert_executes(opts={}, &blk)
|
55
|
+
opts[:backtrace] ||= caller
|
56
|
+
ExecutionFailure.assert(opts, &blk)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Passes if the block does not yield successfully.
|
60
|
+
#
|
61
|
+
# assert_not_executes "Couldn't do the thing" do
|
62
|
+
# do_the_thing
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
def assert_not_executes(opts={}, &blk)
|
66
|
+
opts[:backtrace] ||= caller
|
67
|
+
ExecutionFailure.refute(opts, &blk)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
module Matchers
|
73
|
+
# TODO: Reasonable matcher for ExectuionFailure ?
|
74
|
+
#
|
75
|
+
#
|
76
|
+
# proc.assert is_executed(*args)
|
77
|
+
#
|
78
|
+
def is_executed(&block)
|
79
|
+
ExecutionFailure.to_matcher(&block)
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
#
|
84
|
+
# proc.should be_executed(*args)
|
85
|
+
#
|
86
|
+
def be_extecuted(&block)
|
87
|
+
ExecutionFailure.to_matcher(&block)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'assay/assertions/compare_failure'
|
2
|
+
|
3
|
+
module Assay
|
4
|
+
|
5
|
+
class FalseFailure < CompareFailure
|
6
|
+
|
7
|
+
def self.assertion_name
|
8
|
+
:false
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.assertion_operator
|
12
|
+
:false?
|
13
|
+
end
|
14
|
+
|
15
|
+
# Check assertion.
|
16
|
+
def self.pass?(exp)
|
17
|
+
FalseClass === exp
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
def to_s
|
22
|
+
return super unless @arguments.size == 1
|
23
|
+
|
24
|
+
exp = @arguments[0].inspect
|
25
|
+
|
26
|
+
if @_negated
|
27
|
+
"Expected #{exp} to NOT be false"
|
28
|
+
else
|
29
|
+
"Expected #{exp} to be false"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
module Assertives
|
37
|
+
# Passed if object is +false+.
|
38
|
+
#
|
39
|
+
def assert_false(exp, opts={})
|
40
|
+
opts[:backtrace] ||= caller
|
41
|
+
FalseFailure.assert(exp, opts)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Passed if object is not +false+.
|
45
|
+
#
|
46
|
+
# assert_not_false(false)
|
47
|
+
#
|
48
|
+
def assert_not_false(exp, opts={})
|
49
|
+
opts[:backtrace] ||= caller
|
50
|
+
FalseFailure.refute(exp, opts)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
module Matchers
|
56
|
+
#
|
57
|
+
#
|
58
|
+
# value.assert is_false
|
59
|
+
#
|
60
|
+
def is_false
|
61
|
+
FalseFailure.to_matcher
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
#
|
66
|
+
# value.should be_false
|
67
|
+
#
|
68
|
+
def be_false
|
69
|
+
FalseFailure.to_matcher
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'assay/assertions/compare_failure'
|
2
|
+
|
3
|
+
module Assay
|
4
|
+
|
5
|
+
class IdentityFailure < CompareFailure
|
6
|
+
|
7
|
+
def self.assertion_name
|
8
|
+
:identical
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.assertion_operator
|
12
|
+
:equal?
|
13
|
+
end
|
14
|
+
|
15
|
+
#def self.fail_message(exp, act)
|
16
|
+
# "Expected #{act.inspect} to be identical to #{exp.inspect}"
|
17
|
+
#end
|
18
|
+
|
19
|
+
#def self.fail_message!(exp, act)
|
20
|
+
# "Expected #{act.inspect} not to be identical to #{exp.inspect}"
|
21
|
+
#end
|
22
|
+
|
23
|
+
# Check assertion.
|
24
|
+
def self.pass?(exp, act)
|
25
|
+
exp.object_id == act.object_id
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
def to_s
|
30
|
+
return super unless @arguments.size == 2
|
31
|
+
|
32
|
+
iexp = @arguments[0].inspect
|
33
|
+
iact = @arguments[1].inspect
|
34
|
+
|
35
|
+
if @_negated
|
36
|
+
"Expected #{iact} not to be identical to #{iexp}"
|
37
|
+
else
|
38
|
+
"Expected #{iact} to be identical to #{iexp}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
module Assertives
|
46
|
+
# Passes if +actual+ .equal? +expected+ (i.e. they are the same instance).
|
47
|
+
#
|
48
|
+
# o = Object.new
|
49
|
+
# assert_identical(o, o)
|
50
|
+
#
|
51
|
+
def assert_identical(exp, act, opts={})
|
52
|
+
opts[:backtrace] ||= caller
|
53
|
+
IdentityFailure.assert(exp, act, opts)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Passes if ! actual .equal? expected
|
57
|
+
#
|
58
|
+
# assert_not_identical(Object.new, Object.new)
|
59
|
+
#
|
60
|
+
def assert_not_identical(exp, act, opts={})
|
61
|
+
opts[:backtrace] ||= caller
|
62
|
+
IdentityFailure.refute(exp, act, opts)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
module Matchers
|
68
|
+
#
|
69
|
+
#
|
70
|
+
# object1.assert is_identical_to(object2)
|
71
|
+
#
|
72
|
+
def is_identical_to(obj)
|
73
|
+
IdentityFailure.to_matcher(obj)
|
74
|
+
end
|
75
|
+
|
76
|
+
#
|
77
|
+
#
|
78
|
+
# object1.should be_identical_to(object2)
|
79
|
+
#
|
80
|
+
def be_identical_to(obj)
|
81
|
+
IdentityFailure.to_matcher(obj)
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'assay/assertions/compare_failure'
|
2
|
+
|
3
|
+
module Assay
|
4
|
+
|
5
|
+
class InstanceFailure < CompareFailure
|
6
|
+
|
7
|
+
def self.assertion_name
|
8
|
+
:instance
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.assertion_operator
|
12
|
+
:instance_of?
|
13
|
+
end
|
14
|
+
|
15
|
+
# Check assertion.
|
16
|
+
def self.pass?(exp, act)
|
17
|
+
exp.instance_of?(act)
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
def to_s
|
22
|
+
return super unless @arguments.size == 2
|
23
|
+
|
24
|
+
exp = @arguments[0].inspect
|
25
|
+
act = @arguments[1].inspect
|
26
|
+
|
27
|
+
if @_negated
|
28
|
+
"Expected #{act} to NOT be an instance of #{exp}"
|
29
|
+
else
|
30
|
+
"Expected #{act} to be an instance of #{exp}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
module Assertives
|
37
|
+
# Passes if object .instance_of? klass
|
38
|
+
#
|
39
|
+
# assert_instance_of(String, 'foo')
|
40
|
+
#
|
41
|
+
def assert_instance_of(cls, obj, opts={})
|
42
|
+
opts[:backtrace] ||= caller
|
43
|
+
InstanceFailure.assert(cls, obj, opts)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Passes if object .instance_of? klass
|
47
|
+
#
|
48
|
+
# assert_instance_of(String, 'foo')
|
49
|
+
#
|
50
|
+
def refute_instance_of(cls, obj, opts={})
|
51
|
+
opts[:backtrace] ||= caller
|
52
|
+
InstanceFailure.refute(cls, obj, opts)
|
53
|
+
end
|
54
|
+
|
55
|
+
alias_method :assert_not_instance_of, :refute_instance_of
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
module Matchers
|
60
|
+
#
|
61
|
+
#
|
62
|
+
# object.assert is_instance_of(class)
|
63
|
+
#
|
64
|
+
def is_instance_of(cls)
|
65
|
+
InstanceFailure.to_matcher(cls)
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
#
|
70
|
+
# object.should be_instance_of(class)
|
71
|
+
#
|
72
|
+
def be_instance_of(cls)
|
73
|
+
InstanceFailure.to_matcher(cls)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'assay/assertions/compare_failure'
|
2
|
+
|
3
|
+
module Assay
|
4
|
+
|
5
|
+
# Comparison assertion for #kind_of?
|
6
|
+
#
|
7
|
+
# KindFailure.pass?(1, Integer) #=> true
|
8
|
+
# KindFailure.fail?(1, String) #=> true
|
9
|
+
#
|
10
|
+
class KindFailure < CompareFailure
|
11
|
+
|
12
|
+
def self.assertion_name
|
13
|
+
:kind_of
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.assertion_operator
|
17
|
+
:kind_of?
|
18
|
+
end
|
19
|
+
|
20
|
+
# Check assertion.
|
21
|
+
def self.pass?(exp, act)
|
22
|
+
exp.kind_of? act
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
def to_s
|
27
|
+
return super unless @arguments.size == 2
|
28
|
+
|
29
|
+
exp = @arguments[0].inspect
|
30
|
+
act = @arguments[1].inspect
|
31
|
+
|
32
|
+
if @_negated
|
33
|
+
"Expected #{act} to be kind of #{exp}"
|
34
|
+
else
|
35
|
+
"Expected #{act} to be kind of #{exp}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
module Assertives
|
42
|
+
# Passes if object .kind_of? klass
|
43
|
+
#
|
44
|
+
# assert_kind_of(Object, 'foo')
|
45
|
+
#
|
46
|
+
def assert_kind_of(cls, obj, opts={})
|
47
|
+
opts[:backtrace] ||= caller
|
48
|
+
KindFailure.assert(cls, obj, opts)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Passes if object .kind_of? klass
|
52
|
+
#
|
53
|
+
# assert_not_kind_of(Object, 'foo')
|
54
|
+
#
|
55
|
+
def refute_kind_of(cls, obj, opts={})
|
56
|
+
KindFailure.refute(cls, obj, opts)
|
57
|
+
end
|
58
|
+
alias_method :assert_not_kind_of, :refute_kind_of
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
module Matchers
|
63
|
+
#
|
64
|
+
#
|
65
|
+
# object.assert is_a_kind_of(class)
|
66
|
+
#
|
67
|
+
def is_kind_of(cls)
|
68
|
+
KindFailure.to_matcher(cls)
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
#
|
73
|
+
# object.should be_a_kind_of(class)
|
74
|
+
#
|
75
|
+
def be_kind_of(cls)
|
76
|
+
KindFailure.to_matcher(cls)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'assay/assertions/compare_failure'
|
2
|
+
|
3
|
+
module Assay
|
4
|
+
|
5
|
+
class MatchFailure < CompareFailure
|
6
|
+
|
7
|
+
def self.assertion_name
|
8
|
+
:match
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.assertion_operator
|
12
|
+
:=~
|
13
|
+
end
|
14
|
+
|
15
|
+
# Check assertion.
|
16
|
+
def self.pass?(exp, act)
|
17
|
+
exp =~ act
|
18
|
+
end
|
19
|
+
|
20
|
+
# Check negated assertion.
|
21
|
+
def self.fail?(exp, act)
|
22
|
+
exp !~ act
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
def self.assertable_method
|
27
|
+
:assert_match
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
def to_s
|
32
|
+
return super unless @arguments.size == 2
|
33
|
+
|
34
|
+
exp = @arguments[0].inspect
|
35
|
+
act = @arguments[1].inspect
|
36
|
+
|
37
|
+
if @_negated
|
38
|
+
"Expected #{act} !~ #{exp}"
|
39
|
+
else
|
40
|
+
"Expected #{act} =~ #{exp}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
module Assertives
|
48
|
+
# Passes if string =~ pattern.
|
49
|
+
#
|
50
|
+
# assert_match(/\d+/, 'five, 6, seven')
|
51
|
+
#
|
52
|
+
def assert_match(exp, act, opts={})
|
53
|
+
opts[:backtrace] ||= caller
|
54
|
+
MatchFailure.assert(exp, act, opts)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Passes if regexp !~ string
|
58
|
+
#
|
59
|
+
# refute_match(/two/, 'one 2 three')
|
60
|
+
#
|
61
|
+
def refute_match(exp, act, opts={})
|
62
|
+
opts[:backtrace] ||= caller
|
63
|
+
MatchFailure.refute(exp, act, opts)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
module Matchers
|
69
|
+
#
|
70
|
+
#
|
71
|
+
# object.assert is_a_match_for(regexp)
|
72
|
+
#
|
73
|
+
def is_match_for(regexp)
|
74
|
+
MatchFailure.to_matcher(regexp)
|
75
|
+
end
|
76
|
+
|
77
|
+
#
|
78
|
+
#
|
79
|
+
# object.should be_a_match_for(regexp)
|
80
|
+
#
|
81
|
+
def be_match_for(regexp)
|
82
|
+
MatchFailure.to_matcher(regexp)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|