piko-max-mod 0.0.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 (78) hide show
  1. checksums.yaml +7 -0
  2. data/piko-max-mod.gemspec +12 -0
  3. data/test-unit-3.7.8/BSDL +24 -0
  4. data/test-unit-3.7.8/COPYING +64 -0
  5. data/test-unit-3.7.8/PSFL +271 -0
  6. data/test-unit-3.7.8/README.md +108 -0
  7. data/test-unit-3.7.8/Rakefile +74 -0
  8. data/test-unit-3.7.8/bin/test-unit +5 -0
  9. data/test-unit-3.7.8/doc/text/getting-started.md +120 -0
  10. data/test-unit-3.7.8/doc/text/how-to.md +90 -0
  11. data/test-unit-3.7.8/doc/text/news.md +2070 -0
  12. data/test-unit-3.7.8/lib/test/unit/assertion-failed-error.rb +60 -0
  13. data/test-unit-3.7.8/lib/test/unit/assertions.rb +2536 -0
  14. data/test-unit-3.7.8/lib/test/unit/attribute-matcher.rb +26 -0
  15. data/test-unit-3.7.8/lib/test/unit/attribute.rb +228 -0
  16. data/test-unit-3.7.8/lib/test/unit/auto-runner-loader.rb +17 -0
  17. data/test-unit-3.7.8/lib/test/unit/autorunner.rb +654 -0
  18. data/test-unit-3.7.8/lib/test/unit/code-snippet-fetcher.rb +58 -0
  19. data/test-unit-3.7.8/lib/test/unit/collector/descendant.rb +20 -0
  20. data/test-unit-3.7.8/lib/test/unit/collector/dir.rb +110 -0
  21. data/test-unit-3.7.8/lib/test/unit/collector/load.rb +201 -0
  22. data/test-unit-3.7.8/lib/test/unit/collector/objectspace.rb +35 -0
  23. data/test-unit-3.7.8/lib/test/unit/collector/xml.rb +249 -0
  24. data/test-unit-3.7.8/lib/test/unit/collector.rb +104 -0
  25. data/test-unit-3.7.8/lib/test/unit/color-scheme.rb +225 -0
  26. data/test-unit-3.7.8/lib/test/unit/color.rb +134 -0
  27. data/test-unit-3.7.8/lib/test/unit/data-sets.rb +127 -0
  28. data/test-unit-3.7.8/lib/test/unit/data.rb +371 -0
  29. data/test-unit-3.7.8/lib/test/unit/diff.rb +745 -0
  30. data/test-unit-3.7.8/lib/test/unit/error.rb +158 -0
  31. data/test-unit-3.7.8/lib/test/unit/exception-handler.rb +82 -0
  32. data/test-unit-3.7.8/lib/test/unit/failure.rb +169 -0
  33. data/test-unit-3.7.8/lib/test/unit/fault-location-detector.rb +104 -0
  34. data/test-unit-3.7.8/lib/test/unit/fixture.rb +304 -0
  35. data/test-unit-3.7.8/lib/test/unit/notification.rb +138 -0
  36. data/test-unit-3.7.8/lib/test/unit/omission.rb +198 -0
  37. data/test-unit-3.7.8/lib/test/unit/pending.rb +155 -0
  38. data/test-unit-3.7.8/lib/test/unit/priority.rb +194 -0
  39. data/test-unit-3.7.8/lib/test/unit/process-test-result.rb +55 -0
  40. data/test-unit-3.7.8/lib/test/unit/process-worker.rb +87 -0
  41. data/test-unit-3.7.8/lib/test/unit/runner/console.rb +86 -0
  42. data/test-unit-3.7.8/lib/test/unit/runner/emacs.rb +8 -0
  43. data/test-unit-3.7.8/lib/test/unit/runner/xml.rb +15 -0
  44. data/test-unit-3.7.8/lib/test/unit/sub-test-result.rb +59 -0
  45. data/test-unit-3.7.8/lib/test/unit/test-process-run-context.rb +21 -0
  46. data/test-unit-3.7.8/lib/test/unit/test-run-context.rb +16 -0
  47. data/test-unit-3.7.8/lib/test/unit/test-suite-creator.rb +103 -0
  48. data/test-unit-3.7.8/lib/test/unit/test-suite-process-runner.rb +205 -0
  49. data/test-unit-3.7.8/lib/test/unit/test-suite-runner.rb +132 -0
  50. data/test-unit-3.7.8/lib/test/unit/test-suite-thread-runner.rb +96 -0
  51. data/test-unit-3.7.8/lib/test/unit/test-thread-run-context.rb +23 -0
  52. data/test-unit-3.7.8/lib/test/unit/testcase.rb +1058 -0
  53. data/test-unit-3.7.8/lib/test/unit/testresult.rb +132 -0
  54. data/test-unit-3.7.8/lib/test/unit/testsuite.rb +133 -0
  55. data/test-unit-3.7.8/lib/test/unit/ui/console/outputlevel.rb +15 -0
  56. data/test-unit-3.7.8/lib/test/unit/ui/console/testrunner.rb +891 -0
  57. data/test-unit-3.7.8/lib/test/unit/ui/emacs/testrunner.rb +49 -0
  58. data/test-unit-3.7.8/lib/test/unit/ui/testrunner.rb +53 -0
  59. data/test-unit-3.7.8/lib/test/unit/ui/testrunnermediator.rb +131 -0
  60. data/test-unit-3.7.8/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  61. data/test-unit-3.7.8/lib/test/unit/ui/xml/testrunner.rb +225 -0
  62. data/test-unit-3.7.8/lib/test/unit/util/backtracefilter.rb +65 -0
  63. data/test-unit-3.7.8/lib/test/unit/util/memory-usage.rb +47 -0
  64. data/test-unit-3.7.8/lib/test/unit/util/method-owner-finder.rb +28 -0
  65. data/test-unit-3.7.8/lib/test/unit/util/observable.rb +86 -0
  66. data/test-unit-3.7.8/lib/test/unit/util/output.rb +32 -0
  67. data/test-unit-3.7.8/lib/test/unit/util/procwrapper.rb +48 -0
  68. data/test-unit-3.7.8/lib/test/unit/version.rb +5 -0
  69. data/test-unit-3.7.8/lib/test/unit/warning.rb +3 -0
  70. data/test-unit-3.7.8/lib/test/unit/worker-context.rb +20 -0
  71. data/test-unit-3.7.8/lib/test/unit.rb +521 -0
  72. data/test-unit-3.7.8/lib/test-unit.rb +19 -0
  73. data/test-unit-3.7.8/sample/adder.rb +13 -0
  74. data/test-unit-3.7.8/sample/subtracter.rb +12 -0
  75. data/test-unit-3.7.8/sample/test_adder.rb +20 -0
  76. data/test-unit-3.7.8/sample/test_subtracter.rb +20 -0
  77. data/test-unit-3.7.8/sample/test_user.rb +23 -0
  78. metadata +117 -0
@@ -0,0 +1,2536 @@
1
+ # Author:: Nathaniel Talbott.
2
+ # Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
3
+ # Copyright (c) 2009-2013 Kouhei Sutou. All rights reserved.
4
+ # License:: Ruby license.
5
+
6
+ require_relative 'assertion-failed-error'
7
+ require_relative 'util/backtracefilter'
8
+ require_relative 'util/memory-usage'
9
+ require_relative 'util/method-owner-finder'
10
+ require_relative 'diff'
11
+
12
+ module Test
13
+ module Unit
14
+
15
+ ##
16
+ # Test::Unit::Assertions contains the standard Test::Unit assertions.
17
+ # Assertions is included in Test::Unit::TestCase.
18
+ #
19
+ # To include it in your own code and use its functionality, you simply
20
+ # need to rescue Test::Unit::AssertionFailedError. Additionally you may
21
+ # override add_assertion to get notified whenever an assertion is made.
22
+ #
23
+ # Notes:
24
+ #
25
+ # * The message to each assertion, if given, will be propagated with the
26
+ # failure.
27
+ # * It is easy to add your own assertions based on assert_block().
28
+ #
29
+ # @example Example Custom Assertion
30
+ #
31
+ # def deny(boolean, message=nil)
32
+ # message = build_message(message, '<?> is not false or nil.', boolean)
33
+ # assert_block(message) do
34
+ # not boolean
35
+ # end
36
+ # end
37
+
38
+ module Assertions
39
+
40
+ ##
41
+ # The assertion upon which all other assertions are based. Passes if the
42
+ # block yields not false nor nil.
43
+ #
44
+ # @example
45
+ # assert_block "Couldn't do the thing" do
46
+ # do_the_thing
47
+ # end
48
+ def assert_block(message="assert_block failed.")
49
+ _wrap_assertion do
50
+ if (! yield)
51
+ options = {}
52
+ if message.respond_to?(:user_message)
53
+ options[:user_message] = message.user_message
54
+ end
55
+ raise AssertionFailedError.new(message.to_s, options)
56
+ end
57
+ end
58
+ end
59
+
60
+ # @private
61
+ NOT_SPECIFIED = Object.new
62
+
63
+ # @overload assert(object, message=nil)
64
+ #
65
+ # Asserts that `object` is not false nor nil.
66
+ #
67
+ # Normally, you don't need to use this assertion. Use more
68
+ # specific assertions such as #assert_equal and
69
+ # #assert_include.
70
+ #
71
+ # @example Pass patterns
72
+ # assert(true) # => pass
73
+ # assert([1, 2].include?(1)) # => pass
74
+ #
75
+ # @example Failure patterns
76
+ # assert(nil) # => failure
77
+ # assert(false) # => failure
78
+ # assert([1, 2].include?(5)) # => failure
79
+ #
80
+ # @param [Object] object The check target.
81
+ # @param [String] message The additional user message. It is
82
+ # showed when the assertion is failed.
83
+ # @return [void]
84
+ #
85
+ # @overload assert(message=nil) {}
86
+ #
87
+ # Asserts that the givens block returns not false nor nil.
88
+ #
89
+ # This style uses Power Assert. It means that you can see each
90
+ # object values in method chains on failure. See the following
91
+ # example about Power Assert.
92
+ #
93
+ # @example Power Assert
94
+ # coins = [1, 5, 50]
95
+ # target_coin = 10
96
+ # assert do
97
+ # coins.include?(target_coin)
98
+ # end
99
+ # # =>
100
+ # # coins.include?(target_coin)
101
+ # # | | |
102
+ # # | | 10
103
+ # # | false
104
+ # # [1, 5, 50]
105
+ #
106
+ # We recommend you to use Power Assert for predicate method
107
+ # checks rather than existing assertions such as
108
+ # #assert_include and #assert_predicate. Power Assert shows
109
+ # useful message for debugging.
110
+ #
111
+ # We don't recommend you use Power Assert for equality
112
+ # check. You should use #assert_equal for the case. Because
113
+ # #assert_equal shows more useful message for debugging.
114
+ #
115
+ # @example Pass patterns
116
+ # assert {true} # => pass
117
+ # assert {[1, 2].include?(1)} # => pass
118
+ #
119
+ # @example Failure patterns
120
+ # assert {nil} # => failure
121
+ # assert {false} # => failure
122
+ # assert {[1, 2].include?(5)} # => failure
123
+ #
124
+ # @param [String] message The additional user message. It is
125
+ # showed when the assertion is failed.
126
+ # @yield [] Given no parameters to the block.
127
+ # @yieldreturn [Object] The checked object.
128
+ # @return [void]
129
+ def assert(object=NOT_SPECIFIED, message=nil, &block)
130
+ _wrap_assertion do
131
+ have_object = !NOT_SPECIFIED.equal?(object)
132
+ if block
133
+ message = object if have_object
134
+ if defined?(PowerAssert)
135
+ PowerAssert.start(block, :assertion_method => __callee__) do |pa|
136
+ pa_message = AssertionMessage.delayed_literal(&pa.message_proc)
137
+ assertion_message = build_message(message, "?", pa_message)
138
+ assert_block(assertion_message) do
139
+ pa.yield
140
+ end
141
+ end
142
+ else
143
+ assert(yield, message)
144
+ end
145
+ else
146
+ unless have_object
147
+ raise ArgumentError, "wrong number of arguments (0 for 1..2)"
148
+ end
149
+ assertion_message = nil
150
+ case message
151
+ when nil, String, Proc
152
+ when AssertionMessage
153
+ assertion_message = message
154
+ else
155
+ error_message = "assertion message must be String, Proc or "
156
+ error_message += "#{AssertionMessage}: "
157
+ error_message += "<#{message.inspect}>(<#{message.class}>)"
158
+ raise ArgumentError, error_message, filter_backtrace(caller)
159
+ end
160
+ assertion_message ||= build_message(message,
161
+ "<?> is not true.",
162
+ object)
163
+ assert_block(assertion_message) do
164
+ object
165
+ end
166
+ end
167
+ end
168
+ end
169
+
170
+ # Asserts that `object` is false or nil.
171
+ #
172
+ # @note Just for minitest compatibility. :<
173
+ #
174
+ # @param [Object] object The object to be asserted.
175
+ # @return [void]
176
+ #
177
+ # @example Pass patterns
178
+ # refute(false) # => pass
179
+ # refute(nil) # => pass
180
+ #
181
+ # @example Failure patterns
182
+ # refute(true) # => failure
183
+ # refute("string") # => failure
184
+ #
185
+ # @since 2.5.3
186
+ def refute(object, message=nil)
187
+ _wrap_assertion do
188
+ assertion_message = nil
189
+ case message
190
+ when nil, String, Proc
191
+ when AssertionMessage
192
+ assertion_message = message
193
+ else
194
+ error_message = "assertion message must be String, Proc or "
195
+ error_message += "#{AssertionMessage}: "
196
+ error_message += "<#{message.inspect}>(<#{message.class}>)"
197
+ raise ArgumentError, error_message, filter_backtrace(caller)
198
+ end
199
+ assert_block("refute should not be called with a block.") do
200
+ !block_given?
201
+ end
202
+ assertion_message ||= build_message(message,
203
+ "<?> is neither nil or false.",
204
+ object)
205
+ assert_block(assertion_message) do
206
+ not object
207
+ end
208
+ end
209
+ end
210
+
211
+ ##
212
+ # Passes if `expected` == `actual`.
213
+ #
214
+ # Note that the ordering of arguments is important, since a helpful
215
+ # error message is generated when this one fails that tells you the
216
+ # values of expected and actual.
217
+ #
218
+ # @example
219
+ # assert_equal 'MY STRING', 'my string'.upcase
220
+ def assert_equal(expected, actual, message=nil)
221
+ diff = AssertionMessage.delayed_diff(expected, actual)
222
+ if expected.respond_to?(:encoding) and
223
+ actual.respond_to?(:encoding) and
224
+ expected.encoding != actual.encoding
225
+ format = <<EOT
226
+ <?>(?) expected but was
227
+ <?>(?).?
228
+ EOT
229
+ full_message = build_message(message, format,
230
+ expected, expected.encoding.name,
231
+ actual, actual.encoding.name,
232
+ diff)
233
+ else
234
+ full_message = build_message(message, <<EOT, expected, actual, diff)
235
+ <?> expected but was
236
+ <?>.?
237
+ EOT
238
+ end
239
+ begin
240
+ assert_block(full_message) { expected == actual }
241
+ rescue AssertionFailedError => failure
242
+ _set_failed_information(failure, expected, actual)
243
+ raise failure # For JRuby. :<
244
+ end
245
+ end
246
+
247
+ ##
248
+ # Passes if the block raises one of the expected
249
+ # exceptions. When an expected exception is an Exception
250
+ # object, passes if expected_exception == actual_exception.
251
+ #
252
+ # @example
253
+ # assert_raise(RuntimeError, LoadError) do
254
+ # raise 'Boom!!!'
255
+ # end # -> pass
256
+ #
257
+ # assert_raise do
258
+ # raise Exception, 'Any exception should be raised!!!'
259
+ # end # -> pass
260
+ #
261
+ # assert_raise(RuntimeError.new("XXX")) {raise "XXX"} # -> pass
262
+ # assert_raise(MyError.new("XXX")) {raise "XXX"} # -> fail
263
+ # assert_raise(RuntimeError.new("ZZZ")) {raise "XXX"} # -> fail
264
+ def assert_raise(*args, &block)
265
+ assert_expected_exception = Proc.new do |*_args|
266
+ message, assert_exception_helper, actual_exception = _args
267
+ expected = assert_exception_helper.expected_exceptions
268
+ diff = AssertionMessage.delayed_diff(expected, actual_exception)
269
+ full_message = build_message(message,
270
+ "<?> exception expected but was\n<?>.?",
271
+ expected, actual_exception, diff)
272
+ begin
273
+ assert_block(full_message) do
274
+ expected == [] or
275
+ assert_exception_helper.expected?(actual_exception)
276
+ end
277
+ rescue AssertionFailedError => failure
278
+ _set_failed_information(failure, expected, actual_exception)
279
+ raise failure # For JRuby. :<
280
+ end
281
+ end
282
+ _assert_raise(assert_expected_exception, *args, &block)
283
+ end
284
+
285
+ # Just for minitest compatibility. :<
286
+ alias_method :assert_raises, :assert_raise
287
+
288
+ # Passes if the block raises `expected_exception` with
289
+ # `expected_message`. `expected_message` can be a `String` or
290
+ # `Regexp`.
291
+ #
292
+ # @example Pass pattern: String
293
+ # assert_raise_with_message(RuntimeError, "Boom!!!") do
294
+ # raise "Boom!!!"
295
+ # end # -> pass
296
+ #
297
+ # @example Pass pattern: Regexp
298
+ # assert_raise_with_message(RuntimeError, /!!!/) do
299
+ # raise "Boom!!!"
300
+ # end # -> pass
301
+ #
302
+ # @example Failure pattern: Exception class isn't matched
303
+ # assert_raise_with_message(RuntimeError, "Boom!!!") do
304
+ # raise ArgumentError, "Boom!!!"
305
+ # end # -> failure
306
+ #
307
+ # @example Failure pattern: Exception message isn't matched
308
+ # assert_raise_with_message(RuntimeError, "Boom!!!") do
309
+ # raise "Hello"
310
+ # end # -> failure
311
+ #
312
+ # @since 3.4.3
313
+ def assert_raise_with_message(expected_exception_class,
314
+ expected_message,
315
+ message=nil,
316
+ &block)
317
+ assert_expected_exception = Proc.new do |*_args|
318
+ _message, assert_exception_helper, actual_exception = _args
319
+ diff = AssertionMessage.delayed_diff([
320
+ expected_exception_class,
321
+ expected_message,
322
+ ],
323
+ [
324
+ actual_exception.class,
325
+ actual_exception.message,
326
+ ])
327
+ full_message = build_message(message,
328
+ "<?>(<?>) exception expected but was\n" +
329
+ "<?>(<?>).?",
330
+ expected_exception_class,
331
+ expected_message,
332
+ actual_exception.class,
333
+ actual_exception.message,
334
+ diff)
335
+ begin
336
+ assert_block(full_message) do
337
+ assert_exception_helper.expected?(actual_exception) and
338
+ expected_message === actual_exception.message
339
+ end
340
+ rescue AssertionFailedError => failure
341
+ _set_failed_information(failure,
342
+ expected_exception_class,
343
+ actual_exception)
344
+ raise failure # For JRuby. :<
345
+ end
346
+ actual_exception
347
+ end
348
+ args = [expected_exception_class]
349
+ args << message if message
350
+ _assert_raise(assert_expected_exception, *args, &block)
351
+ end
352
+
353
+ ##
354
+ # Passes if the block raises one of the given
355
+ # exceptions or sub exceptions of the given exceptions.
356
+ #
357
+ # @example
358
+ # assert_raise_kind_of(SystemCallError) do
359
+ # raise Errno::EACCES
360
+ # end
361
+ def assert_raise_kind_of(*args, &block)
362
+ assert_expected_exception = Proc.new do |*_args|
363
+ message, assert_exception_helper, actual_exception = _args
364
+ expected = assert_exception_helper.expected_exceptions
365
+ full_message = build_message(message,
366
+ "<?> family exception expected " +
367
+ "but was\n<?>.",
368
+ expected, actual_exception)
369
+ assert_block(full_message) do
370
+ assert_exception_helper.expected?(actual_exception, :kind_of?)
371
+ end
372
+ end
373
+ _assert_raise(assert_expected_exception, *args, &block)
374
+ end
375
+
376
+
377
+ ##
378
+ # Passes if `object`.instance_of?(`klass`). When `klass` is
379
+ # an array of classes, it passes if any class
380
+ # satisfies +object.instance_of?(class).
381
+ #
382
+ # @example
383
+ # assert_instance_of(String, 'foo') # -> pass
384
+ # assert_instance_of([Fixnum, NilClass], 100) # -> pass
385
+ # assert_instance_of([Numeric, NilClass], 100) # -> fail
386
+ def assert_instance_of(klass, object, message=nil)
387
+ _wrap_assertion do
388
+ if klass.is_a?(Array)
389
+ klasses = klass
390
+ else
391
+ klasses = [klass]
392
+ end
393
+ assert_block("The first parameter to assert_instance_of should be " +
394
+ "a Class or an Array of Class.") do
395
+ klasses.all? {|k| k.is_a?(Class)}
396
+ end
397
+ klass_message = AssertionMessage.maybe_container(klass) do |value|
398
+ "<#{value}>"
399
+ end
400
+ full_message = build_message(message, <<EOT, object, klass_message, object.class)
401
+ <?> was expected to be instance_of\\?
402
+ ? but was
403
+ <?>.
404
+ EOT
405
+ assert_block(full_message) do
406
+ klasses.any? {|k| object.instance_of?(k)}
407
+ end
408
+ end
409
+ end
410
+
411
+ ##
412
+ # Passes if `object`.instance_of?(`klass`) does not hold.
413
+ # When `klass` is an array of classes, it passes if no class
414
+ # satisfies +object.instance_of?(class).
415
+ #
416
+ # @example
417
+ # assert_not_instance_of(String, 100) # -> pass
418
+ # assert_not_instance_of([Fixnum, NilClass], '100') # -> pass
419
+ # assert_not_instance_of([Numeric, NilClass], 100) # -> fail
420
+ #
421
+ # @since 3.0.0
422
+ def assert_not_instance_of(klass, object, message=nil)
423
+ _wrap_assertion do
424
+ if klass.is_a?(Array)
425
+ klasses = klass
426
+ else
427
+ klasses = [klass]
428
+ end
429
+ assert_block("The first parameter to assert_not_instance_of should be " +
430
+ "a Class or an Array of Class.") do
431
+ klasses.all? {|k| k.is_a?(Class)}
432
+ end
433
+ klass_message = AssertionMessage.maybe_container(klass) do |value|
434
+ "<#{value}>"
435
+ end
436
+ full_message = build_message(message,
437
+ "<?> was expected to not be instance_of\\?\n" +
438
+ "? but was.",
439
+ object,
440
+ klass_message)
441
+ assert_block(full_message) do
442
+ klasses.none? {|k| object.instance_of?(k)}
443
+ end
444
+ end
445
+ end
446
+
447
+ # Just for minitest compatibility. :<
448
+ #
449
+ # @since 3.0.0
450
+ alias_method :refute_instance_of, :assert_not_instance_of
451
+
452
+ ##
453
+ # Passes if `object`.nil?.
454
+ #
455
+ # @example
456
+ # assert_nil [1, 2].uniq!
457
+ def assert_nil(object, message=nil)
458
+ full_message = build_message(message, <<EOT, object)
459
+ <?> was expected to be nil.
460
+ EOT
461
+ assert_block(full_message) { object.nil? }
462
+ end
463
+
464
+ ##
465
+ # Passes if `object`.kind_of?(`klass`). When `klass` is
466
+ # an array of classes or modules, it passes if any
467
+ # class or module satisfies +object.kind_of?(class_or_module).
468
+ #
469
+ # @example
470
+ # assert_kind_of(Object, 'foo') # -> pass
471
+ # assert_kind_of([Fixnum, NilClass], 100) # -> pass
472
+ # assert_kind_of([Fixnum, NilClass], "string") # -> fail
473
+ def assert_kind_of(klass, object, message=nil)
474
+ _wrap_assertion do
475
+ if klass.is_a?(Array)
476
+ klasses = klass
477
+ else
478
+ klasses = [klass]
479
+ end
480
+ assert_block("The first parameter to assert_kind_of should be " +
481
+ "a kind_of Module or an Array of a kind_of Module.") do
482
+ klasses.all? {|k| k.kind_of?(Module)}
483
+ end
484
+ klass_message = AssertionMessage.maybe_container(klass) do |value|
485
+ "<#{value}>"
486
+ end
487
+ full_message = build_message(message,
488
+ "<?> was expected to be kind_of\\?\n" +
489
+ "? but was\n" +
490
+ "<?>.",
491
+ object,
492
+ klass_message,
493
+ object.class)
494
+ assert_block(full_message) do
495
+ klasses.any? {|k| object.kind_of?(k)}
496
+ end
497
+ end
498
+ end
499
+
500
+ ##
501
+ # Passes if `object`.kind_of?(`klass`) does not hold.
502
+ # When `klass` is an array of classes or modules, it passes only if all
503
+ # classes (and modules) do not satisfy +object.kind_of?(class_or_module).
504
+ #
505
+ # @example
506
+ # assert_not_kind_of(Fixnum, 'foo') # -> pass
507
+ # assert_not_kind_of([Fixnum, NilClass], '0') # -> pass
508
+ # assert_not_kind_of([Fixnum, NilClass], 100) # -> fail
509
+ #
510
+ # @since 3.0.0
511
+ def assert_not_kind_of(klass, object, message=nil)
512
+ _wrap_assertion do
513
+ if klass.is_a?(Array)
514
+ klasses = klass
515
+ else
516
+ klasses = [klass]
517
+ end
518
+ assert_block("The first parameter to assert_not_kind_of should be " +
519
+ "a kind_of Module or an Array of a kind_of Module.") do
520
+ klasses.all? {|k| k.kind_of?(Module)}
521
+ end
522
+ klass_message = AssertionMessage.maybe_container(klass) do |value|
523
+ "<#{value}>"
524
+ end
525
+ full_message = build_message(message,
526
+ "<?> was expected to not be kind_of\\?\n" +
527
+ "? but was.",
528
+ object,
529
+ klass_message)
530
+ assert_block(full_message) do
531
+ klasses.none? {|k| object.kind_of?(k)}
532
+ end
533
+ end
534
+ end
535
+
536
+ # Just for minitest compatibility. :<
537
+ #
538
+ # @since 3.0.0
539
+ alias_method :refute_kind_of, :assert_not_kind_of
540
+
541
+ ##
542
+ # Passes if `object` .respond_to? `method`
543
+ #
544
+ # @example
545
+ # assert_respond_to 'bugbear', :slice
546
+ def assert_respond_to(object, method, message=nil)
547
+ _wrap_assertion do
548
+ full_message = build_message(message,
549
+ "<?>.kind_of\\?(Symbol) or\n" +
550
+ "<?>.respond_to\\?(:to_str) expected",
551
+ method, method)
552
+ assert_block(full_message) do
553
+ method.kind_of?(Symbol) or method.respond_to?(:to_str)
554
+ end
555
+ full_message = build_message(message,
556
+ "<?>.respond_to\\?(?) expected\n" +
557
+ "(Class: <?>)",
558
+ object, method, object.class)
559
+ assert_block(full_message) {object.respond_to?(method)}
560
+ end
561
+ end
562
+
563
+ ##
564
+ # Passes if `object` does not .respond_to? `method`.
565
+ #
566
+ # @example
567
+ # assert_not_respond_to('bugbear', :nonexistence) # -> pass
568
+ # assert_not_respond_to('bugbear', :size) # -> fail
569
+ def assert_not_respond_to(object, method, message=nil)
570
+ _wrap_assertion do
571
+ full_message = build_message(message,
572
+ "<?>.kind_of\\?(Symbol) or\n" +
573
+ "<?>.respond_to\\?(:to_str) expected",
574
+ method, method)
575
+ assert_block(full_message) do
576
+ method.kind_of?(Symbol) or method.respond_to?(:to_str)
577
+ end
578
+ full_message = build_message(message,
579
+ "!<?>.respond_to\\?(?) expected\n" +
580
+ "(Class: <?>)",
581
+ object, method, object.class)
582
+ assert_block(full_message) {!object.respond_to?(method)}
583
+ end
584
+ end
585
+
586
+ # Just for minitest compatibility. :<
587
+ #
588
+ # @since 2.5.3
589
+ alias_method :refute_respond_to, :assert_not_respond_to
590
+
591
+ ##
592
+ # Passes if `pattern` =~ `string`.
593
+ #
594
+ # @example
595
+ # assert_match(/\d+/, 'five, 6, seven')
596
+ def assert_match(pattern, string, message=nil)
597
+ _wrap_assertion do
598
+ pattern = Regexp.new(Regexp.escape(pattern)) if pattern.is_a?(String)
599
+ full_message = build_message(message,
600
+ "<?> was expected to be =~\n<?>.",
601
+ pattern, string)
602
+ assert_block(full_message) { pattern =~ string }
603
+ end
604
+ end
605
+
606
+ ##
607
+ # Passes if `actual` .equal? `expected` (i.e. they are the same
608
+ # instance).
609
+ #
610
+ # @example
611
+ # o = Object.new
612
+ # assert_same o, o
613
+ def assert_same(expected, actual, message=nil)
614
+ full_message = build_message(message, <<EOT, expected, expected.__id__, actual, actual.__id__)
615
+ <?>
616
+ with id <?> was expected to be equal\\? to
617
+ <?>
618
+ with id <?>.
619
+ EOT
620
+ assert_block(full_message) { actual.equal?(expected) }
621
+ end
622
+
623
+ ##
624
+ # Compares the `object1` with `object2` using `operator`.
625
+ #
626
+ # Passes if object1.__send__(operator, object2) is not false nor nil.
627
+ #
628
+ # @example
629
+ # assert_operator 5, :>=, 4
630
+ def assert_operator(object1, operator, object2, message=nil)
631
+ _wrap_assertion do
632
+ full_message = build_message(nil, "<?>\ngiven as the operator for #assert_operator must be a Symbol or #respond_to\\?(:to_str).", operator)
633
+ assert_block(full_message){operator.kind_of?(Symbol) || operator.respond_to?(:to_str)}
634
+ full_message = build_message(message, <<EOT, object1, AssertionMessage.literal(operator), object2)
635
+ <?> was expected to be
636
+ ?
637
+ <?>.
638
+ EOT
639
+ assert_block(full_message) { object1.__send__(operator, object2) }
640
+ end
641
+ end
642
+
643
+ ##
644
+ # Compares the `object1` with `object2` using `operator`.
645
+ #
646
+ # Passes if object1.__send__(operator, object2) is false or nil.
647
+ #
648
+ # @example
649
+ # assert_not_operator(5, :<, 4) # => pass
650
+ # assert_not_operator(5, :>, 4) # => fail
651
+ #
652
+ # @since 3.0.0
653
+ def assert_not_operator(object1, operator, object2, message=nil)
654
+ _wrap_assertion do
655
+ full_message = build_message(nil, "<?>\ngiven as the operator for #assert_not_operator must be a Symbol or #respond_to\\?(:to_str).", operator)
656
+ assert_block(full_message){operator.kind_of?(Symbol) || operator.respond_to?(:to_str)}
657
+ full_message = build_message(message, <<EOT, object1, AssertionMessage.literal(operator), object2)
658
+ <?> was expected to not be
659
+ ?
660
+ <?>.
661
+ EOT
662
+ assert_block(full_message) { ! object1.__send__(operator, object2) }
663
+ end
664
+ end
665
+
666
+ # Just for minitest compatibility. :<
667
+ #
668
+ # @since 3.0.0
669
+ alias_method :refute_operator, :assert_not_operator
670
+
671
+ ##
672
+ # Passes if block does not raise an exception.
673
+ #
674
+ # @example
675
+ # assert_nothing_raised do
676
+ # [1, 2].uniq
677
+ # end
678
+ def assert_nothing_raised(*args)
679
+ _wrap_assertion do
680
+ if args.last.is_a?(String)
681
+ message = args.pop
682
+ else
683
+ message = ""
684
+ end
685
+
686
+ assert_exception_helper = AssertExceptionHelper.new(self, args)
687
+ begin
688
+ yield
689
+ rescue Exception => e
690
+ if ((args.empty? && !e.instance_of?(AssertionFailedError)) ||
691
+ assert_exception_helper.expected?(e))
692
+ failure_message = build_message(message, "Exception raised:\n?", e)
693
+ assert_block(failure_message) {false}
694
+ else
695
+ raise
696
+ end
697
+ end
698
+ end
699
+ end
700
+
701
+ ##
702
+ # Flunk always fails.
703
+ #
704
+ # @example
705
+ # flunk 'Not done testing yet.'
706
+ def flunk(message="Flunked")
707
+ assert_block(build_message(message)){false}
708
+ end
709
+
710
+ ##
711
+ # Passes if ! `actual` .equal? `expected`
712
+ #
713
+ # @example
714
+ # assert_not_same Object.new, Object.new
715
+ def assert_not_same(expected, actual, message=nil)
716
+ full_message = build_message(message, <<EOT, expected, expected.__id__, actual, actual.__id__)
717
+ <?>
718
+ with id <?> was expected to not be equal\\? to
719
+ <?>
720
+ with id <?>.
721
+ EOT
722
+ assert_block(full_message) { !actual.equal?(expected) }
723
+ end
724
+
725
+ # Just for minitest compatibility. :<
726
+ #
727
+ # @since 2.5.3
728
+ alias_method :refute_same, :assert_not_same
729
+
730
+ ##
731
+ # Passes if `expected` != `actual`
732
+ #
733
+ # @example
734
+ # assert_not_equal 'some string', 5
735
+ def assert_not_equal(expected, actual, message=nil)
736
+ full_message = build_message(message,
737
+ "<?> was expected to be != to\n<?>.",
738
+ expected, actual)
739
+ assert_block(full_message) { expected != actual }
740
+ end
741
+
742
+ # Just for minitest compatibility. :<
743
+ #
744
+ # @since 2.5.3
745
+ alias_method :refute_equal, :assert_not_equal
746
+
747
+ ##
748
+ # Passes if ! `object` .nil?
749
+ #
750
+ # @example
751
+ # assert_not_nil '1 two 3'.sub!(/two/, '2')
752
+ def assert_not_nil(object, message=nil)
753
+ full_message = build_message(message,
754
+ "<?> was expected to not be nil.",
755
+ object)
756
+ assert_block(full_message){!object.nil?}
757
+ end
758
+
759
+ # Just for minitest compatibility. :<
760
+ #
761
+ # @since 2.5.3
762
+ alias_method :refute_nil, :assert_not_nil
763
+
764
+ ##
765
+ # Passes if `regexp` !~ `string`
766
+ #
767
+ # @example
768
+ # assert_not_match(/two/, 'one 2 three') # -> pass
769
+ # assert_not_match(/three/, 'one 2 three') # -> fail
770
+ def assert_not_match(pattern, string, message=nil)
771
+ _wrap_assertion do
772
+ pattern = Regexp.new(Regexp.escape(pattern)) if pattern.is_a?(String)
773
+ full_message = build_message(message,
774
+ "<?> was expected to not match\n<?>.",
775
+ pattern, string)
776
+ assert_block(full_message) { pattern !~ string }
777
+ end
778
+ end
779
+
780
+ # Just for minitest compatibility. :<
781
+ #
782
+ # @since 2.5.3
783
+ alias_method :refute_match, :assert_not_match
784
+
785
+ ##
786
+ # @deprecated Use {#assert_not_match} instead.
787
+ #
788
+ # Passes if `regexp` !~ `string`
789
+ #
790
+ # @example
791
+ # assert_no_match(/two/, 'one 2 three') # -> pass
792
+ # assert_no_match(/three/, 'one 2 three') # -> fail
793
+ def assert_no_match(regexp, string, message="")
794
+ _wrap_assertion do
795
+ assert_instance_of(Regexp, regexp,
796
+ "The first argument to assert_no_match " +
797
+ "should be a Regexp.")
798
+ assert_not_match(regexp, string, message)
799
+ end
800
+ end
801
+
802
+ # @private
803
+ class ThrowTagExtractor
804
+ @@have_uncaught_throw_error = const_defined?(:UncaughtThrowError)
805
+
806
+ UncaughtThrowPatterns = {
807
+ NameError => /^uncaught throw `(.+)'$/,
808
+ ArgumentError => /^uncaught throw (`.+'|.+)$/,
809
+ ThreadError => /^uncaught throw `(.+)' in thread /,
810
+ }
811
+
812
+ def initialize(error)
813
+ @error = error
814
+ end
815
+
816
+ def extract_tag
817
+ tag = nil
818
+ if @@have_uncaught_throw_error
819
+ return nil unless @error.is_a?(UncaughtThrowError)
820
+ tag = @error.tag
821
+ else
822
+ pattern = UncaughtThrowPatterns[@error.class]
823
+ return nil if pattern.nil?
824
+ return nil unless pattern =~ @error.message
825
+ tag = $1
826
+ end
827
+ normalize_tag(tag)
828
+ end
829
+
830
+ private
831
+ def normalize_tag(tag)
832
+ case tag
833
+ when /\A:/
834
+ tag[1..-1].intern
835
+ when /\A`(.+)'\z/
836
+ $1.intern
837
+ when String
838
+ tag.intern
839
+ else
840
+ tag
841
+ end
842
+ end
843
+ end
844
+
845
+ ##
846
+ # Passes if the block throws `expected_object`
847
+ #
848
+ # @example
849
+ # assert_throw(:done) do
850
+ # throw(:done)
851
+ # end
852
+ def assert_throw(expected_object, message=nil, &proc)
853
+ _wrap_assertion do
854
+ begin
855
+ catch([]) {}
856
+ rescue TypeError
857
+ assert_instance_of(Symbol, expected_object,
858
+ "assert_throws expects the symbol that should be thrown for its first argument")
859
+ end
860
+ assert_block("Should have passed a block to assert_throw.") do
861
+ block_given?
862
+ end
863
+ caught = true
864
+ begin
865
+ catch(expected_object) do
866
+ proc.call
867
+ caught = false
868
+ end
869
+ full_message = build_message(message,
870
+ "<?> should have been thrown.",
871
+ expected_object)
872
+ assert_block(full_message) {caught}
873
+ rescue => error
874
+ extractor = ThrowTagExtractor.new(error)
875
+ tag = extractor.extract_tag
876
+ raise if tag.nil?
877
+ full_message = build_message(message,
878
+ "<?> was expected to be thrown but\n" +
879
+ "<?> was thrown.",
880
+ expected_object, tag)
881
+ flunk(full_message)
882
+ end
883
+ end
884
+ end
885
+
886
+ # Just for minitest compatibility. :<
887
+ #
888
+ # @since 2.5.3
889
+ alias_method :assert_throws, :assert_throw
890
+
891
+ ##
892
+ # Passes if block does not throw anything.
893
+ #
894
+ # @example
895
+ # assert_nothing_thrown do
896
+ # [1, 2].uniq
897
+ # end
898
+ def assert_nothing_thrown(message=nil, &proc)
899
+ _wrap_assertion do
900
+ assert(block_given?, "Should have passed a block to assert_nothing_thrown")
901
+ begin
902
+ proc.call
903
+ rescue => error
904
+ extractor = ThrowTagExtractor.new(error)
905
+ tag = extractor.extract_tag
906
+ raise if tag.nil?
907
+ full_message = build_message(message,
908
+ "<?> was thrown when nothing was expected",
909
+ tag)
910
+ flunk(full_message)
911
+ end
912
+ assert(true, "Expected nothing to be thrown")
913
+ end
914
+ end
915
+
916
+ ##
917
+ # Passes if `expected_float` and `actual_float` are equal
918
+ # within `delta` tolerance.
919
+ #
920
+ # @example
921
+ # assert_in_delta 0.05, (50000.0 / 10**6), 0.00001
922
+ def assert_in_delta(expected_float, actual_float, delta=0.001, message="")
923
+ _wrap_assertion do
924
+ begin
925
+ pass = delta >= (expected_float - actual_float).abs
926
+ assert_operator(delta, :>=, 0.0, "The delta should not be negative")
927
+ full_message = _assert_in_delta_message(expected_float,
928
+ expected_float,
929
+ actual_float,
930
+ actual_float,
931
+ delta,
932
+ delta,
933
+ message)
934
+ rescue Test::Unit::AssertionFailedError
935
+ # for the above assert_operator
936
+ raise
937
+ rescue
938
+ _assert_in_delta_validate_arguments(expected_float,
939
+ actual_float,
940
+ delta)
941
+ normalized_expected = expected_float.to_f
942
+ normalized_actual = actual_float.to_f
943
+ normalized_delta = delta.to_f
944
+ pass = (normalized_expected - normalized_actual).abs <= normalized_delta
945
+ full_message = _assert_in_delta_message(expected_float,
946
+ normalized_expected,
947
+ actual_float,
948
+ normalized_actual,
949
+ delta,
950
+ normalized_delta,
951
+ message)
952
+ end
953
+ assert_block(full_message) do
954
+ pass
955
+ end
956
+ end
957
+ end
958
+
959
+ ##
960
+ # Passes if `expected_float` and `actual_float` are
961
+ # not equal within `delta` tolerance.
962
+ #
963
+ # @example
964
+ # assert_not_in_delta(0.05, (50000.0 / 10**6), 0.00002) # -> pass
965
+ # assert_not_in_delta(0.05, (50000.0 / 10**6), 0.00001) # -> fail
966
+ def assert_not_in_delta(expected_float, actual_float, delta=0.001, message="")
967
+ _wrap_assertion do
968
+ _assert_in_delta_validate_arguments(expected_float,
969
+ actual_float,
970
+ delta)
971
+ begin
972
+ pass = (expected_float - actual_float).abs > delta
973
+ full_message = _assert_in_delta_message(expected_float,
974
+ expected_float,
975
+ actual_float,
976
+ actual_float,
977
+ delta,
978
+ delta,
979
+ message,
980
+ :negative_assertion => true)
981
+ rescue
982
+ normalized_expected = expected_float.to_f
983
+ normalized_actual = actual_float.to_f
984
+ normalized_delta = delta.to_f
985
+ pass = (normalized_expected - normalized_actual).abs > normalized_delta
986
+ full_message = _assert_in_delta_message(expected_float,
987
+ normalized_expected,
988
+ actual_float,
989
+ normalized_actual,
990
+ delta,
991
+ normalized_delta,
992
+ message,
993
+ :negative_assertion => true)
994
+ end
995
+ assert_block(full_message) do
996
+ pass
997
+ end
998
+ end
999
+ end
1000
+
1001
+ # Just for minitest compatibility. :<
1002
+ #
1003
+ # @since 2.5.3
1004
+ alias_method :refute_in_delta, :assert_not_in_delta
1005
+
1006
+ private
1007
+ def _assert_in_delta_validate_arguments(expected_float,
1008
+ actual_float,
1009
+ delta)
1010
+ {
1011
+ expected_float => "first float",
1012
+ actual_float => "second float",
1013
+ delta => "delta"
1014
+ }.each do |float, name|
1015
+ assert_respond_to(float, :to_f,
1016
+ "The arguments must respond to to_f; " +
1017
+ "the #{name} did not")
1018
+ end
1019
+ delta = delta.to_f
1020
+ assert_operator(delta, :>=, 0.0, "The delta should not be negative")
1021
+ end
1022
+
1023
+ def _assert_in_delta_message(expected_float, normalized_expected,
1024
+ actual_float, normalized_actual,
1025
+ delta, normalized_delta,
1026
+ message, options={})
1027
+ if options[:negative_assertion]
1028
+ format = <<-EOT
1029
+ <?> -/+ <?> was expected to not include
1030
+ <?>.
1031
+ EOT
1032
+ else
1033
+ format = <<-EOT
1034
+ <?> -/+ <?> was expected to include
1035
+ <?>.
1036
+ EOT
1037
+ end
1038
+ arguments = [expected_float, delta, actual_float]
1039
+ relation_format = nil
1040
+ relation_arguments = nil
1041
+ if normalized_actual < normalized_expected - normalized_delta
1042
+ relation_format = "<<?> < <?>-<?>[?] <= <?>+<?>[?]>"
1043
+ relation_arguments = [actual_float,
1044
+ expected_float, delta,
1045
+ normalized_expected - normalized_delta,
1046
+ expected_float, delta,
1047
+ normalized_expected + normalized_delta]
1048
+ elsif normalized_actual <= normalized_expected + normalized_delta
1049
+ relation_format = "<<?>-<?>[?] <= <?> <= <?>+<?>[?]>"
1050
+ relation_arguments = [expected_float, delta,
1051
+ normalized_expected - normalized_delta,
1052
+ actual_float,
1053
+ expected_float, delta,
1054
+ normalized_expected + normalized_delta]
1055
+ else
1056
+ relation_format = "<<?>-<?>[?] <= <?>+<?>[?] < <?>>"
1057
+ relation_arguments = [expected_float, delta,
1058
+ normalized_expected - normalized_delta,
1059
+ expected_float, delta,
1060
+ normalized_expected + normalized_delta,
1061
+ actual_float]
1062
+ end
1063
+
1064
+ if relation_format
1065
+ format += <<-EOT
1066
+
1067
+ Relation:
1068
+ #{relation_format}
1069
+ EOT
1070
+ arguments.concat(relation_arguments)
1071
+ end
1072
+
1073
+ build_message(message, format, *arguments)
1074
+ end
1075
+
1076
+ public
1077
+ ##
1078
+ # Passes if `expected_float` and `actual_float` are equal
1079
+ # within `epsilon` relative error of `expected_float`.
1080
+ #
1081
+ # @example
1082
+ # assert_in_epsilon(10000.0, 9900.0, 0.1) # -> pass
1083
+ # assert_in_epsilon(10000.0, 9899.0, 0.1) # -> fail
1084
+ def assert_in_epsilon(expected_float, actual_float, epsilon=0.001,
1085
+ message="")
1086
+ _wrap_assertion do
1087
+ begin
1088
+ zero_p = expected_float.zero? rescue expected_float == 0
1089
+ if zero_p
1090
+ delta = epsilon ** 2
1091
+ else
1092
+ delta = expected_float * epsilon
1093
+ end
1094
+ delta = delta.abs
1095
+ pass = (expected_float - actual_float).abs <= delta
1096
+ assert_operator(epsilon, :>=, 0.0, "The epsilon should not be negative")
1097
+ full_message = _assert_in_epsilon_message(expected_float,
1098
+ expected_float,
1099
+ actual_float,
1100
+ actual_float,
1101
+ epsilon,
1102
+ epsilon,
1103
+ delta,
1104
+ message)
1105
+ rescue Test::Unit::AssertionFailedError
1106
+ # for the above assert_operator
1107
+ raise
1108
+ rescue
1109
+ _assert_in_epsilon_validate_arguments(expected_float,
1110
+ actual_float,
1111
+ epsilon)
1112
+ normalized_expected = expected_float.to_f
1113
+ normalized_actual = actual_float.to_f
1114
+ normalized_epsilon = epsilon.to_f
1115
+ if normalized_expected.zero?
1116
+ delta = normalized_epsilon ** 2
1117
+ else
1118
+ delta = normalized_expected * normalized_epsilon
1119
+ end
1120
+ delta = delta.abs
1121
+ full_message = _assert_in_epsilon_message(expected_float,
1122
+ normalized_expected,
1123
+ actual_float,
1124
+ normalized_actual,
1125
+ epsilon,
1126
+ normalized_epsilon,
1127
+ delta,
1128
+ message)
1129
+ pass = (normalized_expected - normalized_actual).abs <= delta
1130
+ end
1131
+ assert_block(full_message) do
1132
+ pass
1133
+ end
1134
+ end
1135
+ end
1136
+
1137
+ ##
1138
+ # Passes if `expected_float` and `actual_float` are
1139
+ # not equal within `epsilon` relative error of
1140
+ # `expected_float`.
1141
+ #
1142
+ # @example
1143
+ # assert_not_in_epsilon(10000.0, 9900.0, 0.1) # -> fail
1144
+ # assert_not_in_epsilon(10000.0, 9899.0, 0.1) # -> pass
1145
+ def assert_not_in_epsilon(expected_float, actual_float, epsilon=0.001,
1146
+ message="")
1147
+ _wrap_assertion do
1148
+ begin
1149
+ delta = expected_float * epsilon
1150
+ pass = (expected_float - actual_float).abs > delta
1151
+ assert_operator(epsilon, :>=, 0.0, "The epsilon should not be negative")
1152
+ full_message = _assert_in_epsilon_message(expected_float,
1153
+ expected_float,
1154
+ actual_float,
1155
+ actual_float,
1156
+ epsilon,
1157
+ epsilon,
1158
+ delta,
1159
+ message,
1160
+ :negative_assertion => true)
1161
+ rescue Test::Unit::AssertionFailedError
1162
+ # for the above assert_operator
1163
+ raise
1164
+ rescue
1165
+ _assert_in_epsilon_validate_arguments(expected_float,
1166
+ actual_float,
1167
+ epsilon)
1168
+ normalized_expected = expected_float.to_f
1169
+ normalized_actual = actual_float.to_f
1170
+ normalized_epsilon = epsilon.to_f
1171
+ delta = normalized_expected * normalized_epsilon
1172
+ pass = (normalized_expected - normalized_actual).abs > delta
1173
+ full_message = _assert_in_epsilon_message(expected_float,
1174
+ normalized_expected,
1175
+ actual_float,
1176
+ normalized_actual,
1177
+ epsilon,
1178
+ normalized_epsilon,
1179
+ delta,
1180
+ message,
1181
+ :negative_assertion => true)
1182
+ end
1183
+ assert_block(full_message) do
1184
+ pass
1185
+ end
1186
+ end
1187
+ end
1188
+
1189
+ # Just for minitest compatibility. :<
1190
+ #
1191
+ # @since 3.0.0
1192
+ alias_method :refute_in_epsilon, :assert_not_in_epsilon
1193
+
1194
+ private
1195
+ def _assert_in_epsilon_validate_arguments(expected_float,
1196
+ actual_float,
1197
+ epsilon)
1198
+ {
1199
+ expected_float => "first float",
1200
+ actual_float => "second float",
1201
+ epsilon => "epsilon"
1202
+ }.each do |float, name|
1203
+ assert_respond_to(float, :to_f,
1204
+ "The arguments must respond to to_f; " +
1205
+ "the #{name} did not")
1206
+ end
1207
+ epsilon = epsilon.to_f
1208
+ assert_operator(epsilon, :>=, 0.0, "The epsilon should not be negative")
1209
+ end
1210
+
1211
+ def _assert_in_epsilon_message(expected_float, normalized_expected,
1212
+ actual_float, normalized_actual,
1213
+ epsilon, normalized_epsilon,
1214
+ delta, message, options={})
1215
+ if options[:negative_assertion]
1216
+ format = <<-EOT
1217
+ <?> -/+ (<?> * <?>)[?] was expected to not include
1218
+ <?>.
1219
+ EOT
1220
+ else
1221
+ format = <<-EOT
1222
+ <?> -/+ (<?> * <?>)[?] was expected to include
1223
+ <?>.
1224
+ EOT
1225
+ end
1226
+ arguments = [expected_float, expected_float, epsilon, delta,
1227
+ actual_float]
1228
+
1229
+ relation_format = nil
1230
+ relation_arguments = nil
1231
+ if normalized_actual < normalized_expected - delta
1232
+ relation_format = "<<?> < <?>-(<?>*<?>)[?] <= <?>+(<?>*<?>)[?]>"
1233
+ relation_arguments = [actual_float,
1234
+ expected_float, expected_float, epsilon,
1235
+ normalized_expected - delta,
1236
+ expected_float, expected_float, epsilon,
1237
+ normalized_expected + delta]
1238
+ elsif normalized_actual <= normalized_expected + delta
1239
+ relation_format = "<<?>-(<?>*<?>)[?] <= <?> <= <?>+(<?>*<?>)[?]>"
1240
+ relation_arguments = [expected_float, expected_float, epsilon,
1241
+ normalized_expected - delta,
1242
+ actual_float,
1243
+ expected_float, expected_float, epsilon,
1244
+ normalized_expected + delta]
1245
+ else
1246
+ relation_format = "<<?>-(<?>*<?>)[?] <= <?>+(<?>*<?>)[?] < <?>>"
1247
+ relation_arguments = [expected_float, expected_float, epsilon,
1248
+ normalized_expected - delta,
1249
+ expected_float, expected_float, epsilon,
1250
+ normalized_expected + delta,
1251
+ actual_float]
1252
+ end
1253
+
1254
+ if relation_format
1255
+ format += <<-EOT
1256
+
1257
+ Relation:
1258
+ #{relation_format}
1259
+ EOT
1260
+ arguments.concat(relation_arguments)
1261
+ end
1262
+
1263
+ build_message(message, format, *arguments)
1264
+ end
1265
+
1266
+ public
1267
+ ##
1268
+ # Passes if the method `__send__` returns not false nor nil.
1269
+ #
1270
+ # `send_array` is composed of:
1271
+ # * A receiver
1272
+ # * A method
1273
+ # * Arguments to the method
1274
+ #
1275
+ # @example
1276
+ # assert_send([[1, 2], :member?, 1]) # -> pass
1277
+ # assert_send([[1, 2], :member?, 4]) # -> fail
1278
+ def assert_send(send_array, message=nil)
1279
+ _wrap_assertion do
1280
+ assert_instance_of(Array, send_array,
1281
+ "assert_send requires an array " +
1282
+ "of send information")
1283
+ assert_operator(send_array.size, :>=, 2,
1284
+ "assert_send requires at least a receiver " +
1285
+ "and a message name")
1286
+ format = <<EOT
1287
+ <?> was expected to respond to
1288
+ <?(*?)> with a true value but was
1289
+ <?>.
1290
+ EOT
1291
+ receiver, message_name, *arguments = send_array
1292
+ result = nil
1293
+ full_message =
1294
+ build_message(message,
1295
+ format,
1296
+ receiver,
1297
+ AssertionMessage.literal(message_name.to_s),
1298
+ arguments,
1299
+ AssertionMessage.delayed_literal {result})
1300
+ assert_block(full_message) do
1301
+ result = receiver.__send__(message_name, *arguments)
1302
+ result
1303
+ end
1304
+ end
1305
+ end
1306
+
1307
+ ##
1308
+ # Passes if the method `__send__` returns false or nil.
1309
+ #
1310
+ # `send_array` is composed of:
1311
+ # * A receiver
1312
+ # * A method
1313
+ # * Arguments to the method
1314
+ #
1315
+ # @example
1316
+ # assert_not_send([[1, 2], :member?, 1]) # -> fail
1317
+ # assert_not_send([[1, 2], :member?, 4]) # -> pass
1318
+ def assert_not_send(send_array, message=nil)
1319
+ _wrap_assertion do
1320
+ assert_instance_of(Array, send_array,
1321
+ "assert_not_send requires an array " +
1322
+ "of send information")
1323
+ assert_operator(send_array.size, :>=, 2,
1324
+ "assert_not_send requires at least a receiver " +
1325
+ "and a message name")
1326
+ format = <<EOT
1327
+ <?> was expected to respond to
1328
+ <?(*?)> with not a true value but was
1329
+ <?>.
1330
+ EOT
1331
+ receiver, message_name, *arguments = send_array
1332
+ result = nil
1333
+ full_message =
1334
+ build_message(message,
1335
+ format,
1336
+ receiver,
1337
+ AssertionMessage.literal(message_name.to_s),
1338
+ arguments,
1339
+ AssertionMessage.delayed_literal {result})
1340
+ assert_block(full_message) do
1341
+ result = receiver.__send__(message_name, *arguments)
1342
+ not result
1343
+ end
1344
+ end
1345
+ end
1346
+
1347
+ ##
1348
+ # Passes if `actual` is a boolean value.
1349
+ #
1350
+ # @example
1351
+ # assert_boolean(true) # -> pass
1352
+ # assert_boolean(nil) # -> fail
1353
+ def assert_boolean(actual, message=nil)
1354
+ _wrap_assertion do
1355
+ assert_block(build_message(message,
1356
+ "<true> or <false> expected but was\n<?>",
1357
+ actual)) do
1358
+ true == actual || false == actual
1359
+ end
1360
+ end
1361
+ end
1362
+
1363
+ ##
1364
+ # Passes if `actual` is true.
1365
+ #
1366
+ # @example
1367
+ # assert_true(true) # -> pass
1368
+ # assert_true(:true) # -> fail
1369
+ def assert_true(actual, message=nil)
1370
+ _wrap_assertion do
1371
+ assert_block(build_message(message,
1372
+ "<true> expected but was\n<?>",
1373
+ actual)) do
1374
+ true == actual
1375
+ end
1376
+ end
1377
+ end
1378
+
1379
+ ##
1380
+ # Passes if `actual` is false.
1381
+ #
1382
+ # @example
1383
+ # assert_false(false) # -> pass
1384
+ # assert_false(nil) # -> fail
1385
+ def assert_false(actual, message=nil)
1386
+ _wrap_assertion do
1387
+ assert_block(build_message(message,
1388
+ "<false> expected but was\n<?>",
1389
+ actual)) do
1390
+ false == actual
1391
+ end
1392
+ end
1393
+ end
1394
+
1395
+ ##
1396
+ # Passes if expression "`expected` `operator`
1397
+ # `actual`" is not false nor nil.
1398
+ #
1399
+ # @example
1400
+ # assert_compare(1, "<", 10) # -> pass
1401
+ # assert_compare(1, ">=", 10) # -> fail
1402
+ def assert_compare(expected, operator, actual, message=nil)
1403
+ _wrap_assertion do
1404
+ assert_send([["<", "<=", ">", ">="], :include?, operator.to_s])
1405
+ case operator.to_s
1406
+ when "<"
1407
+ operator_description = "less than"
1408
+ when "<="
1409
+ operator_description = "less than or equal to"
1410
+ when ">"
1411
+ operator_description = "greater than"
1412
+ when ">="
1413
+ operator_description = "greater than or equal to"
1414
+ end
1415
+ template = <<-EOT
1416
+ <?> #{operator} <?> should be true
1417
+ <?> was expected to be #{operator_description}
1418
+ <?>.
1419
+ EOT
1420
+ full_message = build_message(message, template,
1421
+ expected, actual,
1422
+ expected, actual)
1423
+ assert_block(full_message) do
1424
+ expected.__send__(operator, actual)
1425
+ end
1426
+ end
1427
+ end
1428
+
1429
+ ##
1430
+ # Passes if assertion is failed in block.
1431
+ #
1432
+ # @example
1433
+ # assert_fail_assertion {assert_equal("A", "B")} # -> pass
1434
+ # assert_fail_assertion {assert_equal("A", "A")} # -> fail
1435
+ def assert_fail_assertion(message=nil)
1436
+ _wrap_assertion do
1437
+ full_message = build_message(message,
1438
+ "Failed assertion was expected.")
1439
+ assert_block(full_message) do
1440
+ begin
1441
+ yield
1442
+ false
1443
+ rescue AssertionFailedError
1444
+ true
1445
+ end
1446
+ end
1447
+ end
1448
+ end
1449
+
1450
+ ##
1451
+ # Passes if an exception is raised in block and its
1452
+ # message is `expected`.
1453
+ #
1454
+ # @example
1455
+ # assert_raise_message("exception") {raise "exception"} # -> pass
1456
+ # assert_raise_message(/exc/i) {raise "exception"} # -> pass
1457
+ # assert_raise_message("exception") {raise "EXCEPTION"} # -> fail
1458
+ # assert_raise_message("exception") {} # -> fail
1459
+ def assert_raise_message(expected, message=nil)
1460
+ _wrap_assertion do
1461
+ full_message = build_message(message,
1462
+ "<?> exception message was expected " +
1463
+ "but none was thrown.",
1464
+ expected)
1465
+ exception = nil
1466
+ assert_block(full_message) do
1467
+ begin
1468
+ yield
1469
+ false
1470
+ rescue Exception => exception
1471
+ true
1472
+ end
1473
+ end
1474
+
1475
+ actual = exception.message
1476
+ diff = AssertionMessage.delayed_diff(expected, actual)
1477
+ full_message =
1478
+ build_message(message,
1479
+ "<?> exception message expected but was\n" +
1480
+ "<?>.?", expected, actual, diff)
1481
+ assert_block(full_message) do
1482
+ if expected.is_a?(Regexp)
1483
+ expected =~ actual
1484
+ else
1485
+ expected == actual
1486
+ end
1487
+ end
1488
+ end
1489
+ end
1490
+
1491
+ ##
1492
+ # Passes if `object`.const_defined?(`constant_name`)
1493
+ #
1494
+ # @example
1495
+ # assert_const_defined(Test, :Unit) # -> pass
1496
+ # assert_const_defined(Object, :Nonexistent) # -> fail
1497
+ def assert_const_defined(object, constant_name, message=nil)
1498
+ _wrap_assertion do
1499
+ full_message = build_message(message,
1500
+ "<?>.const_defined\\?(<?>) expected.",
1501
+ object, constant_name)
1502
+ assert_block(full_message) do
1503
+ object.const_defined?(constant_name)
1504
+ end
1505
+ end
1506
+ end
1507
+
1508
+ ##
1509
+ # Passes if !`object`.const_defined?(`constant_name`)
1510
+ #
1511
+ # @example
1512
+ # assert_not_const_defined(Object, :Nonexistent) # -> pass
1513
+ # assert_not_const_defined(Test, :Unit) # -> fail
1514
+ def assert_not_const_defined(object, constant_name, message=nil)
1515
+ _wrap_assertion do
1516
+ full_message = build_message(message,
1517
+ "!<?>.const_defined\\?(<?>) expected.",
1518
+ object, constant_name)
1519
+ assert_block(full_message) do
1520
+ !object.const_defined?(constant_name)
1521
+ end
1522
+ end
1523
+ end
1524
+
1525
+ ##
1526
+ # Passes if `object`.`predicate` is not false nor nil.
1527
+ #
1528
+ # @example
1529
+ # assert_predicate([], :empty?) # -> pass
1530
+ # assert_predicate([1], :empty?) # -> fail
1531
+ def assert_predicate(object, predicate, message=nil)
1532
+ _wrap_assertion do
1533
+ assert_respond_to(object, predicate, message)
1534
+ actual = object.__send__(predicate)
1535
+ full_message = build_message(message,
1536
+ "<?>.? is true value expected but was\n" +
1537
+ "<?>",
1538
+ object,
1539
+ AssertionMessage.literal(predicate),
1540
+ actual)
1541
+ assert_block(full_message) do
1542
+ actual
1543
+ end
1544
+ end
1545
+ end
1546
+
1547
+ ##
1548
+ # Passes if `object`.`predicate` is false or nil.
1549
+ #
1550
+ # @example
1551
+ # assert_not_predicate([1], :empty?) # -> pass
1552
+ # assert_not_predicate([], :empty?) # -> fail
1553
+ def assert_not_predicate(object, predicate, message=nil)
1554
+ _wrap_assertion do
1555
+ assert_respond_to(object, predicate, message)
1556
+ actual = object.__send__(predicate)
1557
+ full_message = build_message(message,
1558
+ "<?>.? is false value expected but was\n" +
1559
+ "<?>",
1560
+ object,
1561
+ AssertionMessage.literal(predicate),
1562
+ actual)
1563
+ assert_block(full_message) do
1564
+ not actual
1565
+ end
1566
+ end
1567
+ end
1568
+
1569
+ # Just for minitest compatibility. :<
1570
+ #
1571
+ # @since 3.0.0
1572
+ alias_method :refute_predicate, :assert_not_predicate
1573
+
1574
+ ##
1575
+ # Passes if `object`#`alias_name` is an alias method of
1576
+ # `object`#`original_name`.
1577
+ #
1578
+ # @example
1579
+ # assert_alias_method([], :length, :size) # -> pass
1580
+ # assert_alias_method([], :size, :length) # -> pass
1581
+ # assert_alias_method([], :each, :size) # -> fail
1582
+ def assert_alias_method(object, alias_name, original_name, message=nil)
1583
+ _wrap_assertion do
1584
+ find_method_failure_message = Proc.new do |method_name|
1585
+ build_message(message,
1586
+ "<?>.? doesn't exist\n" +
1587
+ "(Class: <?>)",
1588
+ object,
1589
+ AssertionMessage.literal(method_name),
1590
+ object.class)
1591
+ end
1592
+
1593
+ alias_method = original_method = nil
1594
+ assert_block(find_method_failure_message.call(alias_name)) do
1595
+ begin
1596
+ alias_method = object.method(alias_name)
1597
+ true
1598
+ rescue NameError
1599
+ false
1600
+ end
1601
+ end
1602
+ assert_block(find_method_failure_message.call(original_name)) do
1603
+ begin
1604
+ original_method = object.method(original_name)
1605
+ true
1606
+ rescue NameError
1607
+ false
1608
+ end
1609
+ end
1610
+
1611
+ full_message = build_message(message,
1612
+ "<?> is alias of\n" +
1613
+ "<?> expected",
1614
+ alias_method,
1615
+ original_method)
1616
+ assert_block(full_message) do
1617
+ alias_method == original_method
1618
+ end
1619
+ end
1620
+ end
1621
+
1622
+ ##
1623
+ # Passes if `path` exists.
1624
+ #
1625
+ # @example
1626
+ # assert_path_exist("/tmp") # -> pass
1627
+ # assert_path_exist("/bin/sh") # -> pass
1628
+ # assert_path_exist("/nonexistent") # -> fail
1629
+ def assert_path_exist(path, message=nil)
1630
+ _wrap_assertion do
1631
+ failure_message = build_message(message,
1632
+ "<?> was expected to exist",
1633
+ path)
1634
+ assert_block(failure_message) do
1635
+ File.exist?(path)
1636
+ end
1637
+ end
1638
+ end
1639
+
1640
+ ##
1641
+ # Passes if `path` doesn't exist.
1642
+ #
1643
+ # @example
1644
+ # assert_path_not_exist("/nonexistent") # -> pass
1645
+ # assert_path_not_exist("/tmp") # -> fail
1646
+ # assert_path_not_exist("/bin/sh") # -> fail
1647
+ def assert_path_not_exist(path, message=nil)
1648
+ _wrap_assertion do
1649
+ failure_message = build_message(message,
1650
+ "<?> was expected to not exist",
1651
+ path)
1652
+ assert_block(failure_message) do
1653
+ not File.exist?(path)
1654
+ end
1655
+ end
1656
+ end
1657
+
1658
+ ##
1659
+ # Passes if `collection` includes `object`.
1660
+ #
1661
+ # @example
1662
+ # assert_include([1, 10], 1) # -> pass
1663
+ # assert_include(1..10, 5) # -> pass
1664
+ # assert_include([1, 10], 5) # -> fail
1665
+ # assert_include(1..10, 20) # -> fail
1666
+ def assert_include(collection, object, message=nil)
1667
+ _wrap_assertion do
1668
+ assert_respond_to(collection, :include?,
1669
+ "The collection must respond to :include?.")
1670
+ full_message = build_message(message,
1671
+ "<?> was expected to include\n<?>.",
1672
+ collection,
1673
+ object)
1674
+ assert_block(full_message) do
1675
+ collection.include?(object)
1676
+ end
1677
+ end
1678
+ end
1679
+
1680
+ # Just for minitest compatibility. :<
1681
+ #
1682
+ # @since 2.5.3
1683
+ alias_method :assert_includes, :assert_include
1684
+
1685
+ ##
1686
+ # Passes if `collection` doesn't include `object`.
1687
+ #
1688
+ # @example
1689
+ # assert_not_include([1, 10], 5) # -> pass
1690
+ # assert_not_include(1..10, 20) # -> pass
1691
+ # assert_not_include([1, 10], 1) # -> fail
1692
+ # assert_not_include(1..10, 5) # -> fail
1693
+ def assert_not_include(collection, object, message=nil)
1694
+ _wrap_assertion do
1695
+ assert_respond_to(collection, :include?,
1696
+ "The collection must respond to :include?.")
1697
+ full_message = build_message(message,
1698
+ "<?> was expected to not include\n<?>.",
1699
+ collection,
1700
+ object)
1701
+ assert_block(full_message) do
1702
+ not collection.include?(object)
1703
+ end
1704
+ end
1705
+ end
1706
+
1707
+ # Just for minitest compatibility. :<
1708
+ #
1709
+ # @since 3.0.0
1710
+ alias_method :assert_not_includes, :assert_not_include
1711
+
1712
+ # Just for minitest compatibility. :<
1713
+ #
1714
+ # @since 3.0.0
1715
+ alias_method :refute_includes, :assert_not_include
1716
+
1717
+ ##
1718
+ # Passes if `object` is empty.
1719
+ #
1720
+ # @example
1721
+ # assert_empty("") # -> pass
1722
+ # assert_empty([]) # -> pass
1723
+ # assert_empty({}) # -> pass
1724
+ # assert_empty(" ") # -> fail
1725
+ # assert_empty([nil]) # -> fail
1726
+ # assert_empty({1 => 2}) # -> fail
1727
+ def assert_empty(object, message=nil)
1728
+ _wrap_assertion do
1729
+ assert_respond_to(object, :empty?,
1730
+ "The object must respond to :empty?.")
1731
+ full_message = build_message(message,
1732
+ "<?> was expected to be empty.",
1733
+ object)
1734
+ assert_block(full_message) do
1735
+ object.empty?
1736
+ end
1737
+ end
1738
+ end
1739
+
1740
+ ##
1741
+ # Passes if `object` is not empty.
1742
+ #
1743
+ # @example
1744
+ # assert_not_empty(" ") # -> pass
1745
+ # assert_not_empty([nil]) # -> pass
1746
+ # assert_not_empty({1 => 2}) # -> pass
1747
+ # assert_not_empty("") # -> fail
1748
+ # assert_not_empty([]) # -> fail
1749
+ # assert_not_empty({}) # -> fail
1750
+ def assert_not_empty(object, message=nil)
1751
+ _wrap_assertion do
1752
+ assert_respond_to(object, :empty?,
1753
+ "The object must respond to :empty?.")
1754
+ full_message = build_message(message,
1755
+ "<?> was expected to not be empty.",
1756
+ object)
1757
+ assert_block(full_message) do
1758
+ not object.empty?
1759
+ end
1760
+ end
1761
+ end
1762
+
1763
+ # Just for minitest compatibility. :<
1764
+ #
1765
+ # @since 3.0.0
1766
+ alias_method :refute_empty, :assert_not_empty
1767
+
1768
+ # @overload assert_all(collection, message=nil, &block)
1769
+ #
1770
+ # Asserts that all `block.call(item)` where `item` is each
1771
+ # item in `collection` are not false nor nil.
1772
+ #
1773
+ # If `collection` is empty, this assertion is always passed
1774
+ # with any `block`.
1775
+ #
1776
+ # @example Pass patterns
1777
+ # assert_all([1, 2, 3]) {|item| item > 0} # => pass
1778
+ # assert_all([1, 2, 3], &:positive?) # => pass
1779
+ # assert_all([]) {|item| false} # => pass
1780
+ #
1781
+ # @example Failure pattern
1782
+ # assert_all([0, 1, 2], &:zero?) # => failure
1783
+ #
1784
+ # @param [#each] collection The check target.
1785
+ # @param [String] message The additional user message. It is
1786
+ # showed when the assertion is failed.
1787
+ # @yield [Object] Give each item in `collection` to the block.
1788
+ # @yieldreturn [Object] The checked object.
1789
+ # @return [void]
1790
+ #
1791
+ # @since 3.4.4
1792
+ def assert_all(collection, message=nil)
1793
+ _wrap_assertion do
1794
+ failed = false
1795
+ result = {}
1796
+ collection.each do |item|
1797
+ element_result = yield(item)
1798
+ failed = true unless element_result
1799
+ result[item] = element_result
1800
+ end
1801
+ format = <<-FORMAT
1802
+ <?> was expected to be all true values with the given block but was
1803
+ <?>
1804
+ FORMAT
1805
+ full_message = build_message(message,
1806
+ format,
1807
+ collection,
1808
+ result)
1809
+ assert_block(full_message) do
1810
+ not failed
1811
+ end
1812
+ end
1813
+ end
1814
+
1815
+ # Just for Ruby's tool/lib/test/unit compatibility.
1816
+ #
1817
+ # @since 3.4.3
1818
+ alias_method :assert_all?, :assert_all
1819
+
1820
+ # @overload assert_nothing_leaked_memory(max_increasable_size, target=:physical, message=nil, &block)
1821
+ #
1822
+ # Asserts that increased memory usage by `block.call` is less
1823
+ # than `max_increasable_size`. `GC.start` is called before and
1824
+ # after `block.call`.
1825
+ #
1826
+ # This assertion may be fragile. Because memory usage is
1827
+ # depends on the current Ruby process's memory
1828
+ # usage. Launching a new Ruby process for this will produce
1829
+ # more stable result but we need to specify target code as
1830
+ # `String` instead of block for the approach. We choose easy
1831
+ # to write API approach rather than more stable result
1832
+ # approach for this case.
1833
+ #
1834
+ # @example Pass pattern
1835
+ # require "objspace"
1836
+ # size_per_object = ObjectSpace.memsize_of("Hello")
1837
+ # # If memory isn't leaked, physical memory of almost created objects
1838
+ # # (1000 - 10 objects) must be freed.
1839
+ # assert_nothing_leaked_memory(size_per_object * 10) do
1840
+ # 1_000.times do
1841
+ # "Hello".dup
1842
+ # end
1843
+ # end # => pass
1844
+ #
1845
+ # @example Failure pattern
1846
+ # require "objspace"
1847
+ # size_per_object = ObjectSpace.memsize_of("Hello")
1848
+ # strings = []
1849
+ # assert_nothing_leaked_memory(size_per_object * 10) do
1850
+ # 10_000.times do
1851
+ # # Created objects aren't GC-ed because they are referred.
1852
+ # strings << "Hello".dup
1853
+ # end
1854
+ # end # => failure
1855
+ #
1856
+ # @param target [:physical, :virtual] which memory usage is
1857
+ # used for comparing. `:physical` means physical memory usage
1858
+ # also known as Resident Set Size (RSS). `:virtual` means
1859
+ # virtual memory usage.
1860
+ # @yield [] do anything you want to measure memory usage
1861
+ # in the block.
1862
+ # @yieldreturn [void]
1863
+ # @return [void]
1864
+ #
1865
+ # @since 3.4.5
1866
+ def assert_nothing_leaked_memory(max_increasable_size,
1867
+ target=:physical,
1868
+ message=nil)
1869
+ _wrap_assertion do
1870
+ GC.start
1871
+ before = Util::MemoryUsage.new
1872
+ unless before.collected?
1873
+ omit("memory usage collection isn't supported on this platform")
1874
+ end
1875
+ yield
1876
+ GC.start
1877
+ after = Util::MemoryUsage.new
1878
+ before_value = before.__send__(target)
1879
+ after_value = after.__send__(target)
1880
+ actual_increased_size = after_value - before_value
1881
+ template = <<-TEMPLATE
1882
+ <?> was expected to be less than
1883
+ <?>.
1884
+ TEMPLATE
1885
+ full_message = build_message(message,
1886
+ template,
1887
+ actual_increased_size,
1888
+ max_increasable_size)
1889
+ assert_block(full_message) do
1890
+ actual_increased_size < max_increasable_size
1891
+ end
1892
+ end
1893
+ end
1894
+
1895
+ ##
1896
+ # Builds a failure message. `user_message` is added before the
1897
+ # `template` and `arguments` replaces the '?'s positionally in
1898
+ # the template.
1899
+ def build_message(user_message, template=nil, *arguments)
1900
+ template &&= template.chomp
1901
+ return AssertionMessage.new(user_message, template, arguments)
1902
+ end
1903
+
1904
+ private
1905
+ def _wrap_assertion(&block)
1906
+ @_assertion_wrapped ||= false
1907
+ if @_assertion_wrapped
1908
+ block.call
1909
+ else
1910
+ @_assertion_wrapped = true
1911
+ begin
1912
+ add_assertion
1913
+ block.call
1914
+ ensure
1915
+ @_assertion_wrapped = false
1916
+ end
1917
+ end
1918
+ end
1919
+
1920
+ public
1921
+ # Called whenever an assertion is made. Define this in classes
1922
+ # that include Test::Unit::Assertions to record assertion
1923
+ # counts.
1924
+ #
1925
+ # This is a public API for developers who extend test-unit.
1926
+ #
1927
+ # @return [void]
1928
+ def add_assertion
1929
+ end
1930
+
1931
+ ##
1932
+ # Select whether or not to use the pretty-printer. If this option is set
1933
+ # to false before any assertions are made, pp.rb will not be required.
1934
+ def self.use_pp=(value)
1935
+ AssertionMessage.use_pp = value
1936
+ end
1937
+
1938
+ private
1939
+ def _assert_raise(assert_expected_exception, *args, &block)
1940
+ _wrap_assertion do
1941
+ if args.last.is_a?(String)
1942
+ message = args.pop
1943
+ else
1944
+ message = ""
1945
+ end
1946
+
1947
+ assert_exception_helper = AssertExceptionHelper.new(self, args)
1948
+ expected = assert_exception_helper.expected_exceptions
1949
+ actual_exception = nil
1950
+ full_message = build_message(message,
1951
+ "<?> exception was expected " +
1952
+ "but none was thrown.",
1953
+ expected)
1954
+ assert_block(full_message) do
1955
+ begin
1956
+ yield
1957
+ false
1958
+ rescue Exception => actual_exception
1959
+ true
1960
+ end
1961
+ end
1962
+ assert_expected_exception.call(message, assert_exception_helper,
1963
+ actual_exception)
1964
+ actual_exception
1965
+ end
1966
+ end
1967
+
1968
+ def _set_failed_information(failure, expected, actual)
1969
+ failure.expected = expected
1970
+ failure.actual = actual
1971
+ failure.inspected_expected = AssertionMessage.convert(expected)
1972
+ failure.inspected_actual = AssertionMessage.convert(actual)
1973
+ end
1974
+
1975
+ class AssertionMessage
1976
+ @use_pp = true
1977
+ class << self
1978
+ attr_accessor :use_pp
1979
+
1980
+ def literal(value)
1981
+ Literal.new(value)
1982
+ end
1983
+
1984
+ def delayed_literal(&block)
1985
+ DelayedLiteral.new(block)
1986
+ end
1987
+
1988
+ def maybe_container(value, &formatter)
1989
+ MaybeContainer.new(value, &formatter)
1990
+ end
1991
+
1992
+ MAX_DIFF_TARGET_STRING_SIZE = 1000
1993
+ def max_diff_target_string_size
1994
+ return @@max_diff_target_string_size if @@max_diff_target_string_size
1995
+
1996
+ size = ENV["TEST_UNIT_MAX_DIFF_TARGET_STRING_SIZE"]
1997
+ if size
1998
+ begin
1999
+ size = Integer(size)
2000
+ rescue ArgumentError
2001
+ size = nil
2002
+ end
2003
+ end
2004
+ size || MAX_DIFF_TARGET_STRING_SIZE
2005
+ end
2006
+
2007
+ @@max_diff_target_string_size = nil
2008
+ def max_diff_target_string_size=(size)
2009
+ @@max_diff_target_string_size = size
2010
+ end
2011
+
2012
+ def diff_target_string?(string)
2013
+ if string.respond_to?(:bytesize)
2014
+ string.bytesize < max_diff_target_string_size
2015
+ else
2016
+ string.size < max_diff_target_string_size
2017
+ end
2018
+ end
2019
+
2020
+ def ensure_diffable_string(string)
2021
+ if string.respond_to?(:encoding) and
2022
+ !string.encoding.ascii_compatible?
2023
+ string = string.dup.force_encoding("ASCII-8BIT")
2024
+ end
2025
+ string
2026
+ end
2027
+
2028
+ def prepare_for_diff(from, to)
2029
+ if !from.is_a?(String) or !to.is_a?(String)
2030
+ from = convert(from)
2031
+ to = convert(to)
2032
+ end
2033
+
2034
+ if diff_target_string?(from) and diff_target_string?(to)
2035
+ from = ensure_diffable_string(from)
2036
+ to = ensure_diffable_string(to)
2037
+ [from, to]
2038
+ else
2039
+ [nil, nil]
2040
+ end
2041
+ end
2042
+
2043
+ def delayed_diff(from, to)
2044
+ delayed_literal do
2045
+ from, to = prepare_for_diff(from, to)
2046
+
2047
+ diff = "" if from.nil? or to.nil?
2048
+ diff ||= Diff.readable(from, to)
2049
+ if /^[-+]/ !~ diff
2050
+ diff = ""
2051
+ elsif /^[ ?]/ =~ diff or /(?:.*\n){2,}/ =~ diff
2052
+ diff = "\n\ndiff:\n#{diff}"
2053
+ else
2054
+ diff = ""
2055
+ end
2056
+
2057
+ if Diff.need_fold?(diff)
2058
+ folded_diff = Diff.folded_readable(from, to)
2059
+ diff += "\n\nfolded diff:\n#{folded_diff}"
2060
+ end
2061
+
2062
+ diff
2063
+ end
2064
+ end
2065
+
2066
+ def convert(object)
2067
+ if object.is_a?(Exception)
2068
+ object = AssertExceptionHelper::WrappedException.new(object)
2069
+ end
2070
+ inspector = Inspector.new(object)
2071
+ if use_pp
2072
+ begin
2073
+ require "pp" unless defined?(PP)
2074
+ begin
2075
+ return PP.pp(inspector, String.new).chomp
2076
+ rescue NameError
2077
+ end
2078
+ rescue LoadError
2079
+ self.use_pp = false
2080
+ end
2081
+ end
2082
+ inspector.inspect
2083
+ end
2084
+ end
2085
+
2086
+ class Inspector
2087
+ include Comparable
2088
+
2089
+ class << self
2090
+ def cached_new(object, inspected_objects)
2091
+ inspected_objects[object.__id__] ||=
2092
+ new(object, inspected_objects)
2093
+ end
2094
+
2095
+ @@inspector_classes = []
2096
+ def inspector_classes
2097
+ @@inspector_classes
2098
+ end
2099
+
2100
+ def register_inspector_class(inspector_class)
2101
+ @@inspector_classes << inspector_class
2102
+ end
2103
+
2104
+ def unregister_inspector_class(inspector_class)
2105
+ @@inspector_classes.delete(inspector_class)
2106
+ end
2107
+ end
2108
+
2109
+ attr_reader :object
2110
+ def initialize(object, inspected_objects={})
2111
+ @inspected_objects = inspected_objects
2112
+ @object = object
2113
+ @inspected_objects[@object.__id__] = self
2114
+ @inspect_target = inspect_target
2115
+ end
2116
+
2117
+ alias_method :native_inspect, :inspect
2118
+ def inspect
2119
+ @inspect_target.inspect
2120
+ end
2121
+
2122
+ def pretty_print(q)
2123
+ @inspect_target.pretty_print(q)
2124
+ end
2125
+
2126
+ def pretty_print_cycle(q)
2127
+ @inspect_target.pretty_print_cycle(q)
2128
+ end
2129
+
2130
+ def <=>(other)
2131
+ if other.is_a?(self.class)
2132
+ @object <=> other.object
2133
+ else
2134
+ @object <=> other
2135
+ end
2136
+ end
2137
+
2138
+ private
2139
+ def inspect_target
2140
+ self.class.inspector_classes.each do |inspector_class|
2141
+ if inspector_class.target?(@object)
2142
+ return inspector_class.new(@object, @inspected_objects)
2143
+ end
2144
+ end
2145
+ @object
2146
+ end
2147
+ end
2148
+
2149
+ class NumericInspector
2150
+ Inspector.register_inspector_class(self)
2151
+
2152
+ class << self
2153
+ def target?(object)
2154
+ object.is_a?(Numeric)
2155
+ end
2156
+ end
2157
+
2158
+ def initialize(numeric, inspected_objects)
2159
+ @inspected_objects = inspected_objects
2160
+ @numeric = numeric
2161
+ end
2162
+
2163
+ def inspect
2164
+ @numeric.to_s
2165
+ end
2166
+
2167
+ def pretty_print(q)
2168
+ q.text(@numeric.to_s)
2169
+ end
2170
+
2171
+ def pretty_print_cycle(q)
2172
+ q.text(@numeric.to_s)
2173
+ end
2174
+ end
2175
+
2176
+ class HashInspector
2177
+ Inspector.register_inspector_class(self)
2178
+
2179
+ class << self
2180
+ def target?(object)
2181
+ object.is_a?(Hash) or ENV.equal?(object)
2182
+ end
2183
+ end
2184
+
2185
+ def initialize(hash, inspected_objects)
2186
+ @inspected_objects = inspected_objects
2187
+ @hash = {}
2188
+ hash.each do |key, value|
2189
+ key = Inspector.cached_new(key, @inspected_objects)
2190
+ value = Inspector.cached_new(value, @inspected_objects)
2191
+ @hash[key] = value
2192
+ end
2193
+ end
2194
+
2195
+ def inspect
2196
+ @hash.inspect
2197
+ end
2198
+
2199
+ def pretty_print(q)
2200
+ q.group(1, '{', '}') do
2201
+ q.seplist(self, nil, :each_pair) do |k, v|
2202
+ q.group do
2203
+ q.pp(k)
2204
+ q.text('=>')
2205
+ q.group(1) do
2206
+ q.breakable('')
2207
+ q.pp(v)
2208
+ end
2209
+ end
2210
+ end
2211
+ end
2212
+ end
2213
+
2214
+ def pretty_print_cycle(q)
2215
+ @hash.pretty_print_cycle(q)
2216
+ end
2217
+
2218
+ def each_pair
2219
+ keys = @hash.keys
2220
+ begin
2221
+ keys = keys.sort # FIXME: more cleverly
2222
+ rescue ArgumentError
2223
+ end
2224
+ keys.each do |key|
2225
+ yield(key, @hash[key])
2226
+ end
2227
+ end
2228
+ end
2229
+
2230
+ class ArrayInspector
2231
+ Inspector.register_inspector_class(self)
2232
+
2233
+ class << self
2234
+ def target?(object)
2235
+ object.is_a?(Array)
2236
+ end
2237
+ end
2238
+
2239
+ def initialize(array, inspected_objects)
2240
+ @inspected_objects = inspected_objects
2241
+ @array = array.collect do |element|
2242
+ Inspector.cached_new(element, @inspected_objects)
2243
+ end
2244
+ end
2245
+
2246
+ def inspect
2247
+ @array.inspect
2248
+ end
2249
+
2250
+ def pretty_print(q)
2251
+ q.group(1, '[', ']') do
2252
+ q.seplist(self) do |v|
2253
+ q.pp(v)
2254
+ end
2255
+ end
2256
+ end
2257
+
2258
+ def pretty_print_cycle(q)
2259
+ @array.pretty_print_cycle(q)
2260
+ end
2261
+
2262
+ def each(&block)
2263
+ @array.each(&block)
2264
+ end
2265
+ end
2266
+
2267
+ class Literal
2268
+ def initialize(value)
2269
+ @value = value
2270
+ end
2271
+
2272
+ def inspect
2273
+ @value.to_s
2274
+ end
2275
+ end
2276
+
2277
+ class DelayedLiteral
2278
+ def initialize(value)
2279
+ @value = value
2280
+ end
2281
+
2282
+ def inspect
2283
+ @value.call.to_s
2284
+ end
2285
+ end
2286
+
2287
+ class MaybeContainer
2288
+ def initialize(value, &formatter)
2289
+ @value = value
2290
+ @formatter = formatter
2291
+ end
2292
+
2293
+ def inspect
2294
+ if @value.is_a?(Array)
2295
+ values = @value.collect do |value|
2296
+ @formatter.call(AssertionMessage.convert(value))
2297
+ end
2298
+ "[#{values.join(', ')}]"
2299
+ else
2300
+ @formatter.call(AssertionMessage.convert(@value))
2301
+ end
2302
+ end
2303
+ end
2304
+
2305
+ class Template
2306
+ def self.create(string)
2307
+ parts = (string ? string.scan(/(?=[^\\])\?|(?:\\\?|[^\?])+/m) : [])
2308
+ self.new(parts)
2309
+ end
2310
+
2311
+ attr_reader :count
2312
+
2313
+ def initialize(parts)
2314
+ @parts = parts
2315
+ @count = parts.count('?')
2316
+ end
2317
+
2318
+ def result(parameters)
2319
+ raise "The number of parameters does not match the number of substitutions." if(parameters.size != count)
2320
+ params = parameters.dup
2321
+ expanded_template = ""
2322
+ @parts.each do |part|
2323
+ if part == '?'
2324
+ param = params.shift
2325
+ if Object.const_defined?(:Encoding)
2326
+ expanded_template += concatenatable(param,
2327
+ expanded_template.encoding)
2328
+ else
2329
+ expanded_template += param
2330
+ end
2331
+ else
2332
+ expanded_template += part.gsub(/\\\?/m, '?')
2333
+ end
2334
+ end
2335
+ expanded_template
2336
+ end
2337
+
2338
+ private
2339
+ def concatenatable(text, encoding)
2340
+ if Encoding.compatible?(text, encoding)
2341
+ text
2342
+ else
2343
+ text.dup.force_encoding(encoding)
2344
+ end
2345
+ end
2346
+ end
2347
+
2348
+ include Util::BacktraceFilter
2349
+
2350
+ def initialize(user_message, template_string, parameters)
2351
+ @user_message = user_message
2352
+ @template_string = template_string
2353
+ @parameters = parameters
2354
+ end
2355
+
2356
+ def convert(object)
2357
+ self.class.convert(object)
2358
+ end
2359
+
2360
+ def template
2361
+ @template ||= Template.create(@template_string)
2362
+ end
2363
+
2364
+ def user_message
2365
+ return nil unless @user_message
2366
+ message = @user_message
2367
+ message = message.call if message.respond_to?(:call)
2368
+ message.to_s
2369
+ end
2370
+
2371
+ def to_s
2372
+ message_parts = []
2373
+ head = user_message
2374
+ if head and not head.empty?
2375
+ message_parts << add_period(head)
2376
+ end
2377
+ tail = template.result(@parameters.collect{|e| convert(e)})
2378
+ message_parts << tail unless(tail.empty?)
2379
+ message_parts.join("\n")
2380
+ end
2381
+
2382
+ private
2383
+ def add_period(string)
2384
+ (string =~ /\.\Z/ ? string : string + '.')
2385
+ end
2386
+ end
2387
+
2388
+ class AssertExceptionHelper
2389
+ class WrappedException
2390
+ attr_reader :exception
2391
+ def initialize(exception)
2392
+ @exception = exception
2393
+ end
2394
+
2395
+ def inspect
2396
+ if default_inspect?
2397
+ inspected = "#{@exception.class.inspect}(<#{@exception.message}>)"
2398
+ unless (@exception.backtrace || []).empty?
2399
+ inspected += "\n"
2400
+ @exception.backtrace.each do |trace|
2401
+ inspected << "#{trace}\n"
2402
+ end
2403
+ end
2404
+ inspected
2405
+ else
2406
+ @exception.inspect
2407
+ end
2408
+ end
2409
+
2410
+ def method_missing(name, *args, &block)
2411
+ @exception.__send__(name, *args, &block)
2412
+ end
2413
+
2414
+ private
2415
+ def default_inspect?
2416
+ inspect_method = @exception.method(:inspect)
2417
+ if inspect_method.respond_to?(:owner) and
2418
+ inspect_method.owner == Exception
2419
+ true
2420
+ else
2421
+ default_inspect_method = Exception.instance_method(:inspect)
2422
+ default_inspect_method.bind(@exception).call == @exception.inspect
2423
+ end
2424
+ end
2425
+ end
2426
+
2427
+ def initialize(test_case, expected_exceptions)
2428
+ @test_case = test_case
2429
+ @expected_exceptions = expected_exceptions
2430
+ @expected_classes, @expected_modules, @expected_objects =
2431
+ split_expected_exceptions(expected_exceptions)
2432
+ end
2433
+
2434
+ def expected_exceptions
2435
+ exceptions = @expected_exceptions.collect do |exception|
2436
+ if exception.is_a?(Exception)
2437
+ WrappedException.new(exception)
2438
+ else
2439
+ exception
2440
+ end
2441
+ end
2442
+ if exceptions.size == 1
2443
+ exceptions[0]
2444
+ else
2445
+ exceptions
2446
+ end
2447
+ end
2448
+
2449
+ def expected?(actual_exception, equality=nil)
2450
+ equality ||= :instance_of?
2451
+ expected_class?(actual_exception, equality) or
2452
+ expected_module?(actual_exception) or
2453
+ expected_object?(actual_exception)
2454
+ end
2455
+
2456
+ private
2457
+ def split_expected_exceptions(expected_exceptions)
2458
+ exception_modules = []
2459
+ exception_objects = []
2460
+ exception_classes = []
2461
+ expected_exceptions.each do |exception_type|
2462
+ if exception_type.instance_of?(Module)
2463
+ exception_modules << exception_type
2464
+ elsif exception_object?(exception_type)
2465
+ exception_objects << exception_type
2466
+ elsif exception_class?(exception_type)
2467
+ exception_classes << exception_type
2468
+ else
2469
+ full_message =
2470
+ @test_case.__send__(:build_message,
2471
+ nil,
2472
+ "<?> must be " +
2473
+ "a subclass of Exception, " +
2474
+ "an object of Exception subclasses " +
2475
+ "or a Module",
2476
+ exception_type)
2477
+ @test_case.flunk(full_message)
2478
+ end
2479
+ end
2480
+ [exception_classes, exception_modules, exception_objects]
2481
+ end
2482
+
2483
+ def exception_object?(exception_type)
2484
+ return true if exception_type.is_a?(Exception)
2485
+
2486
+ if Object.const_defined?(:Java)
2487
+ return true if exception_type.is_a?(Java::JavaLang::Throwable)
2488
+ end
2489
+
2490
+ false
2491
+ end
2492
+
2493
+ def exception_class?(exception_type)
2494
+ return true if exception_type <= Exception
2495
+
2496
+ if Object.const_defined?(:Java)
2497
+ return true if exception_type <= Java::JavaLang::Throwable
2498
+ end
2499
+
2500
+ false
2501
+ end
2502
+
2503
+ def expected_class?(actual_exception, equality)
2504
+ @expected_classes.any? do |expected_class|
2505
+ actual_exception.__send__(equality, expected_class)
2506
+ end
2507
+ end
2508
+
2509
+ def expected_module?(actual_exception)
2510
+ @expected_modules.any? do |expected_module|
2511
+ actual_exception.is_a?(expected_module)
2512
+ end
2513
+ end
2514
+
2515
+ def expected_object?(actual_exception)
2516
+ @expected_objects.any? do |expected_object|
2517
+ expected_object == actual_exception or
2518
+ fallback_exception_object_equal(expected_object, actual_exception)
2519
+ end
2520
+ end
2521
+
2522
+ def fallback_exception_object_equal(expected_object, actual_exception)
2523
+ owner = Util::MethodOwnerFinder.find(expected_object, :==)
2524
+ if owner == Kernel or owner == Exception
2525
+ expected_object.class == actual_exception.class and
2526
+ expected_object.message == actual_exception.message
2527
+ else
2528
+ false
2529
+ end
2530
+ end
2531
+ end
2532
+
2533
+ # :startdoc:
2534
+ end
2535
+ end
2536
+ end