graham 0.0.2 → 0.0.3a
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +9 -9
- data/lib/graham.rb +32 -25
- data/lib/graham/dsl.rb +11 -5
- data/lib/graham/pp.rb +1 -1
- data/lib/graham/version.rb +1 -1
- data/test/case/cases.rb +44 -0
- data/test/case/control.rb +2 -2
- data/test/unit/arguments.rb +9 -0
- data/test/unit/namespaces.rb +26 -0
- metadata +11 -7
- data/test/case/test.rb +0 -57
data/README.md
CHANGED
@@ -5,11 +5,11 @@ 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 does one graham ##
|
8
|
+
## How does one use graham ??? ##
|
9
9
|
|
10
10
|
Graham test cases are instance methods on arbitrary classes:
|
11
11
|
```ruby
|
12
|
-
class
|
12
|
+
class Cases
|
13
13
|
def initialize
|
14
14
|
@number = 1
|
15
15
|
end
|
@@ -19,18 +19,18 @@ Graham test cases are instance methods on arbitrary classes:
|
|
19
19
|
def dividing_one_by_zero
|
20
20
|
@number / 0
|
21
21
|
end
|
22
|
-
def
|
23
|
-
|
22
|
+
def calling_upcase_on(obj)
|
23
|
+
obj.upcase
|
24
24
|
end
|
25
25
|
end
|
26
26
|
```
|
27
27
|
Then test your cases:
|
28
28
|
```ruby
|
29
|
-
Graham.test(
|
29
|
+
Graham.test(Cases) do |that|
|
30
30
|
that.one_squared.is 1
|
31
|
-
that.dividing_by_zero.returns_a(Fixnum).such_that {
|
32
|
-
that.
|
33
|
-
end #=> {:one_squared=>true, :dividing_by_zero=>#<ZeroDivisionError>, :
|
31
|
+
that.dividing_by_zero.returns_a(Fixnum).such_that {|n| n > 1}
|
32
|
+
that.calling_upcase_on(Graham).does_not_raise_an_exception
|
33
|
+
end #=> {:one_squared=>true, :dividing_by_zero=>#<ZeroDivisionError>, :calling_upcase_on=>false}
|
34
34
|
```
|
35
|
-
|
35
|
+
Or use Graham::test! to run the results through Graham's pretty printer.
|
36
36
|
|
data/lib/graham.rb
CHANGED
@@ -3,21 +3,27 @@ require 'mallow'
|
|
3
3
|
require 'graham/version'
|
4
4
|
# == A miniature test engine powered by Mallow
|
5
5
|
# ---
|
6
|
-
# Test cases are instance methods on classes
|
7
|
-
#
|
8
|
-
#
|
6
|
+
# Test cases are instance methods on arbitrary classes, and expectations on
|
7
|
+
# their return values are enumerated using a very slightly modified
|
8
|
+
# Mallow::DSL.
|
9
9
|
#
|
10
|
-
# class
|
11
|
-
# def
|
12
|
-
#
|
13
|
-
#
|
10
|
+
# class Cases
|
11
|
+
# def four_plus_five
|
12
|
+
# 4 + 5
|
13
|
+
# end
|
14
|
+
# def upcasing(s)
|
15
|
+
# s.upcase
|
16
|
+
# end
|
17
|
+
# def one_divided_by_zero
|
18
|
+
# 1/0
|
19
|
+
# end
|
14
20
|
# end
|
15
21
|
#
|
16
|
-
# Graham.test { |that|
|
17
|
-
# that.
|
18
|
-
# that.
|
19
|
-
# that.
|
20
|
-
# } #=> {:
|
22
|
+
# Graham.test(Cases) { |that|
|
23
|
+
# that.four_plus_five.is 9
|
24
|
+
# that.upcasing('test').returns 'TeST'
|
25
|
+
# that.one_divided_by_zero.equals :infinity
|
26
|
+
# } #=> {:four_plus_five=>true, :upcasing=>false, :one_divided_by_zero=>#<ZeroDivisionError>}
|
21
27
|
#
|
22
28
|
# === N.B.
|
23
29
|
# Since a Graham test is basically a Mallow pattern matcher, only the first
|
@@ -25,21 +31,21 @@ require 'graham/version'
|
|
25
31
|
# test case will be matched by the first rule. This can lead to confusing
|
26
32
|
# results:
|
27
33
|
#
|
28
|
-
# Graham.test { |that|
|
29
|
-
# that.
|
30
|
-
# that.
|
31
|
-
# } #=> {:
|
34
|
+
# Graham.test(Cases) { |that|
|
35
|
+
# that.four_plus_five.returns_a(Fixnum)
|
36
|
+
# that.four_plus_five.returns_a(String)
|
37
|
+
# } #=> {:four_plus_five=>true}
|
32
38
|
#
|
33
39
|
# To avoid this issue, either run separate tests:
|
34
40
|
#
|
35
|
-
# Graham.test {|that| that.
|
36
|
-
# Graham.test {|that| that.
|
41
|
+
# Graham.test(Cases) {|that| that.four_plus_five.returns_a Fixnum} #=> {:four_plus_five=>true}
|
42
|
+
# Graham.test(Cases) {|that| that.four_plus_five.returns_a String} #=> {:four_plus_five=>false}
|
37
43
|
#
|
38
44
|
# Or (better) chain the tests you want to run:
|
39
45
|
#
|
40
|
-
# Graham.test { |that|
|
41
|
-
# that.
|
42
|
-
# } #=> {:
|
46
|
+
# Graham.test(Cases) { |that|
|
47
|
+
# that.four_plus_five.returns_a(Fixnum).that {is_a? String}
|
48
|
+
# } #=> {:four_plus_five=>false}
|
43
49
|
#
|
44
50
|
module Graham
|
45
51
|
autoload :PP, 'graham/pp'
|
@@ -57,17 +63,18 @@ module Graham
|
|
57
63
|
def pp(ns, &b)
|
58
64
|
PP.new(test ns,&b).pp
|
59
65
|
end
|
66
|
+
alias test! pp
|
60
67
|
end
|
61
68
|
|
62
69
|
class Core < Mallow::Core
|
63
|
-
|
70
|
+
attr_reader :cases
|
64
71
|
def initialize
|
65
|
-
@cases =
|
72
|
+
@cases = {}
|
66
73
|
super
|
67
74
|
end
|
68
75
|
|
69
76
|
def _fluff1(e)
|
70
|
-
[e
|
77
|
+
[e] << begin
|
71
78
|
super e
|
72
79
|
true
|
73
80
|
rescue Mallow::MatchException
|
@@ -77,7 +84,7 @@ module Graham
|
|
77
84
|
end
|
78
85
|
end
|
79
86
|
|
80
|
-
def test; Hash[_fluff @cases] end
|
87
|
+
def test; Hash[_fluff @cases.keys] end
|
81
88
|
end
|
82
89
|
end
|
83
90
|
|
data/lib/graham/dsl.rb
CHANGED
@@ -7,7 +7,7 @@ module Graham
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def initialize(ns)
|
10
|
-
@core, @ns = Core.new, ns
|
10
|
+
@core, @ns = Core.new, ns
|
11
11
|
reset!
|
12
12
|
end
|
13
13
|
|
@@ -16,13 +16,18 @@ module Graham
|
|
16
16
|
when /^((and|that)_)+(.+)$/
|
17
17
|
respond_to?($3)? send($3, *args, &b) : super
|
18
18
|
else
|
19
|
-
core.cases
|
20
|
-
rule
|
19
|
+
core.cases[msg] = args
|
20
|
+
(conditions.empty?? self : rule!)._where {|e|e==msg}
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
def _where(&b)
|
25
|
-
|
24
|
+
def _where(&b)
|
25
|
+
push b, :conditions
|
26
|
+
end
|
27
|
+
|
28
|
+
def where(&b)
|
29
|
+
_where {|e| preproc(b).call @ns.new.send(e, *core.cases[e]) }
|
30
|
+
end
|
26
31
|
|
27
32
|
def raises(x=nil)
|
28
33
|
_where {
|
@@ -52,6 +57,7 @@ module Graham
|
|
52
57
|
|
53
58
|
alias is this
|
54
59
|
alias returns this
|
60
|
+
alias equals this
|
55
61
|
|
56
62
|
alias is_such_that where
|
57
63
|
alias such_that where
|
data/lib/graham/pp.rb
CHANGED
@@ -8,7 +8,7 @@ module Graham
|
|
8
8
|
PLAIN = "\x1b[0m"
|
9
9
|
GREEN = "\x1b[32m"
|
10
10
|
RED = "\x1b[31m"
|
11
|
-
def initialize(results, bt=0, out=$stdout, color=true)
|
11
|
+
def initialize(results, bt=(ENV['backtrace']||0).to_i, out=$stdout, color=true)
|
12
12
|
@results, @bt, @out, @color = results, bt, out, color
|
13
13
|
end
|
14
14
|
def pp
|
data/lib/graham/version.rb
CHANGED
data/test/case/cases.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
class TestCases
|
2
|
+
def DocTest1; 4 + 5 end
|
3
|
+
def DocTest2; 'test'.upcase end
|
4
|
+
def DocTest3; 1/0 end
|
5
|
+
def rdoc_example
|
6
|
+
Graham.test(TestCases) { |that|
|
7
|
+
that.DocTest1.returns_a(Fixnum).such_that {self < 100}
|
8
|
+
that.DocTest2.returns 'TeST'
|
9
|
+
that.DocTest3.returns_a(Numeric)
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def squaring(n)
|
14
|
+
n ** 2
|
15
|
+
end
|
16
|
+
|
17
|
+
def dividing_by_zero(n)
|
18
|
+
n / 0
|
19
|
+
end
|
20
|
+
def calling_a_nonexistent_method
|
21
|
+
Graham.this_is_not_a_method
|
22
|
+
end
|
23
|
+
def readme_example
|
24
|
+
Graham.test(TestCases) do |that|
|
25
|
+
that.squaring(1).returns 1
|
26
|
+
that.dividing_by_zero(1).returns_a(Fixnum)
|
27
|
+
that.calling_a_nonexistent_method.does_not_raise_an_exception
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Graham.pp(TestCases) do |that|
|
33
|
+
that.rdoc_example.returns_a(Hash).of_size(3).such_that {|h|
|
34
|
+
h[:DocTest1] == true and
|
35
|
+
h[:DocTest2] == false and
|
36
|
+
h[:DocTest3].is_a? ZeroDivisionError
|
37
|
+
}
|
38
|
+
that.readme_example.returns_a(Hash).of_size(3).such_that {|h|
|
39
|
+
h[:squaring] == true and
|
40
|
+
h[:dividing_by_zero].is_a? ZeroDivisionError and
|
41
|
+
h[:calling_a_nonexistent_method] == false
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
data/test/case/control.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
class
|
1
|
+
class ControlCases
|
2
2
|
def the_number_99; 99 end
|
3
3
|
def raising_a_name_error; raise Asdf.qwer.ty / 0 end
|
4
4
|
end
|
5
5
|
|
6
|
-
Graham.pp(
|
6
|
+
Graham.pp(ControlCases) {|that|
|
7
7
|
that.the_number_99.returns_a(Fixnum).such_that {self==99}.and_that_is 99
|
8
8
|
that.raising_a_name_error.raises.and_raises_a NameError
|
9
9
|
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Namespace
|
2
|
+
def initialize
|
3
|
+
@num=0
|
4
|
+
end
|
5
|
+
|
6
|
+
def namespacing; self end
|
7
|
+
|
8
|
+
def initialization
|
9
|
+
@num+=1
|
10
|
+
end
|
11
|
+
|
12
|
+
def reinitialization
|
13
|
+
@num+=1
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Graham.pp(Namespace) do |that|
|
18
|
+
that.namespacing.is_such_that {
|
19
|
+
self.class == Namespace
|
20
|
+
}.and {!respond_to? :rdoc_example
|
21
|
+
}.and { respond_to? :namespacing}
|
22
|
+
|
23
|
+
that.initialization.returns 1
|
24
|
+
that.reinitialization.returns 1
|
25
|
+
end
|
26
|
+
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graham
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.3a
|
5
|
+
prerelease: 5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- feivel jellyfish
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mallow
|
@@ -42,7 +42,9 @@ files:
|
|
42
42
|
- lib/graham/dsl.rb
|
43
43
|
- Rakefile
|
44
44
|
- test/case/control.rb
|
45
|
-
- test/case/
|
45
|
+
- test/case/cases.rb
|
46
|
+
- test/unit/arguments.rb
|
47
|
+
- test/unit/namespaces.rb
|
46
48
|
homepage: http://github.com/gwentacle/graham
|
47
49
|
licenses: []
|
48
50
|
post_install_message:
|
@@ -58,9 +60,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
58
60
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
61
|
none: false
|
60
62
|
requirements:
|
61
|
-
- - ! '
|
63
|
+
- - ! '>'
|
62
64
|
- !ruby/object:Gem::Version
|
63
|
-
version:
|
65
|
+
version: 1.3.1
|
64
66
|
requirements: []
|
65
67
|
rubyforge_project:
|
66
68
|
rubygems_version: 1.8.23
|
@@ -70,4 +72,6 @@ summary: Miniature test engine based on Mallow
|
|
70
72
|
test_files:
|
71
73
|
- Rakefile
|
72
74
|
- test/case/control.rb
|
73
|
-
- test/case/
|
75
|
+
- test/case/cases.rb
|
76
|
+
- test/unit/arguments.rb
|
77
|
+
- test/unit/namespaces.rb
|
data/test/case/test.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
class Cases
|
2
|
-
def DocTest1; 4 + 5 end
|
3
|
-
def DocTest2; 'test'.upcase end
|
4
|
-
def DocTest3; 1/0 end
|
5
|
-
def rdoc_example
|
6
|
-
Graham.test(Cases) { |that|
|
7
|
-
that.DocTest1.returns_a(Fixnum).such_that {self < 100}
|
8
|
-
that.DocTest2.returns 'TeST'
|
9
|
-
that.DocTest3.returns_a(Numeric)
|
10
|
-
}
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize
|
14
|
-
@number = 1
|
15
|
-
end
|
16
|
-
def ReadmeCase1
|
17
|
-
@number ** 2
|
18
|
-
end
|
19
|
-
def ReadmeCase2
|
20
|
-
@number / 0
|
21
|
-
end
|
22
|
-
def ReadmeCase3
|
23
|
-
Graham.this_is_not_a_method
|
24
|
-
end
|
25
|
-
def readme_example
|
26
|
-
Graham.test(Cases) do |that|
|
27
|
-
that.ReadmeCase1.is_such_that { self == 1 }
|
28
|
-
that.ReadmeCase2.is_a(Fixnum).such_that {self > 1}
|
29
|
-
that.ReadmeCase3.does_not_raise_an_exception
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
class Namespace
|
35
|
-
def namespacing; self end
|
36
|
-
end
|
37
|
-
|
38
|
-
Graham.pp(Cases) do |that|
|
39
|
-
that.rdoc_example.returns_a(Hash).of_size(3).such_that {
|
40
|
-
self[:DocTest1] == true and
|
41
|
-
self[:DocTest2] == false and
|
42
|
-
self[:DocTest3].is_a? ZeroDivisionError
|
43
|
-
}
|
44
|
-
that.readme_example.returns_a(Hash).of_size(3).such_that {
|
45
|
-
self[:ReadmeCase1] == true and
|
46
|
-
self[:ReadmeCase2].is_a? ZeroDivisionError and
|
47
|
-
self[:ReadmeCase3] == false
|
48
|
-
}
|
49
|
-
end
|
50
|
-
|
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
|
-
end
|
57
|
-
|