activesambaldap 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. data/NEWS.en +6 -1
  2. data/NEWS.ja +6 -1
  3. data/README.en +3 -2
  4. data/README.ja +3 -2
  5. data/Rakefile +21 -2
  6. data/bin/asl-groupadd +0 -0
  7. data/bin/asl-groupadd.help +15 -0
  8. data/bin/asl-groupdel +0 -0
  9. data/bin/asl-groupdel.help +12 -0
  10. data/bin/asl-groupmod +0 -0
  11. data/bin/asl-groupmod.help +18 -0
  12. data/bin/asl-groupshow +0 -0
  13. data/bin/asl-groupshow.help +10 -0
  14. data/bin/asl-passwd +0 -0
  15. data/bin/asl-passwd.help +14 -0
  16. data/bin/asl-populate +0 -0
  17. data/bin/asl-populate.help +27 -0
  18. data/bin/asl-purge +0 -0
  19. data/bin/asl-purge.help +10 -0
  20. data/bin/asl-samba-computeradd +0 -0
  21. data/bin/asl-samba-computeradd.help +12 -0
  22. data/bin/asl-samba-groupadd +0 -0
  23. data/bin/asl-samba-groupadd.help +10 -0
  24. data/bin/asl-samba-groupdel +0 -0
  25. data/bin/asl-samba-groupdel.help +10 -0
  26. data/bin/asl-samba-groupmod +0 -0
  27. data/bin/asl-samba-groupmod.help +14 -0
  28. data/bin/asl-samba-useradd +0 -0
  29. data/bin/asl-samba-useradd.help +12 -0
  30. data/bin/asl-samba-userdel +0 -0
  31. data/bin/asl-samba-userdel.help +10 -0
  32. data/bin/asl-samba-usermod +0 -0
  33. data/bin/asl-samba-usermod.help +14 -0
  34. data/bin/asl-useradd +0 -0
  35. data/bin/asl-useradd.help +47 -0
  36. data/bin/asl-userdel +0 -0
  37. data/bin/asl-userdel.help +17 -0
  38. data/bin/asl-usermod +0 -0
  39. data/bin/asl-usermod.help +45 -0
  40. data/bin/asl-usershow +0 -0
  41. data/bin/asl-usershow.help +10 -0
  42. data/lib/active_samba_ldap.rb +9 -3
  43. data/lib/active_samba_ldap/account_entry.rb +1 -1
  44. data/lib/active_samba_ldap/group_entry.rb +3 -5
  45. data/lib/active_samba_ldap/reloadable.rb +2 -0
  46. data/lib/active_samba_ldap/samba_group_entry.rb +1 -1
  47. data/lib/active_samba_ldap/version.rb +1 -1
  48. data/misc/rd2html.rb +1 -1
  49. data/rails/plugin/active_samba_ldap/init.rb +15 -0
  50. data/test-unit/History.txt +32 -0
  51. data/test-unit/README.txt +32 -0
  52. data/test-unit/Rakefile +22 -0
  53. data/test-unit/bin/testrb +5 -0
  54. data/test-unit/lib/test/unit.rb +280 -0
  55. data/test-unit/lib/test/unit/assertionfailederror.rb +14 -0
  56. data/test-unit/lib/test/unit/assertions.rb +722 -0
  57. data/test-unit/lib/test/unit/attribute.rb +125 -0
  58. data/test-unit/lib/test/unit/autorunner.rb +250 -0
  59. data/test-unit/lib/test/unit/collector.rb +43 -0
  60. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  61. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  62. data/test-unit/lib/test/unit/collector/load.rb +135 -0
  63. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  64. data/test-unit/lib/test/unit/color.rb +61 -0
  65. data/test-unit/lib/test/unit/diff.rb +524 -0
  66. data/test-unit/lib/test/unit/error.rb +124 -0
  67. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  68. data/test-unit/lib/test/unit/failure.rb +110 -0
  69. data/test-unit/lib/test/unit/fixture.rb +185 -0
  70. data/test-unit/lib/test/unit/notification.rb +116 -0
  71. data/test-unit/lib/test/unit/omission.rb +129 -0
  72. data/test-unit/lib/test/unit/pending.rb +130 -0
  73. data/test-unit/lib/test/unit/priority.rb +146 -0
  74. data/test-unit/lib/test/unit/runner/console.rb +46 -0
  75. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  76. data/test-unit/lib/test/unit/testcase.rb +174 -0
  77. data/test-unit/lib/test/unit/testresult.rb +89 -0
  78. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  79. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  80. data/test-unit/lib/test/unit/ui/console/testrunner.rb +195 -0
  81. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +49 -0
  82. data/test-unit/lib/test/unit/ui/testrunner.rb +20 -0
  83. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  84. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  85. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  86. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  87. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  88. data/test-unit/lib/test/unit/version.rb +7 -0
  89. data/test-unit/sample/adder.rb +13 -0
  90. data/test-unit/sample/subtracter.rb +12 -0
  91. data/test-unit/sample/tc_adder.rb +18 -0
  92. data/test-unit/sample/tc_subtracter.rb +18 -0
  93. data/test-unit/sample/ts_examples.rb +7 -0
  94. data/test-unit/test/collector/test_descendant.rb +135 -0
  95. data/test-unit/test/collector/test_dir.rb +406 -0
  96. data/test-unit/test/collector/test_load.rb +333 -0
  97. data/test-unit/test/collector/test_objectspace.rb +98 -0
  98. data/test-unit/test/run-test.rb +13 -0
  99. data/test-unit/test/test_assertions.rb +693 -0
  100. data/test-unit/test/test_attribute.rb +86 -0
  101. data/test-unit/test/test_color.rb +37 -0
  102. data/test-unit/test/test_diff.rb +477 -0
  103. data/test-unit/test/test_emacs_runner.rb +60 -0
  104. data/test-unit/test/test_error.rb +26 -0
  105. data/test-unit/test/test_failure.rb +33 -0
  106. data/test-unit/test/test_fixture.rb +275 -0
  107. data/test-unit/test/test_notification.rb +33 -0
  108. data/test-unit/test/test_omission.rb +81 -0
  109. data/test-unit/test/test_pending.rb +64 -0
  110. data/test-unit/test/test_priority.rb +89 -0
  111. data/test-unit/test/test_testcase.rb +411 -0
  112. data/test-unit/test/test_testresult.rb +113 -0
  113. data/test-unit/test/test_testsuite.rb +129 -0
  114. data/test-unit/test/testunit_test_util.rb +12 -0
  115. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  116. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  117. data/test-unit/test/util/test_observable.rb +102 -0
  118. data/test-unit/test/util/test_procwrapper.rb +36 -0
  119. data/test/asl-test-utils.rb +0 -1
  120. data/test/run-test.rb +8 -12
  121. data/test/test_asl_groupmod.rb +3 -1
  122. data/test/test_asl_useradd.rb +3 -3
  123. data/test/test_samba_encrypt.rb +0 -1
  124. metadata +225 -88
  125. data/po/active-samba-ldap.pot +0 -459
  126. data/test/test-unit-ext.rb +0 -4
  127. data/test/test-unit-ext/always-show-result.rb +0 -28
  128. data/test/test-unit-ext/backtrace-filter.rb +0 -17
  129. data/test/test-unit-ext/long-display-for-emacs.rb +0 -25
  130. data/test/test-unit-ext/priority.rb +0 -186
@@ -0,0 +1,14 @@
1
+ #--
2
+ #
3
+ # Author:: Nathaniel Talbott.
4
+ # Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
5
+ # License:: Ruby license.
6
+
7
+ module Test
8
+ module Unit
9
+
10
+ # Thrown by Test::Unit::Assertions when an assertion fails.
11
+ class AssertionFailedError < StandardError
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,722 @@
1
+ # Author:: Nathaniel Talbott.
2
+ # Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
3
+ # License:: Ruby license.
4
+
5
+ require 'test/unit/assertionfailederror'
6
+ require 'test/unit/util/backtracefilter'
7
+ require 'test/unit/diff'
8
+
9
+ module Test
10
+ module Unit
11
+
12
+ ##
13
+ # Test::Unit::Assertions contains the standard Test::Unit assertions.
14
+ # Assertions is included in Test::Unit::TestCase.
15
+ #
16
+ # To include it in your own code and use its functionality, you simply
17
+ # need to rescue Test::Unit::AssertionFailedError. Additionally you may
18
+ # override add_assertion to get notified whenever an assertion is made.
19
+ #
20
+ # Notes:
21
+ # * The message to each assertion, if given, will be propagated with the
22
+ # failure.
23
+ # * It is easy to add your own assertions based on assert_block().
24
+ #
25
+ # = Example Custom Assertion
26
+ #
27
+ # def deny(boolean, message = nil)
28
+ # message = build_message message, '<?> is not false or nil.', boolean
29
+ # assert_block message do
30
+ # not boolean
31
+ # end
32
+ # end
33
+
34
+ module Assertions
35
+
36
+ ##
37
+ # The assertion upon which all other assertions are based. Passes if the
38
+ # block yields true.
39
+ #
40
+ # Example:
41
+ # assert_block "Couldn't do the thing" do
42
+ # do_the_thing
43
+ # end
44
+
45
+ public
46
+ def assert_block(message="assert_block failed.") # :yields:
47
+ _wrap_assertion do
48
+ if (! yield)
49
+ raise AssertionFailedError.new(message.to_s)
50
+ end
51
+ end
52
+ end
53
+
54
+ ##
55
+ # Asserts that +boolean+ is not false or nil.
56
+ #
57
+ # Example:
58
+ # assert [1, 2].include?(5)
59
+
60
+ public
61
+ def assert(boolean, message=nil)
62
+ _wrap_assertion do
63
+ assert_block("assert should not be called with a block.") { !block_given? }
64
+ assert_block(build_message(message, "<?> is not true.", boolean)) { boolean }
65
+ end
66
+ end
67
+
68
+ ##
69
+ # Passes if +expected+ == +actual.
70
+ #
71
+ # Note that the ordering of arguments is important, since a helpful
72
+ # error message is generated when this one fails that tells you the
73
+ # values of expected and actual.
74
+ #
75
+ # Example:
76
+ # assert_equal 'MY STRING', 'my string'.upcase
77
+
78
+ public
79
+ def assert_equal(expected, actual, message=nil)
80
+ diff = AssertionMessage.delayed_literal do
81
+ if !expected.is_a?(String) or !actual.is_a?(String)
82
+ expected = AssertionMessage.convert(expected)
83
+ actual = AssertionMessage.convert(actual)
84
+ end
85
+ diff = Diff.readable(expected, actual)
86
+ if /^[-+]/ !~ diff
87
+ diff = ""
88
+ elsif /^[ ?]/ =~ diff or /(?:.*\n){2,}/ =~ diff
89
+ diff = "\n\ndiff:\n#{diff}"
90
+ else
91
+ diff = ""
92
+ end
93
+ diff
94
+ end
95
+ full_message = build_message(message, <<EOT, expected, actual, diff)
96
+ <?> expected but was
97
+ <?>.?
98
+ EOT
99
+ assert_block(full_message) { expected == actual }
100
+ end
101
+
102
+ private
103
+ def _check_exception_class(args) # :nodoc:
104
+ args.partition do |klass|
105
+ next if klass.instance_of?(Module)
106
+ assert(Exception >= klass, "Should expect a class of exception, #{klass}")
107
+ true
108
+ end
109
+ end
110
+
111
+ private
112
+ def _expected_exception?(actual_exception, exceptions, modules) # :nodoc:
113
+ exceptions.include?(actual_exception.class) or
114
+ modules.any? {|mod| actual_exception.is_a?(mod)}
115
+ end
116
+
117
+ ##
118
+ # Passes if the block raises one of the given exceptions.
119
+ #
120
+ # Example:
121
+ # assert_raise RuntimeError, LoadError do
122
+ # raise 'Boom!!!'
123
+ # end
124
+
125
+ public
126
+ def assert_raise(*args)
127
+ _wrap_assertion do
128
+ if Module === args.last
129
+ message = ""
130
+ else
131
+ message = args.pop
132
+ end
133
+ exceptions, modules = _check_exception_class(args)
134
+ expected = args.size == 1 ? args.first : args
135
+ actual_exception = nil
136
+ full_message = build_message(message, "<?> exception expected but none was thrown.", expected)
137
+ assert_block(full_message) do
138
+ begin
139
+ yield
140
+ rescue Exception => actual_exception
141
+ break
142
+ end
143
+ false
144
+ end
145
+ full_message = build_message(message, "<?> exception expected but was\n?", expected, actual_exception)
146
+ assert_block(full_message) {_expected_exception?(actual_exception, exceptions, modules)}
147
+ actual_exception
148
+ end
149
+ end
150
+
151
+ ##
152
+ # Alias of assert_raise.
153
+ #
154
+ # Will be deprecated in 1.9, and removed in 2.0.
155
+
156
+ public
157
+ def assert_raises(*args, &block)
158
+ assert_raise(*args, &block)
159
+ end
160
+
161
+ ##
162
+ # Passes if +object+ .instance_of? +klass+
163
+ #
164
+ # Example:
165
+ # assert_instance_of String, 'foo'
166
+
167
+ public
168
+ def assert_instance_of(klass, object, message="")
169
+ _wrap_assertion do
170
+ assert_equal(Class, klass.class, "assert_instance_of takes a Class as its first argument")
171
+ full_message = build_message(message, <<EOT, object, klass, object.class)
172
+ <?> expected to be an instance of
173
+ <?> but was
174
+ <?>.
175
+ EOT
176
+ assert_block(full_message){object.instance_of?(klass)}
177
+ end
178
+ end
179
+
180
+ ##
181
+ # Passes if +object+ is nil.
182
+ #
183
+ # Example:
184
+ # assert_nil [1, 2].uniq!
185
+
186
+ public
187
+ def assert_nil(object, message="")
188
+ full_message = build_message(message, <<EOT, object)
189
+ <?> expected to be nil.
190
+ EOT
191
+ assert_block(full_message) { object.nil? }
192
+ end
193
+
194
+ ##
195
+ # Passes if +object+ .kind_of? +klass+
196
+ #
197
+ # Example:
198
+ # assert_kind_of Object, 'foo'
199
+
200
+ public
201
+ def assert_kind_of(klass, object, message="")
202
+ _wrap_assertion do
203
+ assert(klass.kind_of?(Module), "The first parameter to assert_kind_of should be a kind_of Module.")
204
+ full_message = build_message(message, "<?>\nexpected to be kind_of\\?\n<?> but was\n<?>.", object, klass, object.class)
205
+ assert_block(full_message){object.kind_of?(klass)}
206
+ end
207
+ end
208
+
209
+ ##
210
+ # Passes if +object+ .respond_to? +method+
211
+ #
212
+ # Example:
213
+ # assert_respond_to 'bugbear', :slice
214
+
215
+ public
216
+ def assert_respond_to(object, method, message="")
217
+ _wrap_assertion do
218
+ full_message = build_message(nil, "<?>\ngiven as the method name argument to #assert_respond_to must be a Symbol or #respond_to\\?(:to_str).", method)
219
+
220
+ assert_block(full_message) do
221
+ method.kind_of?(Symbol) || method.respond_to?(:to_str)
222
+ end
223
+ full_message = build_message(message, <<EOT, object, object.class, method)
224
+ <?>
225
+ of type <?>
226
+ expected to respond_to\\?<?>.
227
+ EOT
228
+ assert_block(full_message) { object.respond_to?(method) }
229
+ end
230
+ end
231
+
232
+ ##
233
+ # Passes if +string+ =~ +pattern+.
234
+ #
235
+ # Example:
236
+ # assert_match(/\d+/, 'five, 6, seven')
237
+
238
+ public
239
+ def assert_match(pattern, string, message="")
240
+ _wrap_assertion do
241
+ pattern = case(pattern)
242
+ when String
243
+ Regexp.new(Regexp.escape(pattern))
244
+ else
245
+ pattern
246
+ end
247
+ full_message = build_message(message, "<?> expected to be =~\n<?>.", string, pattern)
248
+ assert_block(full_message) { string =~ pattern }
249
+ end
250
+ end
251
+
252
+ ##
253
+ # Passes if +actual+ .equal? +expected+ (i.e. they are the same
254
+ # instance).
255
+ #
256
+ # Example:
257
+ # o = Object.new
258
+ # assert_same o, o
259
+
260
+ public
261
+ def assert_same(expected, actual, message="")
262
+ full_message = build_message(message, <<EOT, expected, expected.__id__, actual, actual.__id__)
263
+ <?>
264
+ with id <?> expected to be equal\\? to
265
+ <?>
266
+ with id <?>.
267
+ EOT
268
+ assert_block(full_message) { actual.equal?(expected) }
269
+ end
270
+
271
+ ##
272
+ # Compares the +object1+ with +object2+ using +operator+.
273
+ #
274
+ # Passes if object1.__send__(operator, object2) is true.
275
+ #
276
+ # Example:
277
+ # assert_operator 5, :>=, 4
278
+
279
+ public
280
+ def assert_operator(object1, operator, object2, message="")
281
+ _wrap_assertion do
282
+ full_message = build_message(nil, "<?>\ngiven as the operator for #assert_operator must be a Symbol or #respond_to\\?(:to_str).", operator)
283
+ assert_block(full_message){operator.kind_of?(Symbol) || operator.respond_to?(:to_str)}
284
+ full_message = build_message(message, <<EOT, object1, AssertionMessage.literal(operator), object2)
285
+ <?> expected to be
286
+ ?
287
+ <?>.
288
+ EOT
289
+ assert_block(full_message) { object1.__send__(operator, object2) }
290
+ end
291
+ end
292
+
293
+ ##
294
+ # Passes if block does not raise an exception.
295
+ #
296
+ # Example:
297
+ # assert_nothing_raised do
298
+ # [1, 2].uniq
299
+ # end
300
+
301
+ public
302
+ def assert_nothing_raised(*args)
303
+ _wrap_assertion do
304
+ if Module === args.last
305
+ message = ""
306
+ else
307
+ message = args.pop
308
+ end
309
+ exceptions, modules = _check_exception_class(args)
310
+ begin
311
+ yield
312
+ rescue Exception => e
313
+ if ((args.empty? && !e.instance_of?(AssertionFailedError)) ||
314
+ _expected_exception?(e, exceptions, modules))
315
+ assert_block(build_message(message, "Exception raised:\n?", e)){false}
316
+ else
317
+ raise
318
+ end
319
+ end
320
+ nil
321
+ end
322
+ end
323
+
324
+ ##
325
+ # Flunk always fails.
326
+ #
327
+ # Example:
328
+ # flunk 'Not done testing yet.'
329
+
330
+ public
331
+ def flunk(message="Flunked")
332
+ assert_block(build_message(message)){false}
333
+ end
334
+
335
+ ##
336
+ # Passes if ! +actual+ .equal? +expected+
337
+ #
338
+ # Example:
339
+ # assert_not_same Object.new, Object.new
340
+
341
+ public
342
+ def assert_not_same(expected, actual, message="")
343
+ full_message = build_message(message, <<EOT, expected, expected.__id__, actual, actual.__id__)
344
+ <?>
345
+ with id <?> expected to not be equal\\? to
346
+ <?>
347
+ with id <?>.
348
+ EOT
349
+ assert_block(full_message) { !actual.equal?(expected) }
350
+ end
351
+
352
+ ##
353
+ # Passes if +expected+ != +actual+
354
+ #
355
+ # Example:
356
+ # assert_not_equal 'some string', 5
357
+
358
+ public
359
+ def assert_not_equal(expected, actual, message="")
360
+ full_message = build_message(message, "<?> expected to be != to\n<?>.", expected, actual)
361
+ assert_block(full_message) { expected != actual }
362
+ end
363
+
364
+ ##
365
+ # Passes if ! +object+ .nil?
366
+ #
367
+ # Example:
368
+ # assert_not_nil '1 two 3'.sub!(/two/, '2')
369
+
370
+ public
371
+ def assert_not_nil(object, message="")
372
+ full_message = build_message(message, "<?> expected to not be nil.", object)
373
+ assert_block(full_message){!object.nil?}
374
+ end
375
+
376
+ ##
377
+ # Passes if +regexp+ !~ +string+
378
+ #
379
+ # Example:
380
+ # assert_no_match(/two/, 'one 2 three')
381
+
382
+ public
383
+ def assert_no_match(regexp, string, message="")
384
+ _wrap_assertion do
385
+ assert_instance_of(Regexp, regexp, "The first argument to assert_no_match should be a Regexp.")
386
+ full_message = build_message(message, "<?> expected to not match\n<?>.", regexp, string)
387
+ assert_block(full_message) { regexp !~ string }
388
+ end
389
+ end
390
+
391
+ UncaughtThrow = {
392
+ NameError => /^uncaught throw \`(.+)\'$/,
393
+ ArgumentError => /^uncaught throw (.+)$/,
394
+ ThreadError => /^uncaught throw \`(.+)\' in thread /
395
+ } #`
396
+
397
+ ##
398
+ # Passes if the block throws +expected_object+
399
+ #
400
+ # Example:
401
+ # assert_throws :done do
402
+ # throw :done
403
+ # end
404
+
405
+ public
406
+ def assert_throws(expected_object, message="", &proc)
407
+ _wrap_assertion do
408
+ begin
409
+ catch([]) {}
410
+ rescue TypeError
411
+ assert_instance_of(Symbol, expected_object,
412
+ "assert_throws expects the symbol that should be thrown for its first argument")
413
+ end
414
+ assert_block("Should have passed a block to assert_throws.") do
415
+ block_given?
416
+ end
417
+ caught = true
418
+ begin
419
+ catch(expected_object) do
420
+ proc.call
421
+ caught = false
422
+ end
423
+ full_message = build_message(message,
424
+ "<?> should have been thrown.",
425
+ expected_object)
426
+ assert_block(full_message) {caught}
427
+ rescue NameError, ArgumentError, ThreadError => error
428
+ raise unless UncaughtThrow[error.class] =~ error.message
429
+ tag = $1
430
+ tag = tag[1..-1].intern if tag[0, 1] == ":"
431
+ full_message = build_message(message,
432
+ "<?> expected to be thrown but\n" +
433
+ "<?> was thrown.",
434
+ expected_object, tag)
435
+ flunk(full_message)
436
+ end
437
+ end
438
+ end
439
+
440
+ ##
441
+ # Passes if block does not throw anything.
442
+ #
443
+ # Example:
444
+ # assert_nothing_thrown do
445
+ # [1, 2].uniq
446
+ # end
447
+
448
+ public
449
+ def assert_nothing_thrown(message="", &proc)
450
+ _wrap_assertion do
451
+ assert(block_given?, "Should have passed a block to assert_nothing_thrown")
452
+ begin
453
+ proc.call
454
+ rescue NameError, ArgumentError, ThreadError => error
455
+ raise unless UncaughtThrow[error.class] =~ error.message
456
+ tag = $1
457
+ tag = tag[1..-1].intern if tag[0, 1] == ":"
458
+ full_message = build_message(message,
459
+ "<?> was thrown when nothing was expected",
460
+ tag)
461
+ flunk(full_message)
462
+ end
463
+ assert(true, "Expected nothing to be thrown")
464
+ end
465
+ end
466
+
467
+ ##
468
+ # Passes if +expected_float+ and +actual_float+ are equal
469
+ # within +delta+ tolerance.
470
+ #
471
+ # Example:
472
+ # assert_in_delta 0.05, (50000.0 / 10**6), 0.00001
473
+
474
+ public
475
+ def assert_in_delta(expected_float, actual_float, delta, message="")
476
+ _wrap_assertion do
477
+ {expected_float => "first float", actual_float => "second float", delta => "delta"}.each do |float, name|
478
+ assert_respond_to(float, :to_f, "The arguments must respond to to_f; the #{name} did not")
479
+ end
480
+ assert_operator(delta, :>=, 0.0, "The delta should not be negative")
481
+ full_message = build_message(message, <<EOT, expected_float, actual_float, delta)
482
+ <?> and
483
+ <?> expected to be within
484
+ <?> of each other.
485
+ EOT
486
+ assert_block(full_message) { (expected_float.to_f - actual_float.to_f).abs <= delta.to_f }
487
+ end
488
+ end
489
+
490
+ ##
491
+ # Passes if the method send returns a true value.
492
+ #
493
+ # +send_array+ is composed of:
494
+ # * A receiver
495
+ # * A method
496
+ # * Arguments to the method
497
+ #
498
+ # Example:
499
+ # assert_send [[1, 2], :include?, 4]
500
+
501
+ public
502
+ def assert_send(send_array, message="")
503
+ _wrap_assertion do
504
+ assert_instance_of(Array, send_array, "assert_send requires an array of send information")
505
+ assert(send_array.size >= 2, "assert_send requires at least a receiver and a message name")
506
+ full_message = build_message(message, <<EOT, send_array[0], AssertionMessage.literal(send_array[1].to_s), send_array[2..-1])
507
+ <?> expected to respond to
508
+ <?(?)> with a true value.
509
+ EOT
510
+ assert_block(full_message) { send_array[0].__send__(send_array[1], *send_array[2..-1]) }
511
+ end
512
+ end
513
+
514
+ ##
515
+ # Passes if +actual+ is a boolean value.
516
+ #
517
+ # Example:
518
+ # assert_boolean(true) # -> pass
519
+ # assert_boolean(nil) # -> fail
520
+ def assert_boolean(actual, message=nil)
521
+ _wrap_assertion do
522
+ assert_block(build_message(message,
523
+ "<true> or <false> expected but was\n<?>",
524
+ actual)) do
525
+ [true, false].include?(actual)
526
+ end
527
+ end
528
+ end
529
+
530
+ ##
531
+ # Passes if +actual+ is true.
532
+ #
533
+ # Example:
534
+ # assert_true(true) # -> pass
535
+ # assert_true(:true) # -> fail
536
+ def assert_true(actual, message=nil)
537
+ _wrap_assertion do
538
+ assert_block(build_message(message,
539
+ "<true> expected but was\n<?>",
540
+ actual)) do
541
+ actual == true
542
+ end
543
+ end
544
+ end
545
+
546
+ ##
547
+ # Passes if +actual+ is false.
548
+ #
549
+ # Example:
550
+ # assert_false(false) # -> pass
551
+ # assert_false(nil) # -> fail
552
+ def assert_false(actual, message=nil)
553
+ _wrap_assertion do
554
+ assert_block(build_message(message,
555
+ "<false> expected but was\n<?>",
556
+ actual)) do
557
+ actual == false
558
+ end
559
+ end
560
+ end
561
+
562
+ ##
563
+ # Builds a failure message. +head+ is added before the +template+ and
564
+ # +arguments+ replaces the '?'s positionally in the template.
565
+
566
+ public
567
+ def build_message(head, template=nil, *arguments)
568
+ template &&= template.chomp
569
+ return AssertionMessage.new(head, template, arguments)
570
+ end
571
+
572
+ private
573
+ def _wrap_assertion
574
+ @_assertion_wrapped ||= false
575
+ unless (@_assertion_wrapped)
576
+ @_assertion_wrapped = true
577
+ begin
578
+ add_assertion
579
+ return yield
580
+ ensure
581
+ @_assertion_wrapped = false
582
+ end
583
+ else
584
+ return yield
585
+ end
586
+ end
587
+
588
+ ##
589
+ # Called whenever an assertion is made. Define this in classes that
590
+ # include Test::Unit::Assertions to record assertion counts.
591
+
592
+ private
593
+ def add_assertion
594
+ end
595
+
596
+ ##
597
+ # Select whether or not to use the pretty-printer. If this option is set
598
+ # to false before any assertions are made, pp.rb will not be required.
599
+
600
+ public
601
+ def self.use_pp=(value)
602
+ AssertionMessage.use_pp = value
603
+ end
604
+
605
+ # :stopdoc:
606
+
607
+ class AssertionMessage
608
+ @use_pp = true
609
+ class << self
610
+ attr_accessor :use_pp
611
+
612
+ def literal(value)
613
+ Literal.new(value)
614
+ end
615
+
616
+ def delayed_literal(&block)
617
+ DelayedLiteral.new(block)
618
+ end
619
+
620
+ def convert(object)
621
+ case object
622
+ when Exception
623
+ <<EOM.chop
624
+ Class: <#{convert(object.class)}>
625
+ Message: <#{convert(object.message)}>
626
+ ---Backtrace---
627
+ #{Util::BacktraceFilter.filter_backtrace(object.backtrace).join("\n")}
628
+ ---------------
629
+ EOM
630
+ else
631
+ if use_pp
632
+ begin
633
+ require 'pp' unless defined?(PP)
634
+ return PP.pp(object, '').chomp
635
+ rescue LoadError
636
+ self.use_pp = false
637
+ end
638
+ end
639
+ object.inspect
640
+ end
641
+ end
642
+ end
643
+
644
+ class Literal
645
+ def initialize(value)
646
+ @value = value
647
+ end
648
+
649
+ def inspect
650
+ @value.to_s
651
+ end
652
+ end
653
+
654
+ class DelayedLiteral
655
+ def initialize(value)
656
+ @value = value
657
+ end
658
+
659
+ def inspect
660
+ @value.call.to_s
661
+ end
662
+ end
663
+
664
+ class Template
665
+ def self.create(string)
666
+ parts = (string ? string.scan(/(?=[^\\])\?|(?:\\\?|[^\?])+/m) : [])
667
+ self.new(parts)
668
+ end
669
+
670
+ attr_reader :count
671
+
672
+ def initialize(parts)
673
+ @parts = parts
674
+ @count = parts.find_all{|e| e == '?'}.size
675
+ end
676
+
677
+ def result(parameters)
678
+ raise "The number of parameters does not match the number of substitutions." if(parameters.size != count)
679
+ params = parameters.dup
680
+ @parts.collect{|e| e == '?' ? params.shift : e.gsub(/\\\?/m, '?')}.join('')
681
+ end
682
+ end
683
+
684
+ include Util::BacktraceFilter
685
+
686
+ def initialize(head, template_string, parameters)
687
+ @head = head
688
+ @template_string = template_string
689
+ @parameters = parameters
690
+ end
691
+
692
+ def convert(object)
693
+ self.class.convert(object)
694
+ end
695
+
696
+ def template
697
+ @template ||= Template.create(@template_string)
698
+ end
699
+
700
+ def add_period(string)
701
+ (string =~ /\.\Z/ ? string : string + '.')
702
+ end
703
+
704
+ def to_s
705
+ message_parts = []
706
+ if (@head)
707
+ head = @head.to_s
708
+ unless(head.empty?)
709
+ message_parts << add_period(head)
710
+ end
711
+ end
712
+ tail = template.result(@parameters.collect{|e| convert(e)})
713
+ message_parts << tail unless(tail.empty?)
714
+ message_parts.join("\n")
715
+ end
716
+ end
717
+
718
+ # :startdoc:
719
+
720
+ end
721
+ end
722
+ end