ae 1.2 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +0,0 @@
1
- Trans
@@ -1 +0,0 @@
1
- <proutils@googlegroups.com>
@@ -1 +0,0 @@
1
- 2008-08-17 09:00:06
@@ -1,2 +0,0 @@
1
- Assertive Expressive is an assertions library intended for reuse
2
- by any TDD, BDD or the like system.
@@ -1 +0,0 @@
1
- http://proutils.github.com/ae
@@ -1 +0,0 @@
1
- LGPLv3
data/meta/name DELETED
@@ -1 +0,0 @@
1
- ae
@@ -1 +0,0 @@
1
- 2009-09-03
@@ -1 +0,0 @@
1
- git://github.com/proutils/ae.git
data/meta/ruby DELETED
@@ -1,2 +0,0 @@
1
- - 1.8.6
2
- - 1.8.7
data/meta/suite DELETED
@@ -1 +0,0 @@
1
- proutils
@@ -1 +0,0 @@
1
- Assertive Expressive
data/meta/title DELETED
@@ -1 +0,0 @@
1
- AE
@@ -1 +0,0 @@
1
- 1.2
@@ -1,92 +0,0 @@
1
- = Introduction
2
-
3
- AE is an assertions framework for Ruby. It's designed
4
- around the concept of an Assertor. The Assertor is an
5
- Assertion Functor, or Higher-Order Function, which
6
- reroutes method calls while monitoring them for failing
7
- conditions.
8
-
9
-
10
- == What's Provided
11
-
12
- Requiring the AE library.
13
-
14
- require 'ae'
15
-
16
- Loads two classes, +Assertion+ and +Assertor+, the Kernel
17
- method +assert+ and it's ancillaries <tt>assert!</tt> and +refute+
18
- and a set of core extensions that make writing certain types
19
- of assertions easier.
20
-
21
-
22
- == Assertion and Assertor Classes
23
-
24
- The +Assertion+ class is at the heart of AE. All other AE
25
- methods depend on it. The +Assertion+ class is a subclass
26
- of Exception. When an assertion is made and fails, it is
27
- an instance of Assertion that is raised.
28
-
29
- Assertion.assert.raised? do
30
- msg = "my failure message"
31
- assert false, msg
32
- end
33
-
34
- Like any raised exception, the last Assertion message is available
35
- via <tt>$!</tt>.
36
-
37
- (FYI, in Test::Unit the equivalent class was called +AssertionFailedError+.)
38
-
39
- Assertions themselves are not generally used in creating tests or
40
- behavior specifications. Rather they are used to create additional
41
- types of assertion methods.
42
-
43
- As mentioned above the +Assertor+ class is a type of Higher-Order
44
- function, or Functor, which intercedes with a normal message
45
- invocation to monitor for failed conditions, upon which is raises
46
- Assertion exceptions.
47
-
48
-
49
- == Assertion Methods
50
-
51
- The three methods, +assert+, <tt>assert!</tt> and +refute+ all
52
- return an Assertor instance when used fluidly, i.e. magic-dot
53
- notation, higher-order notation, functor notation, whatever you
54
- prefer to call it.
55
-
56
- assert(Assertor === assert)
57
-
58
- Through the use of +method_missing+, the Assertor allows us to write
59
- statements like:
60
-
61
- 1.assert == 1
62
-
63
- If the operation evaluates to false or nil, then an Assertion error
64
- is raised.
65
-
66
- Assertion.assert.raised? do
67
- 1.assert == 2
68
- end
69
-
70
- The methods <tt>assert!</tt> and +refute+ are just like +assert+
71
- expect they purport the negative condition. Patterned after Ruby's
72
- own use of "<tt>!</tt>" as meaning +not+, <tt>assert!</tt> should be
73
- read "assert not". While +refute+ exists for the sake of those who
74
- find the use of a bang method for this purpose unsuited to them.
75
-
76
-
77
- == How It Works
78
-
79
- An Assertor essentially sits in wait for a method call (via
80
- method_missing). When that happens it applies the method to the
81
- original receiver, but wrapped in a clause that raises an
82
- Assertion should the statement fail. If we wanted to be
83
- pedantic, we could write our assertions like:
84
-
85
- raise Assertion.new("1 != 1") unless 1 == 1
86
-
87
- Instead of
88
-
89
- 1.assert == 1
90
-
91
- Obviously using Assertor methods are whole lot more concise.
92
-
@@ -1 +0,0 @@
1
-
@@ -1,284 +0,0 @@
1
- = Assert Method
2
-
3
- == Compatible with Test::Unit
4
-
5
- The +assert+ method is designed to be backward compatible
6
- with the same method in <tt>Test::Unit</tt>.
7
-
8
- Using an argument, +assert+ will check that an argument evaluates
9
- to true. Optionally one can send along a meaningful message should
10
- the assertion fail.
11
-
12
- assert(true, "Not true!")
13
-
14
- Assertion.assert.raised? do
15
- assert(false, "Not true!")
16
- end
17
-
18
-
19
- == Assert with a Block
20
-
21
- In addition +assert+ has been extended to accept a block. Like the case of the
22
- argument, the block is expected to return something that evaluates as true.
23
-
24
- assert do
25
- true
26
- end
27
-
28
- Assertion.assert.raised? do
29
- assert do
30
- false
31
- end
32
- end
33
-
34
- We should also mention that, while probably not very useful, since
35
- the arity of a block can be checked, one can also pass the receiver
36
- into the block as a block argument.
37
-
38
- "hi".assert do |s|
39
- /h/ =~ s
40
- end
41
-
42
-
43
- == Antonyms for Assert
44
-
45
- We can state the opposite assertion using <tt>assert!</tt>.
46
-
47
- 10.assert! == 9
48
-
49
- Or, because some people do not like the use of a bang method, +refute+.
50
-
51
- 10.refute == 9
52
-
53
- These terms can be used just as +assert+ is used in all examples,
54
- but with the opposite inference.
55
-
56
- Another way to get the opposite inference, is to use +not+.
57
-
58
- 10.assert.not == 9
59
-
60
-
61
- == Identity Assertions
62
-
63
- Rather then the general form:
64
-
65
- x = 10
66
- x.assert.object_id == x.object_id
67
-
68
- We can use Ruby's own <tt>equal?</tt> method.
69
-
70
- x.assert.equal?(x)
71
-
72
- AE provides <tt>identical?</tt> method as an alternative
73
- to make it a bit more clear.
74
-
75
- x.assert.identical?(x)
76
-
77
-
78
- == Equality Assertions
79
-
80
- The most common assertion is that of value equality (<tt>==</tt>),
81
- as we have seen throughout this document. But other forms of
82
- equality can be verified as easily. We have already mentioned
83
- identity. In addition there is <i>type equality</i>.
84
-
85
- 17.assert.eql? 17
86
-
87
- Assertion.assert.raised? do
88
- 17.assert.eql? 17.0
89
- end
90
-
91
- And there is <i>case equality</i>.
92
-
93
- Numeric.assert === 3
94
-
95
-
96
- == Checking Equality with a Block
97
-
98
- Because operators can not take blocks, and at times blocks can
99
- be convenient means of supplying a value to an assertion,
100
- AE has defined alternate renditions of the equality methods.
101
- For equal? and eql?, the method names are the same, they simply
102
- can take a block in place of an argument if need be.
103
-
104
- For <i>value equality</i> (<tt>==</tt>), the method is called <tt>eq?</tt>.
105
-
106
- 10.assert.eq? do
107
- 10.0
108
- end
109
-
110
- And should it fail...
111
-
112
- Assertion.assert.raised? do
113
- 10.assert.eq? do
114
- 20
115
- end
116
- end
117
-
118
- == Case Equality
119
-
120
- For <i>case equality</i> (<tt>===</tt>), it is <tt>case?</tt>.
121
-
122
- Numeric.assert.case? do
123
- "3".to_i
124
- end
125
-
126
- Assertion.assert.raised? do
127
- Numeric.assert.case? do
128
- "3"
129
- end
130
- end
131
-
132
-
133
- == Regular Expressions
134
-
135
- Regular Expressions can be used to make assertions in much the same way as equality.
136
-
137
- /i/.assert =~ "i"
138
-
139
- Assertion.assert.raised? do
140
- /i/.assert =~ "g"
141
- end
142
-
143
- Conversely the String class recognizes the #=~ method as well.
144
-
145
- "i".assert =~ /i/
146
-
147
- Assertion.assert.raised? do
148
- "i".assert =~ /g/
149
- end
150
-
151
-
152
- == Exception Assertions
153
-
154
- Validating errors is easy too, as has already been shown
155
- in the document to verify assertion failures.
156
-
157
- StandardError.assert.raised? do
158
- unknown_method
159
- end
160
-
161
-
162
- == Assertions on Object State
163
-
164
- While testing or specifying the internal state of an object is
165
- generally considered poor form, there are times when it is
166
- necessary. Assert combined with +instance_eval+ makes it easy too.
167
-
168
- class X
169
- attr :a
170
- def initialize(a); @a = a; end
171
- end
172
-
173
- x = X.new(1)
174
-
175
- x.assert.instance_eval do
176
- @a == 1
177
- end
178
-
179
-
180
- == Catch/Try Assertions
181
-
182
- Catch/Try throws can be tested via <tt>Symbol#thrown?</tt>.
183
-
184
- :hookme.assert.thrown? do
185
- throw :hookme
186
- end
187
-
188
- Alternatively, a lambda containing the potential throw
189
- can be the receiver using <tt>throws?</tt>.
190
-
191
- hook = lambda{ throw :hookme }
192
-
193
- hook.assert.throws?(:hookme)
194
-
195
-
196
- == Assertions on Proc Changes
197
-
198
- I have to admit I'm not sure how this is useful,
199
- but I found it in the Bacon API and ported it over
200
- just for sake of thoroughness.
201
-
202
- a = 0
203
-
204
- l = lambda{ a }
205
-
206
- l.assert.change?{ a +=1 }
207
-
208
-
209
- == Assertion on literal True, False and Nil
210
-
211
- Ruby already provides the #nil? method.
212
-
213
- nil.assert.nil?
214
-
215
- AE adds <tt>true?</tt> and <tt>false?</tt> which acts accordingly.
216
-
217
- true.assert.true?
218
- false.assert.false?
219
-
220
-
221
- == Send Assertions
222
-
223
- Assert that a method can be successfully called.
224
-
225
- "STRING".assert.send?(:upcase)
226
-
227
-
228
- == Numeric Delta and Epsilon
229
-
230
- You may wish to assert that a numeric value is with some
231
- range.
232
-
233
- 3.in_delta?(1,5)
234
-
235
- Or minimum range.
236
-
237
- 3.in_epsilon?(3,5)
238
-
239
-
240
- == Custom Lambda Assertions
241
-
242
- Passing a lambda to the subjunctive method, will use it as if it were
243
- a block of the method. This allows for a simple way to quickly
244
- create reusable assertions.
245
-
246
- palindrome = lambda{ |x| x == x.reverse }
247
-
248
- "abracarba".assert palindrome
249
-
250
-
251
- == Verifying Object State
252
-
253
- NOTE: <i>This functionality is not currently supported, but is being
254
- considered for a future version.</i>
255
-
256
- If no block parameter is designated and the receiver differs from +self+
257
- in scope of the given block, then the block is evaluated in the scope of
258
- the receiver via +instance_eval+. This can be also be used to verify the
259
- state of an object.
260
-
261
- class X
262
- attr :a
263
- def initialize(a); @a = a; end
264
- end
265
-
266
- x = X.new(4)
267
-
268
- x.assert do
269
- 4 == @a
270
- end
271
-
272
- And should it fail...
273
-
274
- Assertion.assert.raised? do
275
- x.assert do
276
- 5 == @a
277
- end
278
- end
279
-
280
- For some this might be considered poor form, i.e. to test underlying
281
- implementation. You will get no argument here. It should be used
282
- thoughtfully, but I would not bet against there being occasions
283
- when such validations might be handy.
284
-
@@ -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 a 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/subjunctive/should'
28
- require 'ae/subjunctive/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
-