dfect 1.0.0 → 1.1.0
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/CREDITS +1 -0
- data/doc/api/apple-touch-icon.png +0 -0
- data/doc/api/classes/Dfect.html +92 -32
- data/doc/api/classes/Kernel.html +8 -8
- data/doc/api/classes/Object.html +1 -1
- data/doc/api/created.rid +1 -1
- data/doc/api/favicon.ico +0 -0
- data/doc/api/files/CREDITS.html +4 -1
- data/doc/api/files/LICENSE.html +1 -1
- data/doc/api/files/lib/dfect/auto_rb.html +1 -1
- data/doc/api/files/lib/dfect/mini_rb.html +1 -1
- data/doc/api/files/lib/dfect/spec_rb.html +1 -3
- data/doc/api/files/lib/dfect/unit_rb.html +1 -1
- data/doc/api/files/lib/dfect_rb.html +1 -1
- data/doc/api/js/searchdoc.js +38 -15
- data/doc/api/panel/index.html +13 -5
- data/doc/api/panel/search_index.js +1 -1
- data/doc/api/panel/tree.js +1 -1
- data/doc/history.erb +92 -12
- data/doc/index.erb +2 -2
- data/doc/index.html +2323 -0
- data/doc/intro.erb +45 -68
- data/doc/setup.erb +91 -7
- data/doc/usage.erb +214 -154
- data/lib/dfect/auto.rb +4 -4
- data/lib/dfect/mini.rb +7 -2
- data/lib/dfect/spec.rb +2 -3
- data/lib/dfect/unit.rb +11 -4
- data/lib/dfect.rb +24 -3
- data/rakefile +4 -4
- data/test/dfect.rb +2 -2
- metadata +9 -5
- data/doc/index.xhtml +0 -833
data/doc/usage.erb
CHANGED
@@ -1,142 +1,218 @@
|
|
1
1
|
%#--
|
2
|
-
%# Copyright
|
3
|
-
%# See
|
2
|
+
%# Copyright protects this work.
|
3
|
+
%# See LICENSE file for details.
|
4
4
|
%#++
|
5
5
|
|
6
6
|
% dfect_api = 'api/classes/Dfect.html'
|
7
7
|
|
8
|
+
|
8
9
|
%|chapter "Usage"
|
10
|
+
|
9
11
|
Begin by loading <%= $project %> into your program:
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
%|code :ruby
|
14
|
+
require 'rubygems' # only necessary if you are using Ruby 1.8
|
15
|
+
require 'dfect'
|
16
|
+
|
17
|
+
You now have access to the [`Dfect` module](<%= dfect_api %>), which provides methods that can be mixed-in or called directly, according to your preference:
|
15
18
|
|
16
|
-
|
19
|
+
%|code :ruby
|
20
|
+
Dfect.D "hello" do # D() is a class method
|
21
|
+
puts "world"
|
22
|
+
end
|
17
23
|
|
18
|
-
|
19
|
-
Dfect.D "hello" do # D() is a not-mixed-in class method
|
20
|
-
puts "world"
|
21
|
-
end
|
24
|
+
# the above is same as:
|
22
25
|
|
23
|
-
|
26
|
+
include Dfect # mix-in the Dfect API
|
24
27
|
|
25
|
-
|
28
|
+
D "hello" do # D() is an instance method
|
29
|
+
puts "world"
|
30
|
+
end
|
26
31
|
|
27
|
-
|
28
|
-
puts "world"
|
29
|
-
end
|
30
|
-
</code>
|
32
|
+
The following sections explain these provided methods in detail. If you are impatient, you can skip to <%= xref "A sample unit test" %> for an illustrative example.
|
31
33
|
|
32
|
-
The following sections explain these provided methods in detail.
|
33
34
|
|
34
35
|
%|section "Assertions"
|
35
|
-
The following methods take a block parameter and assert something about the result of executing that block. See the [API documentation](<%= dfect_api %>) for examples.
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
37
|
+
The following methods accept a block parameter and assert something about the result of executing that block. They also accept an optional message, which is shown in <%= xref "Failures", "failure reports" %> if they fail.
|
38
|
+
|
39
|
+
See the [API documentation](<%= api_url %>) for details and examples.
|
40
|
+
|
41
|
+
%|table
|
42
|
+
%|thead
|
43
|
+
%|tr
|
44
|
+
%|th
|
45
|
+
Method
|
46
|
+
%|th
|
47
|
+
Description
|
48
|
+
%|tbody
|
49
|
+
%|tr
|
50
|
+
%|td
|
51
|
+
T
|
52
|
+
%|td
|
53
|
+
assert true (not `nil` and not `false`)
|
54
|
+
%|tr
|
55
|
+
%|td
|
56
|
+
F
|
57
|
+
%|td
|
58
|
+
assert not true (`nil` or `false`)
|
59
|
+
%|tr
|
60
|
+
%|td
|
61
|
+
E
|
62
|
+
%|td
|
63
|
+
assert that an execption is raised
|
64
|
+
%|tr
|
65
|
+
%|td
|
66
|
+
C
|
67
|
+
%|td
|
68
|
+
assert that a symbol is thrown
|
69
|
+
|
43
70
|
|
44
71
|
%|paragraph "Negation"
|
72
|
+
|
45
73
|
These methods are the *opposite* of <%= xref "Assertions", "normal assertions" %>.
|
46
74
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
75
|
+
%|table
|
76
|
+
%|thead
|
77
|
+
%|tr
|
78
|
+
%|th
|
79
|
+
Method
|
80
|
+
%|th
|
81
|
+
Description
|
82
|
+
%|tbody
|
83
|
+
%|tr
|
84
|
+
%|td
|
85
|
+
T!
|
86
|
+
%|td
|
87
|
+
same as F
|
88
|
+
%|tr
|
89
|
+
%|td
|
90
|
+
F!
|
91
|
+
%|td
|
92
|
+
same as T
|
93
|
+
%|tr
|
94
|
+
%|td
|
95
|
+
E!
|
96
|
+
%|td
|
97
|
+
assert that an exception is *not* raised
|
98
|
+
%|tr
|
99
|
+
%|td
|
100
|
+
C!
|
101
|
+
%|td
|
102
|
+
assert that a symbol is *not* thrown
|
103
|
+
|
53
104
|
|
54
105
|
%|paragraph "Sampling"
|
55
|
-
These methods allow you to *check the outcome* of an <%= xref "Assertions", "assertion" %> without the penalty of pass or failure.
|
56
106
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
107
|
+
These methods allow you to *check the outcome* of an <%= xref "Assertions", "assertion" %> without including the assertion in the execution report.
|
108
|
+
|
109
|
+
%|table
|
110
|
+
%|thead
|
111
|
+
%|tr
|
112
|
+
%|th
|
113
|
+
Method
|
114
|
+
%|th
|
115
|
+
Description
|
116
|
+
%|tbody
|
117
|
+
%|tr
|
118
|
+
%|td
|
119
|
+
T?
|
120
|
+
%|td
|
121
|
+
returns `true` if T passes; `false` otherwise
|
122
|
+
%|tr
|
123
|
+
%|td
|
124
|
+
F?
|
125
|
+
%|td
|
126
|
+
returns `true` if F passes; `false` otherwise
|
127
|
+
%|tr
|
128
|
+
%|td
|
129
|
+
E?
|
130
|
+
%|td
|
131
|
+
returns `true` if E passes; `false` otherwise
|
132
|
+
%|tr
|
133
|
+
%|td
|
134
|
+
C?
|
135
|
+
%|td
|
136
|
+
returns `true` if C passes; `false` otherwise
|
137
|
+
|
63
138
|
|
64
139
|
%|section "Failures"
|
140
|
+
|
65
141
|
When an assertion fails, details about the failure will be shown:
|
66
142
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
- test/simple.rb:3
|
88
|
-
</pre>
|
143
|
+
- fail: block must yield true (!nil && !false)
|
144
|
+
code: |-
|
145
|
+
[12..22] in test/simple.rb
|
146
|
+
12
|
147
|
+
13 D "with more nested tests" do
|
148
|
+
14 x = 5
|
149
|
+
15
|
150
|
+
16 T { x > 2 } # passes
|
151
|
+
=> 17 F { x > 2 } # fails
|
152
|
+
18 E { x.hello } # passes
|
153
|
+
19 end
|
154
|
+
20 end
|
155
|
+
21
|
156
|
+
22 # equivalent of before(:each) or setup()
|
157
|
+
vars:
|
158
|
+
x: 5
|
159
|
+
y: 83
|
160
|
+
call:
|
161
|
+
- test/simple.rb:17
|
162
|
+
- test/simple.rb:3
|
89
163
|
|
90
164
|
You will then be placed into a debugger to investigate the failure if the `:debug` option is enabled in [`Dfect.options`](<%= dfect_api %>).
|
91
165
|
|
92
166
|
Details about all assertion failures and a trace of all tests executed are stored by <%= $project %> and provided by the [`Dfect.report`](<%= dfect_api %>) method.
|
93
167
|
|
168
|
+
|
94
169
|
%|section "Tests"
|
170
|
+
|
95
171
|
The [`D()` method](<%= dfect_api %>) defines a new **test**, which is analagous to the `describe()` environment provided by BDD frameworks like RSpec.
|
96
172
|
|
97
173
|
A test may also contain nested tests.
|
98
174
|
|
99
|
-
|
100
|
-
|
101
|
-
|
175
|
+
%|code :ruby
|
176
|
+
D "outer test" do
|
177
|
+
# assertions and logic here
|
102
178
|
|
103
|
-
|
104
|
-
|
179
|
+
D "inner test" do
|
180
|
+
# more assertions and logic here
|
181
|
+
end
|
105
182
|
end
|
106
|
-
|
107
|
-
</code>
|
183
|
+
|
108
184
|
|
109
185
|
%|section "Hooks"
|
186
|
+
|
110
187
|
The [`D()` method](<%= dfect_api %>) provides several entry points (hooks) into the test execution process:
|
111
188
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
189
|
+
%|code :ruby
|
190
|
+
D "outer test" do
|
191
|
+
D .< { puts "before each nested test" }
|
192
|
+
D .> { puts "after each nested test" }
|
193
|
+
D .<< { puts "before all nested tests" }
|
194
|
+
D .>> { puts "after all nested tests" }
|
118
195
|
|
119
|
-
|
120
|
-
|
196
|
+
D "inner test" do
|
197
|
+
# assertions and logic here
|
198
|
+
end
|
121
199
|
end
|
122
|
-
end
|
123
|
-
</code>
|
124
200
|
|
125
201
|
A hook method may be called multiple times. Each call registers additional logic to execute during the hook:
|
126
202
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
203
|
+
%|code :ruby
|
204
|
+
D .< { puts "do something" }
|
205
|
+
D .< { puts "do something more!" }
|
206
|
+
|
131
207
|
|
132
208
|
%|section "Insulation"
|
209
|
+
|
133
210
|
Use the singleton class of a temporary object to shield your test logic from Ruby's global environment, the code being tested, and from other tests:
|
134
211
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
</code>
|
212
|
+
%|code :ruby
|
213
|
+
class << Object.new
|
214
|
+
# your test logic here
|
215
|
+
end
|
140
216
|
|
141
217
|
Inside this insulated environment, you are free to:
|
142
218
|
* mix-in any modules your test logic needs
|
@@ -144,107 +220,91 @@
|
|
144
220
|
|
145
221
|
For example:
|
146
222
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
223
|
+
%|code :ruby
|
224
|
+
class << Object.new
|
225
|
+
include SomeModule
|
226
|
+
extend AnotherModule
|
151
227
|
|
152
|
-
|
228
|
+
YOUR_CONSTANT = 123
|
153
229
|
|
154
|
-
|
155
|
-
|
230
|
+
D "your tests here" do
|
231
|
+
# your test logic here
|
156
232
|
|
157
|
-
|
158
|
-
|
233
|
+
your_helper_method
|
234
|
+
end
|
159
235
|
|
160
|
-
|
161
|
-
|
236
|
+
def self.your_helper_method
|
237
|
+
# your helper logic here
|
162
238
|
|
163
|
-
|
164
|
-
|
239
|
+
helper = YourHelperClass.new
|
240
|
+
helper.do_something_helpful
|
165
241
|
|
166
|
-
|
167
|
-
|
242
|
+
T { 2 + 2 != 5 }
|
243
|
+
end
|
168
244
|
|
169
|
-
|
170
|
-
|
245
|
+
class YourHelperClass
|
246
|
+
# your helper logic here
|
247
|
+
end
|
171
248
|
end
|
172
|
-
|
173
|
-
</code>
|
249
|
+
|
174
250
|
|
175
251
|
%|section "Execution"
|
252
|
+
|
176
253
|
You can configure test execution using:
|
177
254
|
|
178
|
-
|
179
|
-
|
180
|
-
</code>
|
255
|
+
%|code :ruby
|
256
|
+
Dfect.options = your_options_hash
|
181
257
|
|
182
258
|
You can execute all tests defined thus far using:
|
183
259
|
|
184
|
-
|
185
|
-
|
186
|
-
</code>
|
260
|
+
%|code :ruby
|
261
|
+
Dfect.run
|
187
262
|
|
188
263
|
You can stop this execution at any time using:
|
189
264
|
|
190
|
-
|
191
|
-
|
192
|
-
</code>
|
265
|
+
%|code :ruby
|
266
|
+
Dfect.stop
|
193
267
|
|
194
268
|
You can view the results of execution using:
|
195
269
|
|
196
|
-
|
197
|
-
|
198
|
-
|
270
|
+
%|code :ruby
|
271
|
+
puts Dfect.report.to_yaml
|
272
|
+
|
273
|
+
See the [API documentation](<%= api_url %>) for details and examples.
|
199
274
|
|
200
|
-
See the [API documentation](<%= dfect_api %>) for details and examples.
|
201
275
|
|
202
276
|
%|section "Automatic test execution"
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
277
|
+
|
278
|
+
%|code :ruby
|
279
|
+
require 'rubygems' # only necessary if you are using Ruby 1.8
|
280
|
+
require 'dfect/auto' # <== notice the "auto"
|
207
281
|
|
208
282
|
The above code will mix-in the `Dfect` module into your program and will execute all tests defined by your program before it terminates.
|
209
283
|
|
210
|
-
%|example "A sample unit test"
|
211
|
-
<code>
|
212
|
-
require 'rubygems'
|
213
|
-
require 'dfect/auto'
|
214
284
|
|
215
|
-
|
216
|
-
D "a nested test" do
|
217
|
-
end
|
285
|
+
%|section "Reporting"
|
218
286
|
|
219
|
-
|
220
|
-
end
|
287
|
+
You can insert status messages, which can be arbitrary Ruby objects, into the execution report using the `Dfect::S()` method.
|
221
288
|
|
222
|
-
|
223
|
-
y = 83
|
289
|
+
See the [API documentation](<%= api_url %>) for details and examples.
|
224
290
|
|
225
|
-
D "with more nested tests" do
|
226
|
-
x = 5
|
227
291
|
|
228
|
-
|
229
|
-
F { x > 2 } # fails
|
230
|
-
E { x.hello } # passes
|
231
|
-
end
|
232
|
-
end
|
292
|
+
%|section "Emulation"
|
233
293
|
|
234
|
-
|
235
|
-
puts "this is executed before every test in this scope"
|
236
|
-
end
|
294
|
+
Dfect provides emulation layers for several popular testing libraries:
|
237
295
|
|
238
|
-
|
239
|
-
|
240
|
-
|
296
|
+
* <tt>dfect/unit</tt> --- Test::Unit
|
297
|
+
* <tt>dfect/mini</tt> --- Minitest
|
298
|
+
* <tt>dfect/spec</tt> --- RSpec
|
241
299
|
|
242
|
-
|
243
|
-
puts "this is executed once, before all tests in this scope"
|
244
|
-
end
|
300
|
+
Simply `require()` one of these emulation layers into your test suite and you can write your tests using the familiar syntax of that testing library.
|
245
301
|
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
302
|
+
See the [API documentation](<%= api_url %>) for details and examples.
|
303
|
+
|
304
|
+
|
305
|
+
%|example! "A sample unit test"
|
306
|
+
|
307
|
+
The following code is from Dfect's very own test suite.
|
308
|
+
|
309
|
+
%|code :ruby
|
310
|
+
%< "../test/dfect.rb"
|
data/lib/dfect/auto.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
#--
|
2
|
-
# Copyright 2009 Suraj N. Kurapati
|
3
|
-
# See the LICENSE file for details.
|
4
|
-
#++
|
5
1
|
# Provides painless, automatic configuration of Dfect.
|
6
2
|
#
|
7
3
|
# Simply require() this file and Dfect will be available for use anywhere
|
8
4
|
# in your program and will execute all tests before your program exits.
|
5
|
+
#--
|
6
|
+
# Copyright protects this work.
|
7
|
+
# See LICENSE file for details.
|
8
|
+
#++
|
9
9
|
|
10
10
|
require 'dfect'
|
11
11
|
|
data/lib/dfect/mini.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# MiniTest emulation layer.
|
2
2
|
#--
|
3
|
-
# Copyright
|
4
|
-
# See
|
3
|
+
# Copyright protects this work.
|
4
|
+
# See LICENSE file for details.
|
5
5
|
#++
|
6
6
|
|
7
7
|
require 'dfect'
|
@@ -21,6 +21,11 @@ end
|
|
21
21
|
:wont => :refute,
|
22
22
|
}.
|
23
23
|
each do |outer, inner|
|
24
|
+
#
|
25
|
+
# XXX: using eval() because Ruby 1.8 does
|
26
|
+
# not support default values and
|
27
|
+
# block parameters in define_method()
|
28
|
+
#
|
24
29
|
file, line = __FILE__, __LINE__ ; eval %{
|
25
30
|
class Object
|
26
31
|
def #{outer}_be_close_to other, message = nil
|
data/lib/dfect/spec.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
# RSpec emulation layer.
|
2
2
|
#--
|
3
|
-
# Copyright
|
4
|
-
# See
|
3
|
+
# Copyright protects this work.
|
4
|
+
# See LICENSE file for details.
|
5
5
|
#++
|
6
6
|
|
7
7
|
require 'dfect'
|
8
|
-
require 'delegate'
|
9
8
|
|
10
9
|
module Kernel
|
11
10
|
def describe *args, &block
|
data/lib/dfect/unit.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Test::Unit emulation layer.
|
2
2
|
#--
|
3
|
-
# Copyright
|
4
|
-
# See
|
3
|
+
# Copyright protects this work.
|
4
|
+
# See LICENSE file for details.
|
5
5
|
#++
|
6
6
|
|
7
7
|
require 'dfect'
|
@@ -20,6 +20,11 @@ module Kernel
|
|
20
20
|
[:assert_not, '!', 'not '],
|
21
21
|
].
|
22
22
|
each do |prefix, polarity, action|
|
23
|
+
#
|
24
|
+
# XXX: using eval() because Ruby 1.8 does
|
25
|
+
# not support default values and
|
26
|
+
# block parameters in define_method()
|
27
|
+
#
|
23
28
|
file, line = __FILE__, __LINE__ ; eval %{
|
24
29
|
def #{prefix} boolean, message = nil
|
25
30
|
Dfect.T#{polarity}(message) { boolean }
|
@@ -34,7 +39,7 @@ module Kernel
|
|
34
39
|
Dfect.T#{polarity}(message) { collection.empty? }
|
35
40
|
end
|
36
41
|
|
37
|
-
def #{prefix}_equal
|
42
|
+
def #{prefix}_equal expected, actual, message = nil
|
38
43
|
message ||= 'actual must #{action}equal expected'
|
39
44
|
Dfect.T#{polarity}(message) { actual == expected }
|
40
45
|
end
|
@@ -43,7 +48,9 @@ module Kernel
|
|
43
48
|
message ||= 'actual must #{action}be within delta of expected'
|
44
49
|
delta ||= 0.001
|
45
50
|
|
46
|
-
Dfect.T#{polarity}(message)
|
51
|
+
Dfect.T#{polarity}(message) do
|
52
|
+
Math.abs(expected - actual) <= Math.abs(delta)
|
53
|
+
end
|
47
54
|
end
|
48
55
|
|
49
56
|
alias #{prefix}_in_epsilon #{prefix}_in_delta
|
data/lib/dfect.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright
|
3
|
-
# See
|
2
|
+
# Copyright protects this work.
|
3
|
+
# See LICENSE file for details.
|
4
4
|
#++
|
5
5
|
|
6
6
|
require 'yaml'
|
@@ -524,6 +524,27 @@ module Dfect
|
|
524
524
|
assert_catch :sample, message, symbol, &block
|
525
525
|
end
|
526
526
|
|
527
|
+
##
|
528
|
+
# Adds the given message to the report inside
|
529
|
+
# the section of the currently running test.
|
530
|
+
#
|
531
|
+
# You can think of "S" as "say" or "status".
|
532
|
+
#
|
533
|
+
# ==== Parameters
|
534
|
+
#
|
535
|
+
# [message]
|
536
|
+
# Objects to be added to the report.
|
537
|
+
#
|
538
|
+
# ==== Examples
|
539
|
+
#
|
540
|
+
# S "establishing connection..."
|
541
|
+
#
|
542
|
+
# S "beginning calculation...", Math::PI, [1, 2, 3, ['a', 'b', 'c']]
|
543
|
+
#
|
544
|
+
def S *message
|
545
|
+
@exec_trace.concat message
|
546
|
+
end
|
547
|
+
|
527
548
|
##
|
528
549
|
# Executes all tests defined thus far and stores the results in #report.
|
529
550
|
#
|
@@ -914,9 +935,9 @@ module Dfect
|
|
914
935
|
# Allows before and after hooks to be specified via
|
915
936
|
# the D() method syntax when this module is mixed-in:
|
916
937
|
#
|
938
|
+
# D .<< { puts "before all nested tests" }
|
917
939
|
# D .< { puts "before each nested test" }
|
918
940
|
# D .> { puts "after each nested test" }
|
919
|
-
# D .<< { puts "before all nested tests" }
|
920
941
|
# D .>> { puts "after all nested tests" }
|
921
942
|
#
|
922
943
|
D = self
|
data/rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright
|
3
|
-
# See
|
2
|
+
# Copyright protects this work.
|
3
|
+
# See LICENSE file for details.
|
4
4
|
#++
|
5
5
|
|
6
6
|
require 'rubygems'
|
@@ -8,8 +8,8 @@ gem 'inochi', '~> 1'
|
|
8
8
|
require 'inochi'
|
9
9
|
|
10
10
|
Inochi.init :Dfect,
|
11
|
-
:version => '1.
|
12
|
-
:release => '2009-
|
11
|
+
:version => '1.1.0',
|
12
|
+
:release => '2009-10-27',
|
13
13
|
:website => 'http://snk.tuxfamily.org/lib/dfect/',
|
14
14
|
:tagline => 'Assertion testing library for Ruby'
|
15
15
|
|
data/test/dfect.rb
CHANGED