dfect 1.1.0 → 2.0.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.
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!'