dfect 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. data/CREDITS +2 -2
  2. data/HISTORY +306 -0
  3. data/INSTALL +35 -0
  4. data/README +95 -0
  5. data/USAGE +393 -0
  6. data/doc/api/Dfect.html +3179 -0
  7. data/doc/api/Object.html +107 -0
  8. data/doc/api/_index.html +107 -0
  9. data/doc/api/class_list.html +36 -0
  10. data/doc/api/css/common.css +1 -0
  11. data/doc/api/css/full_list.css +50 -0
  12. data/doc/api/css/style.css +268 -0
  13. data/doc/api/file.LICENSE.html +73 -0
  14. data/doc/api/file_list.html +38 -0
  15. data/doc/api/frames.html +13 -0
  16. data/doc/api/index.html +72 -13
  17. data/doc/api/js/app.js +99 -0
  18. data/doc/api/js/full_list.js +106 -0
  19. data/doc/api/js/{jquery-1.3.2.min.js → jquery.js} +0 -0
  20. data/doc/api/method_list.html +339 -0
  21. data/doc/api/top-level-namespace.html +87 -0
  22. data/doc/index.erb +16 -9
  23. data/doc/index.html +1057 -726
  24. data/lib/dfect.rb +431 -284
  25. data/lib/dfect/auto.rb +2 -6
  26. data/lib/dfect/inochi.rb +48 -0
  27. data/lib/dfect/inochi.yaml +75 -0
  28. data/lib/dfect/mini.rb +1 -5
  29. data/lib/dfect/spec.rb +6 -13
  30. data/lib/dfect/unit.rb +21 -33
  31. data/test/dfect/inochi_test.rb +17 -0
  32. data/test/{dfect.rb → dfect_test.rb} +167 -7
  33. data/test/runner +25 -0
  34. data/test/test_helper.rb +1 -0
  35. metadata +43 -55
  36. data/doc/api/apple-touch-icon.png +0 -0
  37. data/doc/api/classes/Class.html +0 -73
  38. data/doc/api/classes/Dfect.html +0 -1245
  39. data/doc/api/classes/Kernel.html +0 -322
  40. data/doc/api/classes/Object.html +0 -72
  41. data/doc/api/created.rid +0 -1
  42. data/doc/api/css/main.css +0 -263
  43. data/doc/api/css/panel.css +0 -383
  44. data/doc/api/css/reset.css +0 -53
  45. data/doc/api/favicon.ico +0 -0
  46. data/doc/api/files/CREDITS.html +0 -65
  47. data/doc/api/files/LICENSE.html +0 -76
  48. data/doc/api/files/lib/dfect/auto_rb.html +0 -80
  49. data/doc/api/files/lib/dfect/mini_rb.html +0 -77
  50. data/doc/api/files/lib/dfect/spec_rb.html +0 -73
  51. data/doc/api/files/lib/dfect/unit_rb.html +0 -73
  52. data/doc/api/files/lib/dfect_rb.html +0 -74
  53. data/doc/api/i/arrows.png +0 -0
  54. data/doc/api/i/results_bg.png +0 -0
  55. data/doc/api/i/tree_bg.png +0 -0
  56. data/doc/api/js/jquery-effect.js +0 -593
  57. data/doc/api/js/main.js +0 -22
  58. data/doc/api/js/searchdoc.js +0 -628
  59. data/doc/api/panel/index.html +0 -71
  60. data/doc/api/panel/search_index.js +0 -1
  61. data/doc/api/panel/tree.js +0 -1
  62. data/doc/history.erb +0 -161
  63. data/doc/intro.erb +0 -104
  64. data/doc/setup.erb +0 -107
  65. data/doc/usage.erb +0 -310
  66. data/rakefile +0 -21
data/lib/dfect/auto.rb CHANGED
@@ -2,10 +2,6 @@
2
2
  #
3
3
  # Simply require() this file and Dfect will be available for use anywhere
4
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
5
 
10
6
  require 'dfect'
11
7
 
@@ -17,8 +13,8 @@ at_exit do
17
13
  Dfect.run
18
14
 
19
15
  # reflect number of failures in exit status
20
- stats = Dfect.report[:statistics]
21
- fails = stats[:failed_assertions] + stats[:uncaught_exceptions]
16
+ stats = Dfect.report[:stats]
17
+ fails = stats[:fail] + stats[:error]
22
18
 
23
19
  exit [fails, 255].min
24
20
  end
@@ -0,0 +1,48 @@
1
+ module Dfect
2
+
3
+ INSTDIR = File.expand_path('../../..', __FILE__)
4
+
5
+ # load inochi configuration
6
+ inochi_file = __FILE__.sub(/rb$/, 'yaml')
7
+ begin
8
+
9
+ configs = File.open(inochi_file) do |f|
10
+ require 'yaml'
11
+ YAML.load_stream(f).documents
12
+ end
13
+
14
+ INOCHI = configs.shift.to_hash
15
+ INOCHI[:runtime] ||= {}
16
+ INOCHI[:devtime] ||= {}
17
+
18
+ INOCHI2 = (configs.shift || {}).to_hash
19
+
20
+ rescue => error
21
+ error.message.insert 0,
22
+ "Could not load Inochi configuration file: #{inochi_file.inspect}\n"
23
+ raise error
24
+ end
25
+
26
+ # make values available as constants
27
+ INOCHI.each do |param, value|
28
+ const_set param.to_s.upcase, value
29
+ end
30
+
31
+ def self.inspect
32
+ "#{PROJECT} #{VERSION} (#{RELEASE})"
33
+ end
34
+
35
+ # establish gem version dependencies
36
+ if respond_to? :gem
37
+ [:runtime, :devtime].each do |key|
38
+ INOCHI[key].each do |gem_name, gem_version|
39
+ begin
40
+ gem gem_name, *Array(gem_version)
41
+ rescue LoadError => error
42
+ warn "#{inspect} #{key}: #{error}"
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ end
@@ -0,0 +1,75 @@
1
+ --- # information about your project -----------------------------------------
2
+
3
+ # Name of your project.
4
+ :project: Dfect
5
+
6
+ # Name of your project when packaged as a directory.
7
+ :package: dfect
8
+
9
+ # Name of Ruby module that namespaces your project.
10
+ :library: Dfect
11
+
12
+ # A short, single-line description of your project.
13
+ :tagline: Assertion testing library for Ruby
14
+
15
+ # Address of your project's published website.
16
+ :website: http://snk.tuxfamily.org/lib/dfect/
17
+
18
+ # A list of the core developers of your project.
19
+ #
20
+ # :authors:
21
+ # - An Example <an@example.com> # with email
22
+ # - Another Example # without email
23
+ #
24
+ :authors:
25
+ - Suraj N. Kurapati <sunaku@gmail.com>
26
+
27
+ # Number of the current release of your project.
28
+ :version: 2.0.0
29
+
30
+ # Date of the current release of your project.
31
+ :release: 2010-03-21
32
+
33
+ # A list of gems required by your project during runtime.
34
+ #
35
+ # :runtime:
36
+ # # your project needs exactly version 1.2.3 of the "an_example" gem
37
+ # an_example: 1.2.3
38
+ #
39
+ # # your project needs at least version 1.2 (but not
40
+ # # version 1.2.4 or newer) of the "another_example" gem
41
+ # another_example: [ >= 1.2 , < 1.2.4 ]
42
+ #
43
+ # # your project needs any version of the "yet_another_example" gem
44
+ # yet_another_example:
45
+ #
46
+ :runtime:
47
+
48
+ # A list of gems required by your project during development.
49
+ #
50
+ # :devtime:
51
+ # # your project needs exactly version 1.2.3 of the "an_example" gem
52
+ # an_example: 1.2.3
53
+ #
54
+ # # your project needs at least version 1.2 (but not
55
+ # # version 1.2.4 or newer) of the "another_example" gem
56
+ # another_example: [ >= 1.2 , < 1.2.4 ]
57
+ #
58
+ # # your project needs any version of the "yet_another_example" gem
59
+ # yet_another_example:
60
+ #
61
+ :devtime:
62
+
63
+ --- # parameters for the `inochi` command ------------------------------------
64
+
65
+ # Location where project documentation will be uploaded by `inochi pub:doc`.
66
+ :pub_doc_target: ~/www/lib/dfect/
67
+
68
+ # Options for the `rsync` command used to upload your project's documentation.
69
+ :pub_doc_options: --verbose --compress --archive --update --delete
70
+
71
+ # Path to YAML file containing login information for publishing announcements.
72
+ :pub_ann_logins: ~/.config/inochi/pub_ann_logins.yaml
73
+
74
+ # Your project's unique identifier in the RAA (Ruby Application Archive).
75
+ :pub_ann_raa_id: dfect
data/lib/dfect/mini.rb CHANGED
@@ -1,14 +1,10 @@
1
1
  # MiniTest emulation layer.
2
- #--
3
- # Copyright protects this work.
4
- # See LICENSE file for details.
5
- #++
6
2
 
7
3
  require 'dfect'
8
4
  require 'dfect/unit'
9
5
  require 'dfect/spec'
10
6
 
11
- module Kernel
7
+ module Dfect
12
8
  instance_methods(false).each do |meth|
13
9
  if meth =~ /^assert_not/
14
10
  alias_method 'refute' + $', meth
data/lib/dfect/spec.rb CHANGED
@@ -1,18 +1,11 @@
1
1
  # RSpec emulation layer.
2
- #--
3
- # Copyright protects this work.
4
- # See LICENSE file for details.
5
- #++
6
2
 
7
3
  require 'dfect'
8
4
 
9
- module Kernel
10
- def describe *args, &block
11
- Dfect.D args.join(' '), &block
12
- end
13
-
14
- alias context describe
15
- alias it describe
5
+ module Dfect
6
+ alias describe D
7
+ alias context D
8
+ alias it D
16
9
 
17
10
  def before what, &block
18
11
  meth =
@@ -22,7 +15,7 @@ module Kernel
22
15
  else raise ArgumentError, what
23
16
  end
24
17
 
25
- Dfect.send meth, &block
18
+ send meth, &block
26
19
  end
27
20
 
28
21
  def after what, &block
@@ -33,6 +26,6 @@ module Kernel
33
26
  else raise ArgumentError, what
34
27
  end
35
28
 
36
- Dfect.send meth, &block
29
+ send meth, &block
37
30
  end
38
31
  end
data/lib/dfect/unit.rb CHANGED
@@ -1,19 +1,12 @@
1
1
  # Test::Unit emulation layer.
2
- #--
3
- # Copyright protects this work.
4
- # See LICENSE file for details.
5
- #++
6
2
 
7
3
  require 'dfect'
8
4
 
9
- module Kernel
10
- def setup &block
11
- Dfect.<(&block)
12
- end
13
-
14
- def teardown &block
15
- Dfect.>(&block)
16
- end
5
+ module Dfect
6
+ alias setup <
7
+ alias setup! <<
8
+ alias teardown >
9
+ alias teardown! >>
17
10
 
18
11
  [
19
12
  [:assert, nil, nil ],
@@ -26,29 +19,24 @@ module Kernel
26
19
  # block parameters in define_method()
27
20
  #
28
21
  file, line = __FILE__, __LINE__ ; eval %{
29
- def #{prefix} boolean, message = nil
30
- Dfect.T#{polarity}(message) { boolean }
31
- end
32
-
33
- def #{prefix}_block message = nil, &block
34
- Dfect.T#{polarity}(&block)
35
- end
22
+ alias #{prefix} T#{polarity}
23
+ alias #{prefix} T#{polarity}
36
24
 
37
25
  def #{prefix}_empty collection, message = nil
38
26
  message ||= 'collection must #{action}be empty'
39
- Dfect.T#{polarity}(message) { collection.empty? }
27
+ T#{polarity}(message) { collection.empty? }
40
28
  end
41
29
 
42
30
  def #{prefix}_equal expected, actual, message = nil
43
31
  message ||= 'actual must #{action}equal expected'
44
- Dfect.T#{polarity}(message) { actual == expected }
32
+ T#{polarity}(message) { actual == expected }
45
33
  end
46
34
 
47
35
  def #{prefix}_in_delta expected, actual, delta = nil, message = nil
48
36
  message ||= 'actual must #{action}be within delta of expected'
49
37
  delta ||= 0.001
50
38
 
51
- Dfect.T#{polarity}(message) do
39
+ T#{polarity}(message) do
52
40
  Math.abs(expected - actual) <= Math.abs(delta)
53
41
  end
54
42
  end
@@ -57,55 +45,55 @@ module Kernel
57
45
 
58
46
  def #{prefix}_include item, collection, message = nil
59
47
  message ||= 'collection must #{action}include item'
60
- Dfect.T#{polarity}(messsage) { collection.include? item }
48
+ T#{polarity}(messsage) { collection.include? item }
61
49
  end
62
50
 
63
51
  def #{prefix}_instance_of _class, object, message = nil
64
52
  message ||= 'object must #{action}be an instance of class'
65
- Dfect.T#{polarity}(message) { object.instance_of? _class }
53
+ T#{polarity}(message) { object.instance_of? _class }
66
54
  end
67
55
 
68
56
  def #{prefix}_kind_of _class, object, message = nil
69
57
  message ||= 'object must #{action}be a kind of class'
70
- Dfect.T#{polarity}(message) { object.kind_of? _class }
58
+ T#{polarity}(message) { object.kind_of? _class }
71
59
  end
72
60
 
73
61
  def #{prefix}_nil object, message = nil
74
62
  message ||= 'object must #{action}be nil'
75
- Dfect.T#{polarity}(message) { object == nil }
63
+ T#{polarity}(message) { object == nil }
76
64
  end
77
65
 
78
66
  def #{prefix}_match pattern, string, message = nil
79
67
  message ||= 'string must #{action}match pattern'
80
- Dfect.T#{polarity}(message) { string =~ pattern }
68
+ T#{polarity}(message) { string =~ pattern }
81
69
  end
82
70
 
83
71
  def #{prefix}_same expected, actual, message = nil
84
72
  message ||= 'actual must #{action}be same as expected'
85
- Dfect.T#{polarity}(message) { actual.equal? expected }
73
+ T#{polarity}(message) { actual.equal? expected }
86
74
  end
87
75
 
88
76
  def #{prefix}_operator object, operator, operand, message = nil
89
77
  message ||= 'object must #{action}support operator with operand'
90
- Dfect.T#{polarity} { object.__send__ operator, operand }
78
+ T#{polarity} { object.__send__ operator, operand }
91
79
  end
92
80
 
93
81
  def #{prefix}_raise *args, &block
94
- Dfect.E#{polarity}(args.pop, *args, &block)
82
+ E#{polarity}(args.pop, *args, &block)
95
83
  end
96
84
 
97
85
  def #{prefix}_respond_to object, query, message = nil
98
86
  message ||= 'object must #{action}respond to query'
99
- Dfect.T#{polarity}(message) { object.respond_to? query }
87
+ T#{polarity}(message) { object.respond_to? query }
100
88
  end
101
89
 
102
90
  def #{prefix}_throw symbol, message = nil, &block
103
- Dfect.C#{polarity}(message, symbol, &block)
91
+ C#{polarity}(message, symbol, &block)
104
92
  end
105
93
 
106
94
  def #{prefix}_send object, query, *args
107
95
  response = object.__send__(query, *args)
108
- Dfect.T#{polarity} { response }
96
+ T#{polarity} { response }
109
97
  end
110
98
  }, binding, file, line
111
99
  end
@@ -0,0 +1,17 @@
1
+ require 'dfect/inochi'
2
+
3
+ unless defined? Dfect::INOCHI
4
+ fail "Dfect module must be established by Inochi"
5
+ end
6
+
7
+ Dfect::INOCHI.each do |param, value|
8
+ const = param.to_s.upcase
9
+
10
+ unless Dfect.const_defined? const
11
+ fail "Dfect::#{const} must be established by Inochi"
12
+ end
13
+
14
+ unless Dfect.const_get(const) == value
15
+ fail "Dfect::#{const} is not what Inochi established"
16
+ end
17
+ end
@@ -1,10 +1,3 @@
1
- #--
2
- # Copyright protects this work.
3
- # See LICENSE file for details.
4
- #++
5
-
6
- require 'dfect/auto'
7
-
8
1
  D 'T()' do
9
2
  T { true }
10
3
  T { !false }
@@ -72,6 +65,7 @@ end
72
65
 
73
66
  D 'E()' do
74
67
  E(SyntaxError) { raise SyntaxError }
68
+ E(SyntaxError, 'must raise SyntaxError') { raise SyntaxError }
75
69
 
76
70
  D 'forbids block to not raise anything' do
77
71
  F { E? {} }
@@ -106,6 +100,7 @@ end
106
100
 
107
101
  D 'E!()' do
108
102
  E!(SyntaxError) { raise ArgumentError }
103
+ E!(SyntaxError, 'must not raise SyntaxError') { raise ArgumentError }
109
104
 
110
105
  D 'allows block to not raise anything' do
111
106
  E!(SyntaxError) {}
@@ -137,8 +132,16 @@ D 'E!()' do
137
132
  end
138
133
  end
139
134
 
135
+ D 'E?()' do
136
+ T E?(SyntaxError) { raise SyntaxError }
137
+ T E?(SyntaxError, 'must raise SyntaxError') { raise SyntaxError }
138
+ F E?(SyntaxError) { raise ArgumentError }
139
+ F E?(SyntaxError, 'must not raise SyntaxError') { raise ArgumentError }
140
+ end
141
+
140
142
  D 'C()' do
141
143
  C(:foo) { throw :foo }
144
+ C(:foo, 'must throw :foo') { throw :foo }
142
145
 
143
146
  D 'forbids block to not throw anything' do
144
147
  F { C?(:bar) {} }
@@ -168,6 +171,7 @@ end
168
171
 
169
172
  D 'C!()' do
170
173
  C!(:bar) { throw :foo }
174
+ C!(:bar, 'must not throw :bar') { throw :foo }
171
175
 
172
176
  D 'allows block to not throw anything' do
173
177
  C!(:bar) {}
@@ -196,6 +200,13 @@ D 'C!()' do
196
200
  end
197
201
  end
198
202
 
203
+ D 'C?()' do
204
+ T C?(:foo) { throw :foo }
205
+ T C?(:foo, 'must throw :foo') { throw :foo }
206
+ F C?(:bar) { throw :foo }
207
+ F C?(:bar, 'must not throw :bar') { throw :foo }
208
+ end
209
+
199
210
  D 'D()' do
200
211
  history = []
201
212
 
@@ -281,6 +292,155 @@ D 'YAML must be able to serialize a class' do
281
292
  T { SyntaxError.to_yaml == "--- SyntaxError\n" }
282
293
  end
283
294
 
295
+ D 'insulated root-level describe' do
296
+ @insulated = :insulated
297
+ non_closured = :non_closured
298
+ end
299
+
300
+ closured = :closured
301
+
302
+ D 'another insulated root-level describe' do
303
+ # without insulation, instance variables
304
+ # from previous root-level describe
305
+ # environments will spill into this one
306
+ F { defined? @insulated }
307
+ F { @insulated == :insulated }
308
+
309
+ # however, this insulation must
310
+ # not prevent closure access to
311
+ # surrounding local variables
312
+ T { defined? closured }
313
+ T { closured == :closured }
314
+
315
+ # except local variables defined
316
+ # within another insulated environment
317
+ F { defined? non_closured }
318
+ E(NameError) { non_closured }
319
+
320
+ @insulated_again = :insulated_again
321
+
322
+ D 'non-insulated nested describe' do
323
+ D 'inherits instance variables' do
324
+ T { defined? @insulated_again }
325
+ T { @insulated_again == :insulated_again }
326
+ end
327
+
328
+ D 'inherits instance methods' do
329
+ E!(NoMethodError) { instance_level_helper_method }
330
+ T { instance_level_helper_method == :instance_level_helper_method }
331
+ end
332
+
333
+ D 'inherits class methods' do
334
+ E!(NoMethodError) { self.class_level_helper_method }
335
+ T { self.class_level_helper_method == :class_level_helper_method }
336
+
337
+ E!(NoMethodError) { class_level_helper_method }
338
+ T { class_level_helper_method == self.class_level_helper_method }
339
+ end
340
+
341
+ @non_insulated_from_nested = :non_insulated_from_nested
342
+ end
343
+
344
+ D! 'nested but explicitly insulated describe' do
345
+ D 'does not inherit instance variables' do
346
+ F { defined? @insulated_again }
347
+ F { @insulated_again == :insulated_again }
348
+ end
349
+
350
+ D 'does not inherit instance methods' do
351
+ E(NameError) { instance_level_helper_method }
352
+ end
353
+
354
+ D 'does not inherit class methods' do
355
+ E(NoMethodError) { self.class_level_helper_method }
356
+ E(NameError) { class_level_helper_method }
357
+ end
358
+
359
+ @non_insulated_from_nested = 123
360
+ end
361
+
362
+ D 'another non-insulated nested describe' do
363
+ T { defined? @non_insulated_from_nested }
364
+ T { @non_insulated_from_nested == :non_insulated_from_nested }
365
+ end
366
+
367
+ def instance_level_helper_method
368
+ :instance_level_helper_method
369
+ end
370
+
371
+ def self.class_level_helper_method
372
+ :class_level_helper_method
373
+ end
374
+ end
375
+
376
+ D 'yet another insulated root-level describe' do
377
+ F { defined? @insulated_again }
378
+ F { @insulated_again == :insulated_again }
379
+
380
+ F { defined? @non_insulated_from_nested }
381
+ F { @non_insulated_from_nested == :non_insulated_from_nested }
382
+ end
383
+
384
+ S :knowledge do
385
+ @sharing_is_fun = :share_knowledge
386
+ end
387
+
388
+ S :money do
389
+ @sharing_is_fun = :share_money
390
+ end
391
+
392
+ D 'share knowledge' do
393
+ F { defined? @sharing_is_fun }
394
+ S :knowledge
395
+ T { defined? @sharing_is_fun }
396
+ T { @sharing_is_fun == :share_knowledge }
397
+
398
+ F { S? :power }
399
+ S! :power do
400
+ @sharing_is_fun = :share_power
401
+ end
402
+ T { S? :power }
403
+ end
404
+
405
+ D 'share money' do
406
+ F { defined? @sharing_is_fun }
407
+ S :money
408
+ T { defined? @sharing_is_fun }
409
+ T { @sharing_is_fun == :share_money }
410
+
411
+ S :power
412
+ T { defined? @sharing_is_fun }
413
+ T { @sharing_is_fun == :share_power }
414
+
415
+ D! 'share knowledge inside nested but explicitly insulated describe' do
416
+ F { defined? @sharing_is_fun }
417
+ S :knowledge
418
+ T { defined? @sharing_is_fun }
419
+ T { @sharing_is_fun == :share_knowledge }
420
+ end
421
+ end
422
+
423
+ D 're-sharing under a previously shared identifier' do
424
+ E ArgumentError, 'must raise an error' do
425
+ S :knowledge do
426
+ @sharing_is_fun = :overwrite_previous_share
427
+ end
428
+ end
429
+
430
+ F { defined? @sharing_is_fun }
431
+ F { @sharing_is_fun == :overwrite_previous_share }
432
+ end
433
+
434
+ D 'injecting an unshared code block' do
435
+ E ArgumentError, 'must raise an error' do
436
+ S :foobar
437
+ end
438
+ end
439
+
440
+ E 'injecting shared block outside of a test' do
441
+ S :knowledge
442
+ end
443
+
284
444
  D 'stoping #run' do
285
445
  Dfect.stop
286
446
  raise 'this must not be reached!'