ruby-contract 0.1.1
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/COPYING +56 -0
- data/Manifest +85 -0
- data/README +32 -0
- data/TODO +83 -0
- data/doc/classes/Contract.html +599 -0
- data/doc/classes/Contract/Check.html +229 -0
- data/doc/classes/Contract/Check/All.html +172 -0
- data/doc/classes/Contract/Check/Any.html +172 -0
- data/doc/classes/Contract/Check/Block.html +172 -0
- data/doc/classes/Contract/Check/None.html +173 -0
- data/doc/classes/Contract/Check/Quack.html +172 -0
- data/doc/classes/Contract/ContractError.html +151 -0
- data/doc/classes/Contract/ContractException.html +162 -0
- data/doc/classes/Contract/ContractMismatch.html +134 -0
- data/doc/classes/Kernel.html +256 -0
- data/doc/classes/Method.html +135 -0
- data/doc/classes/MethodSignatureMixin.html +208 -0
- data/doc/classes/Module.html +526 -0
- data/doc/created.rid +1 -0
- data/doc/dot/f_0.dot +14 -0
- data/doc/dot/f_0.png +0 -0
- data/doc/dot/f_1.dot +14 -0
- data/doc/dot/f_1.png +0 -0
- data/doc/dot/f_2.dot +14 -0
- data/doc/dot/f_2.png +0 -0
- data/doc/dot/f_3.dot +112 -0
- data/doc/dot/f_3.png +0 -0
- data/doc/dot/f_4.dot +62 -0
- data/doc/dot/f_4.png +0 -0
- data/doc/dot/f_5.dot +62 -0
- data/doc/dot/f_5.png +0 -0
- data/doc/dot/f_6.dot +224 -0
- data/doc/dot/f_6.png +0 -0
- data/doc/dot/f_6_0.dot +24 -0
- data/doc/dot/f_6_0.png +0 -0
- data/doc/dot/f_6_1.dot +24 -0
- data/doc/dot/f_6_1.png +0 -0
- data/doc/dot/f_7.dot +62 -0
- data/doc/dot/f_7.png +0 -0
- data/doc/files/COPYING.html +168 -0
- data/doc/files/README.html +146 -0
- data/doc/files/TODO.html +240 -0
- data/doc/files/lib/contract/assertions_rb.html +118 -0
- data/doc/files/lib/contract/exception_rb.html +125 -0
- data/doc/files/lib/contract/integration_rb.html +130 -0
- data/doc/files/lib/contract/overrides_rb.html +118 -0
- data/doc/files/lib/contract_rb.html +127 -0
- data/doc/fr_class_index.html +40 -0
- data/doc/fr_file_index.html +34 -0
- data/doc/fr_method_index.html +45 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/contract.rb +146 -0
- data/lib/contract/assertions.rb +42 -0
- data/lib/contract/exception.rb +95 -0
- data/lib/contract/integration.rb +664 -0
- data/lib/contract/overrides.rb +41 -0
- data/setup.rb +1360 -0
- data/test/coverage/_-lib-contract-assertions_rb.html +526 -0
- data/test/coverage/_-lib-contract-exception_rb.html +632 -0
- data/test/coverage/_-lib-contract-integration_rb.html +1450 -0
- data/test/coverage/_-lib-contract-overrides_rb.html +524 -0
- data/test/coverage/_-lib-contract_rb.html +724 -0
- data/test/coverage/__-lib-contract-assertions_rb.html +484 -0
- data/test/coverage/__-lib-contract-exception_rb.html +537 -0
- data/test/coverage/__-lib-contract-integration_rb.html +946 -0
- data/test/coverage/__-lib-contract-overrides_rb.html +483 -0
- data/test/coverage/__-lib-contract_rb.html +583 -0
- data/test/coverage/index.html +93 -0
- data/test/tc_all.rb +8 -0
- data/test/tc_contract.rb +109 -0
- data/test/tc_exception.rb +43 -0
- data/test/tc_integration.rb +357 -0
- metadata +136 -0
@@ -0,0 +1,632 @@
|
|
1
|
+
<?xml version="1.0" encoding="ISO-8859-15"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
3
|
+
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
4
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
5
|
+
<head><title>./lib/contract/exception.rb - coverage</title>
|
6
|
+
<style type="text/css">body {
|
7
|
+
background-color: rgb(180, 180, 180);
|
8
|
+
}
|
9
|
+
span.marked {
|
10
|
+
background-color: rgb(185, 200, 200);
|
11
|
+
display: block;
|
12
|
+
}
|
13
|
+
span.inferred {
|
14
|
+
background-color: rgb(180, 195, 195);
|
15
|
+
display: block;
|
16
|
+
}
|
17
|
+
span.run0 {
|
18
|
+
background-color: rgb(178, 204, 255);
|
19
|
+
display: block;
|
20
|
+
}
|
21
|
+
span.run1 {
|
22
|
+
background-color: rgb(178, 206, 255);
|
23
|
+
display: block;
|
24
|
+
}
|
25
|
+
span.run2 {
|
26
|
+
background-color: rgb(178, 209, 255);
|
27
|
+
display: block;
|
28
|
+
}
|
29
|
+
span.run3 {
|
30
|
+
background-color: rgb(178, 211, 255);
|
31
|
+
display: block;
|
32
|
+
}
|
33
|
+
span.run4 {
|
34
|
+
background-color: rgb(178, 214, 255);
|
35
|
+
display: block;
|
36
|
+
}
|
37
|
+
span.run5 {
|
38
|
+
background-color: rgb(178, 218, 255);
|
39
|
+
display: block;
|
40
|
+
}
|
41
|
+
span.run6 {
|
42
|
+
background-color: rgb(178, 220, 255);
|
43
|
+
display: block;
|
44
|
+
}
|
45
|
+
span.run7 {
|
46
|
+
background-color: rgb(178, 223, 255);
|
47
|
+
display: block;
|
48
|
+
}
|
49
|
+
span.run8 {
|
50
|
+
background-color: rgb(178, 225, 255);
|
51
|
+
display: block;
|
52
|
+
}
|
53
|
+
span.run9 {
|
54
|
+
background-color: rgb(178, 228, 255);
|
55
|
+
display: block;
|
56
|
+
}
|
57
|
+
span.run10 {
|
58
|
+
background-color: rgb(178, 232, 255);
|
59
|
+
display: block;
|
60
|
+
}
|
61
|
+
span.run11 {
|
62
|
+
background-color: rgb(178, 234, 255);
|
63
|
+
display: block;
|
64
|
+
}
|
65
|
+
span.run12 {
|
66
|
+
background-color: rgb(178, 237, 255);
|
67
|
+
display: block;
|
68
|
+
}
|
69
|
+
span.run13 {
|
70
|
+
background-color: rgb(178, 239, 255);
|
71
|
+
display: block;
|
72
|
+
}
|
73
|
+
span.run14 {
|
74
|
+
background-color: rgb(178, 242, 255);
|
75
|
+
display: block;
|
76
|
+
}
|
77
|
+
span.run15 {
|
78
|
+
background-color: rgb(178, 246, 255);
|
79
|
+
display: block;
|
80
|
+
}
|
81
|
+
span.run16 {
|
82
|
+
background-color: rgb(178, 248, 255);
|
83
|
+
display: block;
|
84
|
+
}
|
85
|
+
span.run17 {
|
86
|
+
background-color: rgb(178, 251, 255);
|
87
|
+
display: block;
|
88
|
+
}
|
89
|
+
span.run18 {
|
90
|
+
background-color: rgb(178, 253, 255);
|
91
|
+
display: block;
|
92
|
+
}
|
93
|
+
span.run19 {
|
94
|
+
background-color: rgb(178, 255, 253);
|
95
|
+
display: block;
|
96
|
+
}
|
97
|
+
span.run20 {
|
98
|
+
background-color: rgb(178, 255, 249);
|
99
|
+
display: block;
|
100
|
+
}
|
101
|
+
span.run21 {
|
102
|
+
background-color: rgb(178, 255, 247);
|
103
|
+
display: block;
|
104
|
+
}
|
105
|
+
span.run22 {
|
106
|
+
background-color: rgb(178, 255, 244);
|
107
|
+
display: block;
|
108
|
+
}
|
109
|
+
span.run23 {
|
110
|
+
background-color: rgb(178, 255, 242);
|
111
|
+
display: block;
|
112
|
+
}
|
113
|
+
span.run24 {
|
114
|
+
background-color: rgb(178, 255, 239);
|
115
|
+
display: block;
|
116
|
+
}
|
117
|
+
span.run25 {
|
118
|
+
background-color: rgb(178, 255, 235);
|
119
|
+
display: block;
|
120
|
+
}
|
121
|
+
span.run26 {
|
122
|
+
background-color: rgb(178, 255, 233);
|
123
|
+
display: block;
|
124
|
+
}
|
125
|
+
span.run27 {
|
126
|
+
background-color: rgb(178, 255, 230);
|
127
|
+
display: block;
|
128
|
+
}
|
129
|
+
span.run28 {
|
130
|
+
background-color: rgb(178, 255, 228);
|
131
|
+
display: block;
|
132
|
+
}
|
133
|
+
span.run29 {
|
134
|
+
background-color: rgb(178, 255, 225);
|
135
|
+
display: block;
|
136
|
+
}
|
137
|
+
span.run30 {
|
138
|
+
background-color: rgb(178, 255, 221);
|
139
|
+
display: block;
|
140
|
+
}
|
141
|
+
span.run31 {
|
142
|
+
background-color: rgb(178, 255, 219);
|
143
|
+
display: block;
|
144
|
+
}
|
145
|
+
span.run32 {
|
146
|
+
background-color: rgb(178, 255, 216);
|
147
|
+
display: block;
|
148
|
+
}
|
149
|
+
span.run33 {
|
150
|
+
background-color: rgb(178, 255, 214);
|
151
|
+
display: block;
|
152
|
+
}
|
153
|
+
span.run34 {
|
154
|
+
background-color: rgb(178, 255, 211);
|
155
|
+
display: block;
|
156
|
+
}
|
157
|
+
span.run35 {
|
158
|
+
background-color: rgb(178, 255, 207);
|
159
|
+
display: block;
|
160
|
+
}
|
161
|
+
span.run36 {
|
162
|
+
background-color: rgb(178, 255, 205);
|
163
|
+
display: block;
|
164
|
+
}
|
165
|
+
span.run37 {
|
166
|
+
background-color: rgb(178, 255, 202);
|
167
|
+
display: block;
|
168
|
+
}
|
169
|
+
span.run38 {
|
170
|
+
background-color: rgb(178, 255, 200);
|
171
|
+
display: block;
|
172
|
+
}
|
173
|
+
span.run39 {
|
174
|
+
background-color: rgb(178, 255, 197);
|
175
|
+
display: block;
|
176
|
+
}
|
177
|
+
span.run40 {
|
178
|
+
background-color: rgb(178, 255, 193);
|
179
|
+
display: block;
|
180
|
+
}
|
181
|
+
span.run41 {
|
182
|
+
background-color: rgb(178, 255, 191);
|
183
|
+
display: block;
|
184
|
+
}
|
185
|
+
span.run42 {
|
186
|
+
background-color: rgb(178, 255, 188);
|
187
|
+
display: block;
|
188
|
+
}
|
189
|
+
span.run43 {
|
190
|
+
background-color: rgb(178, 255, 186);
|
191
|
+
display: block;
|
192
|
+
}
|
193
|
+
span.run44 {
|
194
|
+
background-color: rgb(178, 255, 183);
|
195
|
+
display: block;
|
196
|
+
}
|
197
|
+
span.run45 {
|
198
|
+
background-color: rgb(178, 255, 179);
|
199
|
+
display: block;
|
200
|
+
}
|
201
|
+
span.run46 {
|
202
|
+
background-color: rgb(179, 255, 178);
|
203
|
+
display: block;
|
204
|
+
}
|
205
|
+
span.run47 {
|
206
|
+
background-color: rgb(182, 255, 178);
|
207
|
+
display: block;
|
208
|
+
}
|
209
|
+
span.run48 {
|
210
|
+
background-color: rgb(184, 255, 178);
|
211
|
+
display: block;
|
212
|
+
}
|
213
|
+
span.run49 {
|
214
|
+
background-color: rgb(187, 255, 178);
|
215
|
+
display: block;
|
216
|
+
}
|
217
|
+
span.run50 {
|
218
|
+
background-color: rgb(191, 255, 178);
|
219
|
+
display: block;
|
220
|
+
}
|
221
|
+
span.run51 {
|
222
|
+
background-color: rgb(193, 255, 178);
|
223
|
+
display: block;
|
224
|
+
}
|
225
|
+
span.run52 {
|
226
|
+
background-color: rgb(196, 255, 178);
|
227
|
+
display: block;
|
228
|
+
}
|
229
|
+
span.run53 {
|
230
|
+
background-color: rgb(198, 255, 178);
|
231
|
+
display: block;
|
232
|
+
}
|
233
|
+
span.run54 {
|
234
|
+
background-color: rgb(201, 255, 178);
|
235
|
+
display: block;
|
236
|
+
}
|
237
|
+
span.run55 {
|
238
|
+
background-color: rgb(205, 255, 178);
|
239
|
+
display: block;
|
240
|
+
}
|
241
|
+
span.run56 {
|
242
|
+
background-color: rgb(207, 255, 178);
|
243
|
+
display: block;
|
244
|
+
}
|
245
|
+
span.run57 {
|
246
|
+
background-color: rgb(210, 255, 178);
|
247
|
+
display: block;
|
248
|
+
}
|
249
|
+
span.run58 {
|
250
|
+
background-color: rgb(212, 255, 178);
|
251
|
+
display: block;
|
252
|
+
}
|
253
|
+
span.run59 {
|
254
|
+
background-color: rgb(215, 255, 178);
|
255
|
+
display: block;
|
256
|
+
}
|
257
|
+
span.run60 {
|
258
|
+
background-color: rgb(219, 255, 178);
|
259
|
+
display: block;
|
260
|
+
}
|
261
|
+
span.run61 {
|
262
|
+
background-color: rgb(221, 255, 178);
|
263
|
+
display: block;
|
264
|
+
}
|
265
|
+
span.run62 {
|
266
|
+
background-color: rgb(224, 255, 178);
|
267
|
+
display: block;
|
268
|
+
}
|
269
|
+
span.run63 {
|
270
|
+
background-color: rgb(226, 255, 178);
|
271
|
+
display: block;
|
272
|
+
}
|
273
|
+
span.run64 {
|
274
|
+
background-color: rgb(229, 255, 178);
|
275
|
+
display: block;
|
276
|
+
}
|
277
|
+
span.run65 {
|
278
|
+
background-color: rgb(233, 255, 178);
|
279
|
+
display: block;
|
280
|
+
}
|
281
|
+
span.run66 {
|
282
|
+
background-color: rgb(235, 255, 178);
|
283
|
+
display: block;
|
284
|
+
}
|
285
|
+
span.run67 {
|
286
|
+
background-color: rgb(238, 255, 178);
|
287
|
+
display: block;
|
288
|
+
}
|
289
|
+
span.run68 {
|
290
|
+
background-color: rgb(240, 255, 178);
|
291
|
+
display: block;
|
292
|
+
}
|
293
|
+
span.run69 {
|
294
|
+
background-color: rgb(243, 255, 178);
|
295
|
+
display: block;
|
296
|
+
}
|
297
|
+
span.run70 {
|
298
|
+
background-color: rgb(247, 255, 178);
|
299
|
+
display: block;
|
300
|
+
}
|
301
|
+
span.run71 {
|
302
|
+
background-color: rgb(249, 255, 178);
|
303
|
+
display: block;
|
304
|
+
}
|
305
|
+
span.run72 {
|
306
|
+
background-color: rgb(252, 255, 178);
|
307
|
+
display: block;
|
308
|
+
}
|
309
|
+
span.run73 {
|
310
|
+
background-color: rgb(255, 255, 178);
|
311
|
+
display: block;
|
312
|
+
}
|
313
|
+
span.run74 {
|
314
|
+
background-color: rgb(255, 252, 178);
|
315
|
+
display: block;
|
316
|
+
}
|
317
|
+
span.run75 {
|
318
|
+
background-color: rgb(255, 248, 178);
|
319
|
+
display: block;
|
320
|
+
}
|
321
|
+
span.run76 {
|
322
|
+
background-color: rgb(255, 246, 178);
|
323
|
+
display: block;
|
324
|
+
}
|
325
|
+
span.run77 {
|
326
|
+
background-color: rgb(255, 243, 178);
|
327
|
+
display: block;
|
328
|
+
}
|
329
|
+
span.run78 {
|
330
|
+
background-color: rgb(255, 240, 178);
|
331
|
+
display: block;
|
332
|
+
}
|
333
|
+
span.run79 {
|
334
|
+
background-color: rgb(255, 238, 178);
|
335
|
+
display: block;
|
336
|
+
}
|
337
|
+
span.run80 {
|
338
|
+
background-color: rgb(255, 234, 178);
|
339
|
+
display: block;
|
340
|
+
}
|
341
|
+
span.run81 {
|
342
|
+
background-color: rgb(255, 232, 178);
|
343
|
+
display: block;
|
344
|
+
}
|
345
|
+
span.run82 {
|
346
|
+
background-color: rgb(255, 229, 178);
|
347
|
+
display: block;
|
348
|
+
}
|
349
|
+
span.run83 {
|
350
|
+
background-color: rgb(255, 226, 178);
|
351
|
+
display: block;
|
352
|
+
}
|
353
|
+
span.run84 {
|
354
|
+
background-color: rgb(255, 224, 178);
|
355
|
+
display: block;
|
356
|
+
}
|
357
|
+
span.run85 {
|
358
|
+
background-color: rgb(255, 220, 178);
|
359
|
+
display: block;
|
360
|
+
}
|
361
|
+
span.run86 {
|
362
|
+
background-color: rgb(255, 218, 178);
|
363
|
+
display: block;
|
364
|
+
}
|
365
|
+
span.run87 {
|
366
|
+
background-color: rgb(255, 215, 178);
|
367
|
+
display: block;
|
368
|
+
}
|
369
|
+
span.run88 {
|
370
|
+
background-color: rgb(255, 212, 178);
|
371
|
+
display: block;
|
372
|
+
}
|
373
|
+
span.run89 {
|
374
|
+
background-color: rgb(255, 210, 178);
|
375
|
+
display: block;
|
376
|
+
}
|
377
|
+
span.run90 {
|
378
|
+
background-color: rgb(255, 206, 178);
|
379
|
+
display: block;
|
380
|
+
}
|
381
|
+
span.run91 {
|
382
|
+
background-color: rgb(255, 204, 178);
|
383
|
+
display: block;
|
384
|
+
}
|
385
|
+
span.run92 {
|
386
|
+
background-color: rgb(255, 201, 178);
|
387
|
+
display: block;
|
388
|
+
}
|
389
|
+
span.run93 {
|
390
|
+
background-color: rgb(255, 198, 178);
|
391
|
+
display: block;
|
392
|
+
}
|
393
|
+
span.run94 {
|
394
|
+
background-color: rgb(255, 196, 178);
|
395
|
+
display: block;
|
396
|
+
}
|
397
|
+
span.run95 {
|
398
|
+
background-color: rgb(255, 192, 178);
|
399
|
+
display: block;
|
400
|
+
}
|
401
|
+
span.run96 {
|
402
|
+
background-color: rgb(255, 189, 178);
|
403
|
+
display: block;
|
404
|
+
}
|
405
|
+
span.run97 {
|
406
|
+
background-color: rgb(255, 187, 178);
|
407
|
+
display: block;
|
408
|
+
}
|
409
|
+
span.run98 {
|
410
|
+
background-color: rgb(255, 184, 178);
|
411
|
+
display: block;
|
412
|
+
}
|
413
|
+
span.run99 {
|
414
|
+
background-color: rgb(255, 182, 178);
|
415
|
+
display: block;
|
416
|
+
}
|
417
|
+
|
418
|
+
div.overview {
|
419
|
+
border-bottom: 8px solid black;
|
420
|
+
}
|
421
|
+
</style></head>
|
422
|
+
<body><div class="overview">
|
423
|
+
<table>
|
424
|
+
<tr><td>filename</td><td><tt>./lib/contract/exception.rb</tt></td></tr>
|
425
|
+
<tr><td>total coverage</td><td>50.0</td></tr>
|
426
|
+
<tr><td>code coverage</td><td>50.0</td></tr>
|
427
|
+
</table>
|
428
|
+
</div>
|
429
|
+
<pre><span class="inferred"> 1 # This file contains things needed to map Test::Unit status objects to
|
430
|
+
2 # Exceptions, Exception related infrastructure and similar things.
|
431
|
+
3 #
|
432
|
+
4 # See Contract::ContractException, Contract::ContractMismatch and
|
433
|
+
5 # Contract::ContractError.
|
434
|
+
6
|
435
|
+
7
|
436
|
+
</span><span class="marked"> 8 class Contract < Test::Unit::TestCase
|
437
|
+
</span><span class="inferred"> 9 # Exceptions raised by Contract contain some useful meta-information.
|
438
|
+
10 # This module is mixed into Exceptions that provide such information.
|
439
|
+
</span><span class="marked"> 11 module ContractException
|
440
|
+
</span><span class="inferred"> 12 def ce_initialize(original_message, backtrace, test_object,
|
441
|
+
</span><span class="marked"> 13 test_method, test_contract, *more) # :nodoc:
|
442
|
+
14 @original_message = original_message
|
443
|
+
15 message = original_message.dup
|
444
|
+
16 detail = " for #{test_object.inspect} in " +
|
445
|
+
</span><span class="inferred"> 17 "#{test_contract.inspect}"
|
446
|
+
</span><span class="marked"> 18 message[/(\s*)[.!?]?\s*\Z/, 1] = detail
|
447
|
+
19 Exception.instance_method(:initialize).bind(self).call(message)
|
448
|
+
</span><span class="inferred"> 20
|
449
|
+
</span><span class="marked"> 21 set_backtrace(backtrace)
|
450
|
+
22 @test_object = test_object
|
451
|
+
23 @test_method = test_method
|
452
|
+
24 @test_contract = test_contract
|
453
|
+
</span><span class="inferred"> 25 end
|
454
|
+
</span><span class="marked"> 26 private :ce_initialize
|
455
|
+
</span><span class="inferred"> 27
|
456
|
+
28 # What object was tested when this Exception was raised?
|
457
|
+
</span><span class="marked"> 29 attr_reader :test_object
|
458
|
+
</span><span class="inferred"> 30 # What method implemented that test?
|
459
|
+
</span><span class="marked"> 31 attr_reader :test_method
|
460
|
+
</span><span class="inferred"> 32 # What contract was that method part of?
|
461
|
+
</span><span class="marked"> 33 attr_reader :test_contract
|
462
|
+
</span><span class="inferred"> 34 # The original, unfiltered exception message.
|
463
|
+
</span><span class="marked"> 35 attr_reader :original_message
|
464
|
+
</span><span class="inferred"> 36 end
|
465
|
+
37
|
466
|
+
38 # Represents a failed test in a contract. This means that an object
|
467
|
+
39 # simply does not fulfill one of the parts of a contract. Subclass of
|
468
|
+
40 # TypeError.
|
469
|
+
</span><span class="marked"> 41 class ContractMismatch < TypeError
|
470
|
+
42 def initialize(*args) # :nodoc:
|
471
|
+
43 ce_initialize(*args)
|
472
|
+
</span><span class="inferred"> 44 end
|
473
|
+
45
|
474
|
+
</span><span class="marked"> 46 include ContractException
|
475
|
+
</span><span class="inferred"> 47 end
|
476
|
+
48
|
477
|
+
49 # Represents an unexpected failure while processing a contract test.
|
478
|
+
50 # This is more critical than ContractMismatch and usually means that
|
479
|
+
51 # something is wrong with the test itself.
|
480
|
+
</span><span class="marked"> 52 class ContractError < StandardError
|
481
|
+
53 def initialize(*args) # :nodoc:
|
482
|
+
54 @type = args.pop
|
483
|
+
55 ce_initialize(*args)
|
484
|
+
</span><span class="inferred"> 56 end
|
485
|
+
57
|
486
|
+
58 # The type of the original Exception that triggered the unexpected
|
487
|
+
59 # failure.
|
488
|
+
</span><span class="marked"> 60 attr_reader :type
|
489
|
+
</span><span class="inferred"> 61
|
490
|
+
</span><span class="marked"> 62 include ContractException
|
491
|
+
</span><span class="inferred"> 63 end
|
492
|
+
64
|
493
|
+
65
|
494
|
+
66 # Maps a Test::Unit::Failure instance to an actual Exception with the
|
495
|
+
67 # specified meta data.
|
496
|
+
</span><span class="marked"> 68 def self.failure_to_exception(failure, object, contract) # :nodoc:
|
497
|
+
69 ContractMismatch.new(failure.message, failure.location, object,
|
498
|
+
</span><span class="inferred"> 70 extract_method_name(failure.test_name), contract)
|
499
|
+
71 end
|
500
|
+
72
|
501
|
+
73 # Maps a Test::Unit::Error instance to an actual Exception with the
|
502
|
+
74 # specified meta data.
|
503
|
+
</span><span class="marked"> 75 def self.error_to_exception(error, object, contract) # :nodoc:
|
504
|
+
76 original = error.exception
|
505
|
+
77 ContractError.new(original.message, original.backtrace, object,
|
506
|
+
</span><span class="inferred"> 78 extract_method_name(error.test_name), contract, original.class)
|
507
|
+
79 end
|
508
|
+
80
|
509
|
+
81 # Maps a Test::Unit fault (either a Failure or Error) to an actual
|
510
|
+
82 # exception with the specified meta data.
|
511
|
+
</span><span class="marked"> 83 def self.fault_to_exception(fault, *args) # :nodoc:
|
512
|
+
84 if fault.is_a?(Test::Unit::Failure) then
|
513
|
+
85 failure_to_exception(fault, *args)
|
514
|
+
</span><span class="inferred"> 86 else
|
515
|
+
</span><span class="marked"> 87 error_to_exception(fault, *args)
|
516
|
+
</span><span class="inferred"> 88 end
|
517
|
+
89 end
|
518
|
+
90
|
519
|
+
91 # Extracts the method name from a Test::Unit test_name style String.
|
520
|
+
</span><span class="marked"> 92 def self.extract_method_name(test_name) # :nodoc:
|
521
|
+
93 test_name[/\A(.+?)\(.+?\)\Z/, 1]
|
522
|
+
</span><span class="inferred"> 94 end
|
523
|
+
95 end
|
524
|
+
</span><span class="false"> 96 # This file contains things needed to map Test::Unit status objects to
|
525
|
+
97 # Exceptions, Exception related infrastructure and similar things.
|
526
|
+
98 #
|
527
|
+
99 # See Contract::ContractException, Contract::ContractMismatch and
|
528
|
+
100 # Contract::ContractError.
|
529
|
+
101
|
530
|
+
102
|
531
|
+
103 class Contract < Test::Unit::TestCase
|
532
|
+
104 # Exceptions raised by Contract contain some useful meta-information.
|
533
|
+
105 # This module is mixed into Exceptions that provide such information.
|
534
|
+
106 module ContractException
|
535
|
+
107 def ce_initialize(original_message, backtrace, test_object,
|
536
|
+
108 test_method, test_contract, *more) # :nodoc:
|
537
|
+
109 @original_message = original_message
|
538
|
+
110 message = original_message.dup
|
539
|
+
111 detail = " for #{test_object.inspect} in " +
|
540
|
+
112 "#{test_contract.inspect}"
|
541
|
+
113 message[/(\s*)[.!?]?\s*\Z/, 1] = detail
|
542
|
+
114 Exception.instance_method(:initialize).bind(self).call(message)
|
543
|
+
115
|
544
|
+
116 set_backtrace(backtrace)
|
545
|
+
117 @test_object = test_object
|
546
|
+
118 @test_method = test_method
|
547
|
+
119 @test_contract = test_contract
|
548
|
+
120 end
|
549
|
+
121 private :ce_initialize
|
550
|
+
122
|
551
|
+
123 # What object was tested when this Exception was raised?
|
552
|
+
124 attr_reader :test_object
|
553
|
+
125 # What method implemented that test?
|
554
|
+
126 attr_reader :test_method
|
555
|
+
127 # What contract was that method part of?
|
556
|
+
128 attr_reader :test_contract
|
557
|
+
129 # The original, unfiltered exception message.
|
558
|
+
130 attr_reader :original_message
|
559
|
+
131 end
|
560
|
+
132
|
561
|
+
133 # Represents a failed test in a contract. This means that an object
|
562
|
+
134 # simply does not fulfill one of the parts of a contract. Subclass of
|
563
|
+
135 # TypeError.
|
564
|
+
136 class ContractMismatch < TypeError
|
565
|
+
137 def initialize(*args) # :nodoc:
|
566
|
+
138 ce_initialize(*args)
|
567
|
+
139 end
|
568
|
+
140
|
569
|
+
141 include ContractException
|
570
|
+
142 end
|
571
|
+
143
|
572
|
+
144 # Represents an unexpected failure while processing a contract test.
|
573
|
+
145 # This is more critical than ContractMismatch and usually means that
|
574
|
+
146 # something is wrong with the test itself.
|
575
|
+
147 class ContractError < StandardError
|
576
|
+
148 def initialize(*args) # :nodoc:
|
577
|
+
149 @type = args.pop
|
578
|
+
150 ce_initialize(*args)
|
579
|
+
151 end
|
580
|
+
152
|
581
|
+
153 # The type of the original Exception that triggered the unexpected
|
582
|
+
154 # failure.
|
583
|
+
155 attr_reader :type
|
584
|
+
156
|
585
|
+
157 include ContractException
|
586
|
+
158 end
|
587
|
+
159
|
588
|
+
160
|
589
|
+
161 # Maps a Test::Unit::Failure instance to an actual Exception with the
|
590
|
+
162 # specified meta data.
|
591
|
+
163 def self.failure_to_exception(failure, object, contract) # :nodoc:
|
592
|
+
164 ContractMismatch.new(failure.message, failure.location, object,
|
593
|
+
165 extract_method_name(failure.test_name), contract)
|
594
|
+
166 end
|
595
|
+
167
|
596
|
+
168 # Maps a Test::Unit::Error instance to an actual Exception with the
|
597
|
+
169 # specified meta data.
|
598
|
+
170 def self.error_to_exception(error, object, contract) # :nodoc:
|
599
|
+
171 original = error.exception
|
600
|
+
172 ContractError.new(original.message, original.backtrace, object,
|
601
|
+
173 extract_method_name(error.test_name), contract, original.class)
|
602
|
+
174 end
|
603
|
+
175
|
604
|
+
176 # Maps a Test::Unit fault (either a Failure or Error) to an actual
|
605
|
+
177 # exception with the specified meta data.
|
606
|
+
178 def self.fault_to_exception(fault, *args) # :nodoc:
|
607
|
+
179 if fault.is_a?(Test::Unit::Failure) then
|
608
|
+
180 failure_to_exception(fault, *args)
|
609
|
+
181 else
|
610
|
+
182 error_to_exception(fault, *args)
|
611
|
+
183 end
|
612
|
+
184 end
|
613
|
+
185
|
614
|
+
186 # Extracts the method name from a Test::Unit test_name style String.
|
615
|
+
187 def self.extract_method_name(test_name) # :nodoc:
|
616
|
+
188 test_name[/\A(.+?)\(.+?\)\Z/, 1]
|
617
|
+
189 end
|
618
|
+
190 end
|
619
|
+
</span></pre>
|
620
|
+
<hr />
|
621
|
+
<p>
|
622
|
+
<a href="http://validator.w3.org/check/referer">
|
623
|
+
<img src="http://www.w3.org/Icons/valid-xhtml11"
|
624
|
+
alt="Valid XHTML 1.1!" height="31" width="88" />
|
625
|
+
</a>
|
626
|
+
<a href="http://jigsaw.w3.org/css-validator/">
|
627
|
+
<img style="border:0;width:88px;height:31px"
|
628
|
+
src="http://jigsaw.w3.org/css-validator/images/vcss"
|
629
|
+
alt="Valid CSS!" />
|
630
|
+
</a>
|
631
|
+
</p>
|
632
|
+
</body></html>
|