ae 1.8.1 → 1.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.ruby +0 -48
- data/{QED.rdoc → DEMO.rdoc} +0 -0
- data/{HISTORY.rdoc → HISTORY.md} +29 -18
- data/{NOTICE.rdoc → NOTICE.md} +3 -3
- data/{README.rdoc → README.md} +52 -53
- data/lib/ae.yml +42 -29
- data/lib/ae/assertor.rb +3 -3
- data/lib/ae/legacy.rb +12 -0
- metadata +33 -25
- data/qed/01_overview.rdoc +0 -92
- data/qed/02_assertion.rdoc +0 -4
- data/qed/03_assert.rdoc +0 -298
- data/qed/04_subjunctive.rdoc +0 -100
- data/qed/05_expect.rdoc +0 -104
- data/qed/06_counts.rdoc +0 -33
- data/qed/07_matchers.rdoc +0 -34
- data/qed/08_check.rdoc +0 -63
data/qed/04_subjunctive.rdoc
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
= Subjunctives
|
2
|
-
|
3
|
-
Okay. I can hear the BDDers rumbling, "where's the *should?*"
|
4
|
-
AE has nothing against "should", but there are different
|
5
|
-
approaches for utilizing should nomenclature in specifications,
|
6
|
-
and AE wants to be open to these techniques. One of which
|
7
|
-
is how Shoulda (http://shoulda.rubyforge.org) utilizes
|
8
|
-
+should+ in a way analogous to RSpec's use of +it+.
|
9
|
-
|
10
|
-
Even so, AE provides an optional mixin called +Subjunctive+ which
|
11
|
-
can be used to create assertor methods with English subjunctive
|
12
|
-
terms, such as +should+, or +must+, +shall+ and +will+.
|
13
|
-
To load this library use:
|
14
|
-
|
15
|
-
require 'ae/subjunctive'
|
16
|
-
|
17
|
-
Then all that is required it to define a subjunctive method for all
|
18
|
-
objects. For example:
|
19
|
-
|
20
|
-
def will(*args, &block)
|
21
|
-
Assertor.new(self, :backtrace=>caller).be(*args,&block)
|
22
|
-
end
|
23
|
-
|
24
|
-
It's that easy. Because of their commonality AE provides two such terms,
|
25
|
-
+should+ and +must+ as optional add-ons out-of-the-box.
|
26
|
-
|
27
|
-
require 'ae/should'
|
28
|
-
require 'ae/must'
|
29
|
-
|
30
|
-
We will use these two methods interchangeable for the rest of this
|
31
|
-
demonstration, but to be clear they both work exactly the same way,
|
32
|
-
and almost exactly like +assert+.
|
33
|
-
|
34
|
-
Keep in mind, AE "conical" functionality does not entail the subjunctive
|
35
|
-
forms. These are simply options you can load via your <tt>test_helper.rb</tt>,
|
36
|
-
or similar script, if you prefer these nomenclatures.
|
37
|
-
|
38
|
-
|
39
|
-
== Fluent Notation and Antonyms
|
40
|
-
|
41
|
-
Like +assert+, +should+ and +must+ can be used as higher order functions.
|
42
|
-
|
43
|
-
4.should == 4
|
44
|
-
4.must == 4
|
45
|
-
|
46
|
-
Antonyms provided for +should+ as <tt>should!</tt> (read "should not") and +shouldnt+.
|
47
|
-
For +must+ +must+, they are <tt>must!</tt> and +wont+.
|
48
|
-
|
49
|
-
4.should! == 5
|
50
|
-
4.shouldnt == 5
|
51
|
-
|
52
|
-
4.must! == 5
|
53
|
-
4.wont == 5
|
54
|
-
|
55
|
-
|
56
|
-
== To Be
|
57
|
-
|
58
|
-
On occasions where the English readability of a specification is hindered,
|
59
|
-
+be+ can be used.
|
60
|
-
|
61
|
-
StandardError.must.be.raised? do
|
62
|
-
unknown_method
|
63
|
-
end
|
64
|
-
|
65
|
-
The +be+ method is the same as +assert+ with the single exception
|
66
|
-
that it will compare a lone argument to the receiver using +equate?+,
|
67
|
-
unlike +assert+ which simply checks to see that the argument evaluates
|
68
|
-
as true.
|
69
|
-
|
70
|
-
10.should.be 10
|
71
|
-
10.should.be 10.0
|
72
|
-
10.should.be Numeric
|
73
|
-
|
74
|
-
Assertion.assert.raised? do
|
75
|
-
10.should.be "40"
|
76
|
-
end
|
77
|
-
|
78
|
-
|
79
|
-
== Indefinite Articles
|
80
|
-
|
81
|
-
Additional English forms are +a+ and +an+, equivalent to +be+ except
|
82
|
-
that they use <tt>case?</tt> (same as <tt>#===</tt>) instead of
|
83
|
-
<tt>equate?</tt> when acting on a single argument.
|
84
|
-
|
85
|
-
"hi".must.be.a String
|
86
|
-
|
87
|
-
Assertion.assert.raised? do
|
88
|
-
/x/.must.be.a /x/
|
89
|
-
end
|
90
|
-
|
91
|
-
Otherwise they are interchangeable.
|
92
|
-
|
93
|
-
"hi".must.be.an.instance_of?(String)
|
94
|
-
|
95
|
-
The indefinite articles work well when a noun follows as an arguments.
|
96
|
-
|
97
|
-
palindrome = lambda{ |x| x == x.reverse }
|
98
|
-
|
99
|
-
"abracarba".must.be.a palindrome
|
100
|
-
|
data/qed/05_expect.rdoc
DELETED
@@ -1,104 +0,0 @@
|
|
1
|
-
= Expect Method
|
2
|
-
|
3
|
-
Expect is another assertion nomenclature available for use in your
|
4
|
-
tests or specifications. Inspired by Jay Fields' Expectations library,
|
5
|
-
it provides convenient syntax for creating exception and case equality
|
6
|
-
assertions.
|
7
|
-
|
8
|
-
require 'ae/expect'
|
9
|
-
|
10
|
-
|
11
|
-
== Underlying Comparison
|
12
|
-
|
13
|
-
Expect uses #=== for comparison. So providing an argument and a block to
|
14
|
-
#expect we can test for a somewhat broader range of compassion than #assert.
|
15
|
-
For example we can test for a subclass.
|
16
|
-
|
17
|
-
expect Numeric do
|
18
|
-
3
|
19
|
-
end
|
20
|
-
|
21
|
-
Assertion.assert.raised? do
|
22
|
-
expect Numeric do
|
23
|
-
"3"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
|
28
|
-
== Exception Expectation
|
29
|
-
|
30
|
-
If the comparator is an Exception class or a instance of an Exception class,
|
31
|
-
then #expect will check to see if the block raises that kind of exception.
|
32
|
-
|
33
|
-
expect StandardError do
|
34
|
-
some_undefined_method
|
35
|
-
end
|
36
|
-
|
37
|
-
expect Assertion do
|
38
|
-
expect(nil)
|
39
|
-
end
|
40
|
-
|
41
|
-
This is an important distinction to note because it means #expect can not be used
|
42
|
-
if verify instances of Exception classes.
|
43
|
-
|
44
|
-
Assertion.assert.raised? do
|
45
|
-
expect Exception do
|
46
|
-
Exception.new
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
== Regex Expectations
|
52
|
-
|
53
|
-
That #expect entails #=== also means we can check for Regexp matches.
|
54
|
-
|
55
|
-
expect /x/ do
|
56
|
-
"oooxooo"
|
57
|
-
end
|
58
|
-
|
59
|
-
|
60
|
-
== Expected Method
|
61
|
-
|
62
|
-
We can use #expected to make the receiver the object of expectation.
|
63
|
-
|
64
|
-
x = "dummy"
|
65
|
-
|
66
|
-
/x/.expected do
|
67
|
-
"x"
|
68
|
-
end
|
69
|
-
|
70
|
-
|
71
|
-
== Without Block
|
72
|
-
|
73
|
-
Without a block, the receiver is compared to the argument.
|
74
|
-
|
75
|
-
x.expect String
|
76
|
-
|
77
|
-
|
78
|
-
== Negative Forms
|
79
|
-
|
80
|
-
Like #assert, #expect has a negated form called #expect!
|
81
|
-
|
82
|
-
expect! /x/ do
|
83
|
-
"o"
|
84
|
-
end
|
85
|
-
|
86
|
-
The pure word form for those who do not like the clever use of the
|
87
|
-
explimation mark is #forbid.
|
88
|
-
|
89
|
-
forbid /x/ do
|
90
|
-
"o"
|
91
|
-
end
|
92
|
-
|
93
|
-
|
94
|
-
== Functor, or Higher Order Function
|
95
|
-
|
96
|
-
Like #assert, #expect can be used used as a *fluid* notation.
|
97
|
-
|
98
|
-
10.expect == 10
|
99
|
-
|
100
|
-
In which case it works just like #assert, including negative forms.
|
101
|
-
|
102
|
-
10.expect! == 11
|
103
|
-
10.forbid == 11
|
104
|
-
|
data/qed/06_counts.rdoc
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
= Assertion Counts
|
2
|
-
|
3
|
-
AE tracks the number of assertions made and the number that failed to pass.
|
4
|
-
We can reset the count using the +recount+ class method.
|
5
|
-
|
6
|
-
old_counts = AE::Assertor.recount
|
7
|
-
|
8
|
-
For example if we have one assertion pass and another fail.
|
9
|
-
|
10
|
-
assert(true)
|
11
|
-
|
12
|
-
expect Assertion do
|
13
|
-
assert(false)
|
14
|
-
end
|
15
|
-
|
16
|
-
We will see that AE counted three assertions and one failure.
|
17
|
-
|
18
|
-
counts = AE::Assertor.counts.dup
|
19
|
-
|
20
|
-
counts[:total].assert == 3
|
21
|
-
counts[:pass].assert == 2
|
22
|
-
counts[:fail].assert == 1
|
23
|
-
|
24
|
-
The #expect call is an assertion too, which is why the total count is 3
|
25
|
-
rather than 2.
|
26
|
-
|
27
|
-
Now that we are done checking counts we will restore them so that
|
28
|
-
any other demos being run with this will tally correctly.
|
29
|
-
|
30
|
-
AE::Assertor.recount(old_counts)
|
31
|
-
AE::Assertor.counts[:total] += 3
|
32
|
-
AE::Assertor.counts[:pass] += 3
|
33
|
-
|
data/qed/07_matchers.rdoc
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
= Matchers
|
2
|
-
|
3
|
-
Matchers are simply Procs or objects with the proper interface that can be
|
4
|
-
passed to #assert or #refute (or other Assertor) as an ecapsulated test.
|
5
|
-
|
6
|
-
== Proc or #to_proc
|
7
|
-
|
8
|
-
Passing a Proc object or an object that responds to :to_proc, will use it
|
9
|
-
as if it were a block of the method. This allows for a simple way to quickly
|
10
|
-
create reusable assertions.
|
11
|
-
|
12
|
-
palindrome = lambda{ |word| word == word.reverse }
|
13
|
-
|
14
|
-
"abracarba".assert palindrome
|
15
|
-
|
16
|
-
== #matches?
|
17
|
-
|
18
|
-
Additionally if an object responds to #matches? then the receiver
|
19
|
-
will be passed to this method to determine if the assertion passes.
|
20
|
-
|
21
|
-
palindrome = Object.new
|
22
|
-
|
23
|
-
def palindrome.matches?(word)
|
24
|
-
word == word.reverse
|
25
|
-
end
|
26
|
-
|
27
|
-
"abracarba".assert palindrome
|
28
|
-
|
29
|
-
== RSpec, Shoulda and other 3rd-Party Matchers
|
30
|
-
|
31
|
-
With tha addition of #matches?, AE supports the same interface for matchers
|
32
|
-
as RSpec. Any matcher library designed for use with RSpec should therefore
|
33
|
-
be usable with AE as well. This includes RSpecs own matchers and Shoulda's
|
34
|
-
excellent Rails matchers.
|
data/qed/08_check.rdoc
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
== Check Ok/No
|
2
|
-
|
3
|
-
The Check library is an optional library that can be used
|
4
|
-
to conveniently speed-up construction of reptitive assertions.
|
5
|
-
|
6
|
-
To use it, first require the library, then include the mixin
|
7
|
-
into the namespace in which you will utilize it.
|
8
|
-
|
9
|
-
require 'ae/check'
|
10
|
-
|
11
|
-
include AE::Check
|
12
|
-
|
13
|
-
Now we can define ok/no check procedures. A one-off procedure is
|
14
|
-
defined with a block only.
|
15
|
-
|
16
|
-
check do |x, y|
|
17
|
-
x == y
|
18
|
-
end
|
19
|
-
|
20
|
-
ok 1,1
|
21
|
-
|
22
|
-
no 1,2
|
23
|
-
|
24
|
-
To define reusable check procedures, give the procedure a name.
|
25
|
-
|
26
|
-
check :palindrome do |x|
|
27
|
-
x.reverse == x
|
28
|
-
end
|
29
|
-
|
30
|
-
This will also cause the current check method to be set.
|
31
|
-
Later in the code, the check procedure can be reset to this
|
32
|
-
by just passing the name.
|
33
|
-
|
34
|
-
check :palindrome
|
35
|
-
|
36
|
-
ok 'abracarba'
|
37
|
-
|
38
|
-
no 'foolishness'
|
39
|
-
|
40
|
-
The Check mixin comes preloaded with a few standard checks.
|
41
|
-
By default the `:equality` procedure is used.
|
42
|
-
|
43
|
-
check :equality
|
44
|
-
|
45
|
-
ok 1=>1.0
|
46
|
-
|
47
|
-
Notice the use of the hash argument here. This is a useful construct for
|
48
|
-
many check procedures becuase it it akin to the `#=>` pattern we often
|
49
|
-
see in code examples and it also allows for multiple assertions in one call.
|
50
|
-
For instance, in the case of `:equality`, multiple entries convey a
|
51
|
-
meaning of logical-or.
|
52
|
-
|
53
|
-
ok 1=>2, 1=>1
|
54
|
-
|
55
|
-
This would pass becuase the second assertion of equality is true.
|
56
|
-
|
57
|
-
Another built in check is `:case_equality` which uses `#===` instead of `#==`
|
58
|
-
to make the comparison.
|
59
|
-
|
60
|
-
check :case_equality
|
61
|
-
|
62
|
-
ok 1=>Integer
|
63
|
-
|