graham 0.0.0 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +12 -12
- data/graham.gemspec +1 -1
- data/lib/graham.rb +8 -103
- data/lib/graham/dsl.rb +77 -0
- data/lib/graham/pp.rb +2 -2
- data/lib/graham/version.rb +1 -1
- data/test/case/control.rb +6 -6
- data/test/case/test.rb +16 -16
- metadata +5 -4
data/README.md
CHANGED
@@ -5,32 +5,32 @@ Graham is a tiny-yet-useful testing library based on Mallow - in fact it _is_ Ma
|
|
5
5
|
* TestRocket was too minimal
|
6
6
|
* RSpec was too verbose (not to mention ridiculous overkill)
|
7
7
|
|
8
|
-
## How
|
8
|
+
## How does one graham ##
|
9
9
|
|
10
|
-
Graham test cases are instance methods on classes
|
10
|
+
Graham test cases are instance methods on arbitrary classes:
|
11
11
|
```ruby
|
12
|
-
class
|
12
|
+
class TestCases
|
13
13
|
def initialize
|
14
14
|
@number = 1
|
15
15
|
end
|
16
|
-
def
|
16
|
+
def one_squared
|
17
17
|
@number ** 2
|
18
18
|
end
|
19
|
-
def
|
19
|
+
def dividing_one_by_zero
|
20
20
|
@number / 0
|
21
21
|
end
|
22
|
-
def
|
22
|
+
def calling_a_nonexistent_method
|
23
23
|
Graham.this_is_not_a_method
|
24
24
|
end
|
25
25
|
end
|
26
26
|
```
|
27
27
|
Then test your cases:
|
28
28
|
```ruby
|
29
|
-
Graham.test(
|
30
|
-
that.
|
31
|
-
that.
|
32
|
-
that.
|
33
|
-
end #=> {:
|
29
|
+
Graham.test(TestCases) do |that|
|
30
|
+
that.one_squared.is 1
|
31
|
+
that.dividing_by_zero.returns_a(Fixnum).such_that {self > 1}
|
32
|
+
that.calling_a_nonexistent_method.does_not_raise_an_exception
|
33
|
+
end #=> {:one_squared=>true, :dividing_by_zero=>#<ZeroDivisionError>, :calling_a_nonexistent_method=>false}
|
34
34
|
```
|
35
|
-
Calling Graham
|
35
|
+
Calling Graham::pp instead will call Graham::test and run the output through Graham's built-in pretty printer.
|
36
36
|
|
data/graham.gemspec
CHANGED
data/lib/graham.rb
CHANGED
@@ -19,9 +19,6 @@ require 'graham/version'
|
|
19
19
|
# that.test3.returns_a Numeric
|
20
20
|
# } #=> {:test1=>true, :test2=>false, :test3=>#<ZeroDivisionError>}
|
21
21
|
#
|
22
|
-
# A side effect of this approach is that you can use RDoc to document your
|
23
|
-
# tests, gauge coverage, etc.
|
24
|
-
#
|
25
22
|
# === N.B.
|
26
23
|
# Since a Graham test is basically a Mallow pattern matcher, only the first
|
27
24
|
# test on a case will actually be executed, as subsequent invocations of the
|
@@ -47,40 +44,24 @@ require 'graham/version'
|
|
47
44
|
module Graham
|
48
45
|
autoload :PP, 'graham/pp'
|
49
46
|
autoload :RakeTask, 'graham/rake_task'
|
50
|
-
|
51
|
-
class Cases; end
|
47
|
+
autoload :DSL, 'graham/dsl'
|
52
48
|
class << self
|
53
49
|
# A convenience method that builds and executes a Graham::Core
|
54
50
|
# in the given namespace (defaults to Cases). See documentation for
|
55
51
|
# Graham for more on usage.
|
56
|
-
def test(ns
|
57
|
-
|
58
|
-
Graham::Core.build(ns, &b).test
|
52
|
+
def test(ns, &b)
|
53
|
+
DSL.build_core(ns, &b).test
|
59
54
|
end
|
60
|
-
# A convenience
|
55
|
+
# A convenience method that calls ::test and passes the output to a
|
61
56
|
# pretty printer.
|
62
|
-
def pp(ns
|
57
|
+
def pp(ns, &b)
|
63
58
|
PP.new(test ns,&b).pp
|
64
59
|
end
|
65
|
-
|
66
|
-
def compose(ns=nil, *test_groups)
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
alias test_in test
|
71
|
-
|
72
|
-
private
|
73
|
-
def ns_compose(test_groups)
|
74
|
-
test_groups.map do |ns, tests|
|
75
|
-
[ ns, tests.map {|test| test ns, &test} ]
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
60
|
end
|
80
61
|
|
81
62
|
class Core < Mallow::Core
|
82
63
|
attr_accessor :cases
|
83
|
-
def initialize
|
64
|
+
def initialize
|
84
65
|
@cases = []
|
85
66
|
super
|
86
67
|
end
|
@@ -89,7 +70,7 @@ module Graham
|
|
89
70
|
[e.name] << begin
|
90
71
|
super e
|
91
72
|
true
|
92
|
-
rescue Mallow::
|
73
|
+
rescue Mallow::MatchException
|
93
74
|
false
|
94
75
|
rescue => err
|
95
76
|
err
|
@@ -97,82 +78,6 @@ module Graham
|
|
97
78
|
end
|
98
79
|
|
99
80
|
def test; Hash[_fluff @cases] end
|
100
|
-
def self.build(ns, &b); DSL.build ns, &b end
|
101
|
-
end
|
102
|
-
|
103
|
-
class DSL < Mallow::DSL
|
104
|
-
|
105
|
-
def self.build(ns)
|
106
|
-
yield(dsl = new(ns))
|
107
|
-
dsl.finish!
|
108
|
-
end
|
109
|
-
|
110
|
-
def initialize(ns)
|
111
|
-
@core, @cases = Core.new, ns.new
|
112
|
-
reset!
|
113
|
-
end
|
114
|
-
|
115
|
-
def method_missing(msg, *args, &b)
|
116
|
-
case msg.to_s
|
117
|
-
when /^((and|that)_)+(.+)$/
|
118
|
-
respond_to?($3)? send($3, *args, &b) : super
|
119
|
-
else
|
120
|
-
core.cases << (_case = @cases.method msg) rescue super
|
121
|
-
rule!._this _case
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def _where(&b); push b, :conditions end
|
126
|
-
def _this(o); _where {|e|e==o} end
|
127
|
-
def where(&b); _where {|e| preproc(b)[e.call] } end
|
128
|
-
|
129
|
-
def raises(x=nil)
|
130
|
-
_where {
|
131
|
-
begin
|
132
|
-
call
|
133
|
-
false
|
134
|
-
rescue x => e
|
135
|
-
true
|
136
|
-
rescue => e
|
137
|
-
x ? raise(e) : true
|
138
|
-
end
|
139
|
-
}
|
140
|
-
end
|
141
|
-
|
142
|
-
def does_not_raise(x=nil)
|
143
|
-
_where {
|
144
|
-
begin
|
145
|
-
call
|
146
|
-
true
|
147
|
-
rescue x => e
|
148
|
-
false
|
149
|
-
rescue => e
|
150
|
-
x ? raise(e) : false
|
151
|
-
end
|
152
|
-
}
|
153
|
-
end
|
154
|
-
|
155
|
-
alias is this
|
156
|
-
alias returns this
|
157
|
-
|
158
|
-
alias is_such_that where
|
159
|
-
alias such_that where
|
160
|
-
alias and where
|
161
|
-
alias that where
|
162
|
-
|
163
|
-
alias raises_an raises
|
164
|
-
alias raises_a raises
|
165
|
-
alias raises_an_exception raises
|
166
|
-
|
167
|
-
alias returns_ does_not_raise
|
168
|
-
alias does_not_raise_a does_not_raise
|
169
|
-
alias does_not_raise_an does_not_raise
|
170
|
-
alias does_not_raise_an_exception does_not_raise
|
171
|
-
|
172
|
-
alias is_a a
|
173
|
-
alias is_an a
|
174
|
-
alias returns_a a
|
175
|
-
alias returns_an a
|
176
|
-
|
177
81
|
end
|
178
82
|
end
|
83
|
+
|
data/lib/graham/dsl.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
module Graham
|
2
|
+
class DSL < Mallow::BasicDSL
|
3
|
+
include Mallow::DSL::Matchers
|
4
|
+
def self.build_core(ns)
|
5
|
+
yield(dsl = new(ns))
|
6
|
+
dsl.finish!
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(ns)
|
10
|
+
@core, @ns = Core.new, ns.new
|
11
|
+
reset!
|
12
|
+
end
|
13
|
+
|
14
|
+
def method_missing(msg, *args, &b)
|
15
|
+
case msg.to_s
|
16
|
+
when /^((and|that)_)+(.+)$/
|
17
|
+
respond_to?($3)? send($3, *args, &b) : super
|
18
|
+
else
|
19
|
+
core.cases << (_case = @ns.method msg)
|
20
|
+
rule!._where {|e|e==_case}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def _where(&b); push b, :conditions end
|
25
|
+
def where(&b); _where {|e| preproc(b)[e.call] } end
|
26
|
+
|
27
|
+
def raises(x=nil)
|
28
|
+
_where {
|
29
|
+
begin
|
30
|
+
call
|
31
|
+
false
|
32
|
+
rescue x => e
|
33
|
+
true
|
34
|
+
rescue => e
|
35
|
+
x ? raise(e) : true
|
36
|
+
end
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
def does_not_raise(x=nil)
|
41
|
+
_where {
|
42
|
+
begin
|
43
|
+
call
|
44
|
+
true
|
45
|
+
rescue x => e
|
46
|
+
false
|
47
|
+
rescue => e
|
48
|
+
x ? raise(e) : false
|
49
|
+
end
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
alias is this
|
54
|
+
alias returns this
|
55
|
+
|
56
|
+
alias is_such_that where
|
57
|
+
alias such_that where
|
58
|
+
alias that where
|
59
|
+
alias and where
|
60
|
+
|
61
|
+
alias raises_an raises
|
62
|
+
alias raises_a raises
|
63
|
+
alias raises_an_exception raises
|
64
|
+
|
65
|
+
alias returns_ does_not_raise
|
66
|
+
alias does_not_raise_a does_not_raise
|
67
|
+
alias does_not_raise_an does_not_raise
|
68
|
+
alias does_not_raise_an_exception does_not_raise
|
69
|
+
|
70
|
+
alias is_a a
|
71
|
+
alias is_an a
|
72
|
+
alias returns_a a
|
73
|
+
alias returns_an a
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
data/lib/graham/pp.rb
CHANGED
data/lib/graham/version.rb
CHANGED
data/test/case/control.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
class
|
2
|
-
def
|
3
|
-
def
|
1
|
+
class Cases
|
2
|
+
def the_number_99; 99 end
|
3
|
+
def raising_a_name_error; raise Asdf.qwer.ty / 0 end
|
4
4
|
end
|
5
5
|
|
6
|
-
Graham.pp {|that|
|
7
|
-
that.
|
8
|
-
that.
|
6
|
+
Graham.pp(Cases) {|that|
|
7
|
+
that.the_number_99.returns_a(Fixnum).such_that {self==99}.and_that_is 99
|
8
|
+
that.raising_a_name_error.raises.and_raises_a NameError
|
9
9
|
}
|
10
10
|
|
data/test/case/test.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
class
|
1
|
+
class Cases
|
2
2
|
def DocTest1; 4 + 5 end
|
3
3
|
def DocTest2; 'test'.upcase end
|
4
4
|
def DocTest3; 1/0 end
|
5
|
-
def
|
6
|
-
Graham.test { |that|
|
5
|
+
def rdoc_example
|
6
|
+
Graham.test(Cases) { |that|
|
7
7
|
that.DocTest1.returns_a(Fixnum).such_that {self < 100}
|
8
8
|
that.DocTest2.returns 'TeST'
|
9
|
-
that.DocTest3.returns_a
|
9
|
+
that.DocTest3.returns_a(Numeric)
|
10
10
|
}
|
11
11
|
end
|
12
12
|
|
@@ -22,8 +22,8 @@ class Graham::Cases
|
|
22
22
|
def ReadmeCase3
|
23
23
|
Graham.this_is_not_a_method
|
24
24
|
end
|
25
|
-
def
|
26
|
-
Graham.test do |that|
|
25
|
+
def readme_example
|
26
|
+
Graham.test(Cases) do |that|
|
27
27
|
that.ReadmeCase1.is_such_that { self == 1 }
|
28
28
|
that.ReadmeCase2.is_a(Fixnum).such_that {self > 1}
|
29
29
|
that.ReadmeCase3.does_not_raise_an_exception
|
@@ -31,27 +31,27 @@ class Graham::Cases
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
class
|
35
|
-
def
|
34
|
+
class Namespace
|
35
|
+
def namespacing; self end
|
36
36
|
end
|
37
37
|
|
38
|
-
Graham.pp do |that|
|
39
|
-
that.
|
38
|
+
Graham.pp(Cases) do |that|
|
39
|
+
that.rdoc_example.returns_a(Hash).of_size(3).such_that {
|
40
40
|
self[:DocTest1] == true and
|
41
41
|
self[:DocTest2] == false and
|
42
42
|
self[:DocTest3].is_a? ZeroDivisionError
|
43
43
|
}
|
44
|
-
that.
|
44
|
+
that.readme_example.returns_a(Hash).of_size(3).such_that {
|
45
45
|
self[:ReadmeCase1] == true and
|
46
46
|
self[:ReadmeCase2].is_a? ZeroDivisionError and
|
47
47
|
self[:ReadmeCase3] == false
|
48
48
|
}
|
49
49
|
end
|
50
50
|
|
51
|
-
Graham.pp(
|
52
|
-
that.
|
53
|
-
self.class ==
|
54
|
-
}.and {!respond_to? :
|
55
|
-
}.and { respond_to? :
|
51
|
+
Graham.pp(Namespace) do |that|
|
52
|
+
that.namespacing.is_such_that {
|
53
|
+
self.class == Namespace
|
54
|
+
}.and {!respond_to? :rdoc_example
|
55
|
+
}.and { respond_to? :namespacing}
|
56
56
|
end
|
57
57
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graham
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mallow
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 0.0.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: 0.0.4
|
30
30
|
description: Miniature test engine based on Mallow
|
31
31
|
email: feivel@sdf.org
|
32
32
|
executables: []
|
@@ -39,6 +39,7 @@ files:
|
|
39
39
|
- lib/graham/rake_task.rb
|
40
40
|
- lib/graham/pp.rb
|
41
41
|
- lib/graham/version.rb
|
42
|
+
- lib/graham/dsl.rb
|
42
43
|
- Rakefile
|
43
44
|
- test/case/control.rb
|
44
45
|
- test/case/test.rb
|