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.
Files changed (74) hide show
  1. data/COPYING +56 -0
  2. data/Manifest +85 -0
  3. data/README +32 -0
  4. data/TODO +83 -0
  5. data/doc/classes/Contract.html +599 -0
  6. data/doc/classes/Contract/Check.html +229 -0
  7. data/doc/classes/Contract/Check/All.html +172 -0
  8. data/doc/classes/Contract/Check/Any.html +172 -0
  9. data/doc/classes/Contract/Check/Block.html +172 -0
  10. data/doc/classes/Contract/Check/None.html +173 -0
  11. data/doc/classes/Contract/Check/Quack.html +172 -0
  12. data/doc/classes/Contract/ContractError.html +151 -0
  13. data/doc/classes/Contract/ContractException.html +162 -0
  14. data/doc/classes/Contract/ContractMismatch.html +134 -0
  15. data/doc/classes/Kernel.html +256 -0
  16. data/doc/classes/Method.html +135 -0
  17. data/doc/classes/MethodSignatureMixin.html +208 -0
  18. data/doc/classes/Module.html +526 -0
  19. data/doc/created.rid +1 -0
  20. data/doc/dot/f_0.dot +14 -0
  21. data/doc/dot/f_0.png +0 -0
  22. data/doc/dot/f_1.dot +14 -0
  23. data/doc/dot/f_1.png +0 -0
  24. data/doc/dot/f_2.dot +14 -0
  25. data/doc/dot/f_2.png +0 -0
  26. data/doc/dot/f_3.dot +112 -0
  27. data/doc/dot/f_3.png +0 -0
  28. data/doc/dot/f_4.dot +62 -0
  29. data/doc/dot/f_4.png +0 -0
  30. data/doc/dot/f_5.dot +62 -0
  31. data/doc/dot/f_5.png +0 -0
  32. data/doc/dot/f_6.dot +224 -0
  33. data/doc/dot/f_6.png +0 -0
  34. data/doc/dot/f_6_0.dot +24 -0
  35. data/doc/dot/f_6_0.png +0 -0
  36. data/doc/dot/f_6_1.dot +24 -0
  37. data/doc/dot/f_6_1.png +0 -0
  38. data/doc/dot/f_7.dot +62 -0
  39. data/doc/dot/f_7.png +0 -0
  40. data/doc/files/COPYING.html +168 -0
  41. data/doc/files/README.html +146 -0
  42. data/doc/files/TODO.html +240 -0
  43. data/doc/files/lib/contract/assertions_rb.html +118 -0
  44. data/doc/files/lib/contract/exception_rb.html +125 -0
  45. data/doc/files/lib/contract/integration_rb.html +130 -0
  46. data/doc/files/lib/contract/overrides_rb.html +118 -0
  47. data/doc/files/lib/contract_rb.html +127 -0
  48. data/doc/fr_class_index.html +40 -0
  49. data/doc/fr_file_index.html +34 -0
  50. data/doc/fr_method_index.html +45 -0
  51. data/doc/index.html +24 -0
  52. data/doc/rdoc-style.css +208 -0
  53. data/lib/contract.rb +146 -0
  54. data/lib/contract/assertions.rb +42 -0
  55. data/lib/contract/exception.rb +95 -0
  56. data/lib/contract/integration.rb +664 -0
  57. data/lib/contract/overrides.rb +41 -0
  58. data/setup.rb +1360 -0
  59. data/test/coverage/_-lib-contract-assertions_rb.html +526 -0
  60. data/test/coverage/_-lib-contract-exception_rb.html +632 -0
  61. data/test/coverage/_-lib-contract-integration_rb.html +1450 -0
  62. data/test/coverage/_-lib-contract-overrides_rb.html +524 -0
  63. data/test/coverage/_-lib-contract_rb.html +724 -0
  64. data/test/coverage/__-lib-contract-assertions_rb.html +484 -0
  65. data/test/coverage/__-lib-contract-exception_rb.html +537 -0
  66. data/test/coverage/__-lib-contract-integration_rb.html +946 -0
  67. data/test/coverage/__-lib-contract-overrides_rb.html +483 -0
  68. data/test/coverage/__-lib-contract_rb.html +583 -0
  69. data/test/coverage/index.html +93 -0
  70. data/test/tc_all.rb +8 -0
  71. data/test/tc_contract.rb +109 -0
  72. data/test/tc_exception.rb +43 -0
  73. data/test/tc_integration.rb +357 -0
  74. 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 &lt; 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 = &quot; for #{test_object.inspect} in &quot; +
445
+ </span><span class="inferred"> 17 &quot;#{test_contract.inspect}&quot;
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 &lt; 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 &lt; 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 &lt; 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 = &quot; for #{test_object.inspect} in &quot; +
540
+ 112 &quot;#{test_contract.inspect}&quot;
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 &lt; 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 &lt; 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>