assert 2.18.4 → 2.19.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -2
  3. data/assert.gemspec +11 -5
  4. data/bin/assert +1 -0
  5. data/lib/assert.rb +20 -6
  6. data/lib/assert/actual_value.rb +26 -8
  7. data/lib/assert/assert_runner.rb +38 -17
  8. data/lib/assert/assertions.rb +145 -41
  9. data/lib/assert/cli.rb +19 -66
  10. data/lib/assert/clirb.rb +55 -0
  11. data/lib/assert/config.rb +22 -8
  12. data/lib/assert/config_helpers.rb +57 -22
  13. data/lib/assert/context.rb +28 -47
  14. data/lib/assert/context/let_dsl.rb +8 -2
  15. data/lib/assert/context/method_missing.rb +3 -0
  16. data/lib/assert/context/setup_dsl.rb +24 -16
  17. data/lib/assert/context/subject_dsl.rb +9 -7
  18. data/lib/assert/context/suite_dsl.rb +5 -1
  19. data/lib/assert/context/test_dsl.rb +58 -19
  20. data/lib/assert/context_info.rb +2 -0
  21. data/lib/assert/default_runner.rb +2 -0
  22. data/lib/assert/default_suite.rb +27 -15
  23. data/lib/assert/default_view.rb +49 -30
  24. data/lib/assert/factory.rb +2 -0
  25. data/lib/assert/file_line.rb +8 -6
  26. data/lib/assert/macro.rb +3 -1
  27. data/lib/assert/macros/methods.rb +73 -45
  28. data/lib/assert/result.rb +117 -61
  29. data/lib/assert/runner.rb +70 -51
  30. data/lib/assert/stub.rb +44 -3
  31. data/lib/assert/suite.rb +76 -38
  32. data/lib/assert/test.rb +43 -44
  33. data/lib/assert/utils.rb +22 -11
  34. data/lib/assert/version.rb +3 -1
  35. data/lib/assert/view.rb +46 -18
  36. data/lib/assert/view_helpers.rb +102 -92
  37. data/test/helper.rb +8 -4
  38. data/test/support/factory.rb +40 -21
  39. data/test/support/inherited_stuff.rb +2 -0
  40. data/test/system/stub_tests.rb +182 -144
  41. data/test/system/test_tests.rb +88 -60
  42. data/test/unit/actual_value_tests.rb +103 -46
  43. data/test/unit/assert_tests.rb +48 -40
  44. data/test/unit/assertions/assert_block_tests.rb +12 -10
  45. data/test/unit/assertions/assert_changes_tests.rb +103 -0
  46. data/test/unit/assertions/assert_empty_tests.rb +16 -12
  47. data/test/unit/assertions/assert_equal_tests.rb +46 -24
  48. data/test/unit/assertions/assert_file_exists_tests.rb +17 -13
  49. data/test/unit/assertions/assert_includes_tests.rb +12 -10
  50. data/test/unit/assertions/assert_instance_of_tests.rb +16 -14
  51. data/test/unit/assertions/assert_is_a_tests.rb +128 -0
  52. data/test/unit/assertions/assert_match_tests.rb +12 -10
  53. data/test/unit/assertions/assert_nil_tests.rb +18 -12
  54. data/test/unit/assertions/assert_raises_tests.rb +34 -23
  55. data/test/unit/assertions/assert_respond_to_tests.rb +12 -10
  56. data/test/unit/assertions/assert_same_tests.rb +26 -24
  57. data/test/unit/assertions/assert_true_false_tests.rb +34 -24
  58. data/test/unit/assertions_tests.rb +25 -17
  59. data/test/unit/config_helpers_tests.rb +15 -8
  60. data/test/unit/config_tests.rb +36 -9
  61. data/test/unit/context/let_dsl_tests.rb +2 -0
  62. data/test/unit/context/setup_dsl_tests.rb +26 -14
  63. data/test/unit/context/subject_dsl_tests.rb +5 -3
  64. data/test/unit/context/suite_dsl_tests.rb +6 -4
  65. data/test/unit/context/test_dsl_tests.rb +43 -19
  66. data/test/unit/context_info_tests.rb +6 -4
  67. data/test/unit/context_tests.rb +112 -54
  68. data/test/unit/default_runner_tests.rb +2 -0
  69. data/test/unit/default_suite_tests.rb +12 -6
  70. data/test/unit/factory_tests.rb +4 -2
  71. data/test/unit/file_line_tests.rb +9 -7
  72. data/test/unit/macro_tests.rb +13 -11
  73. data/test/unit/result_tests.rb +49 -41
  74. data/test/unit/runner_tests.rb +33 -18
  75. data/test/unit/suite_tests.rb +42 -24
  76. data/test/unit/test_tests.rb +66 -73
  77. data/test/unit/utils_tests.rb +52 -37
  78. data/test/unit/view_helpers_tests.rb +23 -14
  79. data/test/unit/view_tests.rb +7 -5
  80. metadata +40 -9
  81. data/test/unit/assertions/assert_kind_of_tests.rb +0 -66
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "assert"
2
4
  require "assert/context_info"
3
5
 
@@ -6,20 +8,20 @@ require "assert/context"
6
8
  class Assert::ContextInfo
7
9
  class UnitTests < Assert::Context
8
10
  desc "Assert::ContextInfo"
9
- subject { unit_class }
11
+ subject{ unit_class }
10
12
 
11
- let(:unit_class) { Assert::ContextInfo }
13
+ let(:unit_class){ Assert::ContextInfo }
12
14
  end
13
15
 
14
16
  class InitTests < UnitTests
15
17
  desc "when init"
16
- subject { unit_class.new(context1, nil, @caller.first) }
18
+ subject{ unit_class.new(context1, nil, @caller.first) }
17
19
 
18
20
  setup do
19
21
  @caller = caller
20
22
  end
21
23
 
22
- let(:context1) { Assert::Context }
24
+ let(:context1){ Assert::Context }
23
25
 
24
26
  should have_readers :called_from, :klass, :file
25
27
  should have_imeths :test_name
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "assert"
2
4
  require "assert/context"
3
5
 
@@ -8,9 +10,9 @@ require "assert/utils"
8
10
  class Assert::Context
9
11
  class UnitTests < Assert::Context
10
12
  desc "Assert::Context"
11
- subject { unit_class }
13
+ subject{ unit_class }
12
14
 
13
- let(:unit_class) { Assert::Context }
15
+ let(:unit_class){ Assert::Context }
14
16
 
15
17
  # DSL methods
16
18
  should have_imeths :description, :desc, :describe, :subject, :suite, :let
@@ -25,20 +27,23 @@ class Assert::Context
25
27
 
26
28
  class InitTests < UnitTests
27
29
  desc "when init"
28
- subject { context_class1.new(test1, test1.config, result_callback1) }
30
+ subject{ context_class1.new(test1, test1.config, result_callback1) }
29
31
 
30
32
  setup do
31
33
  @callback_result = nil
32
34
  end
33
35
 
34
- let(:test1) { Factory.test }
35
- let(:context_class1) { test1.context_class }
36
- let(:test_results1) { [] }
37
- let(:result_callback1) {
38
- proc { |result| @callback_result = result; test_results1 << result }
39
- }
40
- let(:halt_config1) { Assert::Config.new(:halt_on_fail => true) }
41
- let(:msg1) { Factory.string }
36
+ let(:test1){ Factory.test }
37
+ let(:context_class1){ test1.context_class }
38
+ let(:test_results1){ [] }
39
+ let(:result_callback1) do
40
+ proc do |result|
41
+ @callback_result = result
42
+ test_results1 << result
43
+ end
44
+ end
45
+ let(:halt_config1){ Assert::Config.new(halt_on_fail: true) }
46
+ let(:msg1){ Factory.string }
42
47
 
43
48
  should have_imeths :assert, :assert_not, :refute, :assert_that
44
49
  should have_imeths :pass, :ignore, :fail, :flunk, :skip
@@ -46,7 +51,8 @@ class Assert::Context
46
51
 
47
52
  should "collect context info" do
48
53
  test = @__assert_running_test__
49
- assert_that(test.context_info.file).matches(/test\/unit\/context_tests.rb$/)
54
+ assert_that(test.context_info.file)
55
+ .matches(%r{test/unit/context_tests.rb$})
50
56
  assert_that(test.context_info.klass).equals(self.class)
51
57
  end
52
58
 
@@ -58,7 +64,9 @@ class Assert::Context
58
64
  with_backtrace(caller) do
59
65
  assert_that(result.with_bt_set?).is_true
60
66
 
61
- exp = Assert::Result::Backtrace.to_s(exp_with_bt+[(result.backtrace.filtered.first)])
67
+ exp =
68
+ Assert::Result::Backtrace.to_s(exp_with_bt +
69
+ [(result.backtrace.filtered.first)])
62
70
  assert_that(result.trace).equals(exp)
63
71
  assert_that(result.src_line).equals(exp_with_bt.first)
64
72
  end
@@ -69,7 +77,8 @@ class Assert::Context
69
77
  assert_that(result.with_bt_set?).is_false
70
78
 
71
79
  assert_that(result.trace).equals(result.src_line)
72
- assert_that(result.src_line).equals(result.backtrace.filtered.first.to_s)
80
+ assert_that(result.src_line)
81
+ .equals(result.backtrace.filtered.first.to_s)
73
82
  end
74
83
  end
75
84
  end
@@ -78,7 +87,12 @@ class Assert::Context
78
87
  desc "skip method"
79
88
 
80
89
  setup do
81
- begin; subject.skip(msg1); rescue StandardError => @exception; end
90
+ @exception =
91
+ begin
92
+ subject.skip(msg1)
93
+ rescue => ex
94
+ ex
95
+ end
82
96
  @result = Factory.skip_result(@exception)
83
97
  end
84
98
 
@@ -96,7 +110,12 @@ class Assert::Context
96
110
  assert_that(@exception.backtrace.size).does_not_equal(1)
97
111
 
98
112
  called_from = Factory.string
99
- begin; subject.skip(msg1, called_from); rescue StandardError => exception; end
113
+ exception =
114
+ begin
115
+ subject.skip(msg1, called_from)
116
+ rescue => ex
117
+ ex
118
+ end
100
119
  assert_that(exception.backtrace.size).equals(1)
101
120
  assert_that(exception.backtrace.first).equals(called_from)
102
121
  end
@@ -178,14 +197,20 @@ class Assert::Context
178
197
 
179
198
  class HaltOnFailTests < InitTests
180
199
  desc "failing when halting on fails"
181
- subject { context_class1.new(test1, halt_config1, result_callback1) }
200
+ subject{ context_class1.new(test1, halt_config1, result_callback1) }
182
201
 
183
202
  should "raise an exception with the failure's message" do
184
- begin; subject.fail(msg1); rescue StandardError => err; end
185
- assert_that(err).is_kind_of(Assert::Result::TestFailure)
186
- assert_that(err.message).equals(msg1)
187
-
188
- result = Assert::Result::Fail.for_test(Factory.test("something"), err)
203
+ exception =
204
+ begin
205
+ subject.fail(msg1)
206
+ rescue => ex
207
+ ex
208
+ end
209
+ assert_that(exception).is_kind_of(Assert::Result::TestFailure)
210
+ assert_that(exception.message).equals(msg1)
211
+
212
+ result =
213
+ Assert::Result::Fail.for_test(Factory.test("something"), exception)
189
214
  assert_that(result.message).equals(msg1)
190
215
  end
191
216
 
@@ -197,7 +222,7 @@ class Assert::Context
197
222
  class AssertTests < InitTests
198
223
  desc "assert method"
199
224
 
200
- let(:what_failed) { Factory.string }
225
+ let(:what_failed){ Factory.string }
201
226
 
202
227
  should "return a pass result given a `true` assertion" do
203
228
  result = subject.assert(true, msg1){ what_failed }
@@ -211,7 +236,8 @@ class Assert::Context
211
236
  end
212
237
 
213
238
  should "pp the assertion value in the fail message by default" do
214
- exp_def_what = "Failed assert: assertion was `#{Assert::U.show(false, test1.config)}`."
239
+ exp_def_what =
240
+ "Failed assert: assertion was `#{Assert::U.show(false, test1.config)}`."
215
241
  result = subject.assert(false, msg1)
216
242
 
217
243
  assert_that(result.message).equals([msg1, exp_def_what].join("\n"))
@@ -246,7 +272,9 @@ class Assert::Context
246
272
  end
247
273
 
248
274
  should "pp the assertion value in the fail message by default" do
249
- exp_def_what = "Failed assert_not: assertion was `#{Assert::U.show(true, test1.config)}`."
275
+ exp_def_what =
276
+ "Failed assert_not: "\
277
+ "assertion was `#{Assert::U.show(true, test1.config)}`."
250
278
  result = subject.assert_not(true, msg1)
251
279
 
252
280
  assert_that(result.message).equals([msg1, exp_def_what].join("\n"))
@@ -265,32 +293,32 @@ class Assert::Context
265
293
  desc "`assert_that` method"
266
294
 
267
295
  setup do
268
- Assert.stub_tap_on_call(Assert::ActualValue, :new) { |_, call|
296
+ Assert.stub_tap_on_call(Assert::ActualValue, :new) do |_, call|
269
297
  @actual_value_new_call = call
270
- }
298
+ end
271
299
  end
272
300
 
273
- let(:actual_value) { Factory.string }
301
+ let(:actual_value){ Factory.string }
274
302
 
275
303
  should "build an Assert::ActualValue" do
276
304
  assert_instance_of Assert::ActualValue, subject.assert_that(actual_value)
277
305
  assert_equal [actual_value], @actual_value_new_call.pargs
278
- assert_equal({ context: subject }, @actual_value_new_call.kargs)
306
+ assert_equal({ context: subject }, @actual_value_new_call.kargs)
279
307
  end
280
308
  end
281
309
 
282
310
  class SubjectTests < InitTests
283
311
  desc "subject method"
284
- subject { context_class1.new(test1, test1.config, proc{ |result| }) }
312
+ subject{ context_class1.new(test1, test1.config, proc{ |result| }) }
285
313
 
286
314
  setup do
287
315
  expected = expected1
288
- context_class1.subject { @something = expected }
316
+ context_class1.subject{ @something = expected }
289
317
  @subject = subject.subject
290
318
  end
291
319
 
292
- let(:context_class1) { Factory.modes_off_context_class }
293
- let(:expected1) { Factory.string }
320
+ let(:context_class1){ Factory.modes_off_context_class }
321
+ let(:expected1){ Factory.string }
294
322
 
295
323
  should "instance evaluate the block set with the class setup method" do
296
324
  assert_that(@subject).equals(expected1)
@@ -300,8 +328,17 @@ class Assert::Context
300
328
  class PendingTests < InitTests
301
329
  desc "`pending` method"
302
330
 
303
- let(:block2) { proc { fail; pass; } }
304
- let(:block1) { block = block2; proc { pending(&block) } } # test nesting
331
+ let(:block2) do
332
+ proc do
333
+ fail # rubocop:disable Style/SignalException
334
+ pass # rubocop:disable Lint/UnreachableCode
335
+ end
336
+ end
337
+ # test nesting
338
+ let(:block1) do
339
+ block = block2
340
+ proc{ pending(&block) }
341
+ end
305
342
 
306
343
  should "make fails skips and make passes fails" do
307
344
  subject.fail "not affected"
@@ -324,29 +361,42 @@ class Assert::Context
324
361
 
325
362
  class PendingWithHaltOnFailTests < PendingTests
326
363
  desc "when halting on fails"
327
- subject { context_class1.new(test1, halt_config1, result_callback1) }
364
+ subject{ context_class1.new(test1, halt_config1, result_callback1) }
328
365
 
329
366
  should "make fails skips and stop the test" do
330
- begin; subject.pending(&block1); rescue StandardError => err; end
331
- assert_that(err).is_kind_of(Assert::Result::TestSkipped)
332
- assert_that(err.message).includes("Pending fail")
333
-
334
- assert_that(test_results1.size).equals(0) # it halted before the pending pass
367
+ exception =
368
+ begin
369
+ subject.pending(&block1)
370
+ rescue => ex
371
+ ex
372
+ end
373
+ assert_that(exception).is_kind_of(Assert::Result::TestSkipped)
374
+ assert_that(exception.message).includes("Pending fail")
375
+
376
+ # it halted before the pending pass
377
+ assert_that(test_results1.size).equals(0)
335
378
  end
336
379
  end
337
380
 
338
381
  class WithBacktraceTests < InitTests
339
382
  desc "`with_backtrace` method"
340
383
 
341
- let(:from_bt1) { ["called_from_here", Factory.string] }
342
- let(:from_block1) { proc { ignore; fail; pass; skip "todo"; } }
384
+ let(:from_bt1){ ["called_from_here", Factory.string] }
385
+ let(:from_block1) do
386
+ proc do
387
+ ignore
388
+ fail # rubocop:disable Style/SignalException
389
+ pass # rubocop:disable Lint/UnreachableCode
390
+ skip "todo"
391
+ end
392
+ end
343
393
 
344
394
  should "alter non-error block results' bt with given bt's first line" do
345
395
  subject.fail "not affected"
346
396
  begin
347
397
  subject.with_backtrace(from_bt1, &from_block1)
348
- rescue Assert::Result::TestSkipped => e
349
- test_results1 << Assert::Result::Skip.for_test(test1, e)
398
+ rescue Assert::Result::TestSkipped => ex
399
+ test_results1 << Assert::Result::Skip.for_test(test1, ex)
350
400
  end
351
401
 
352
402
  assert_that(test_results1.size).equals(5)
@@ -365,21 +415,29 @@ class Assert::Context
365
415
  class WithNestedBacktraceTests < InitTests
366
416
  desc "`with_backtrace` method nested"
367
417
 
368
- let(:from_bt1) { ["called_from_here 1", Factory.string] }
369
- let(:from_bt2) { ["called_from_here 2", Factory.string] }
370
- let(:from_block2) { proc { ignore; fail; pass; skip "todo"; } }
371
- let(:from_block1) {
418
+ let(:from_bt1){ ["called_from_here 1", Factory.string] }
419
+ let(:from_bt2){ ["called_from_here 2", Factory.string] }
420
+ let(:from_block2) do
421
+ proc do
422
+ ignore
423
+ fail # rubocop:disable Style/SignalException
424
+ pass # rubocop:disable Lint/UnreachableCode
425
+ skip "todo"
426
+ end
427
+ end
428
+ let(:from_block1) do
372
429
  from_bt = from_bt2
373
430
  from_block = from_block2
374
- proc { with_backtrace(from_bt, &from_block) }
375
- }
431
+ proc{ with_backtrace(from_bt, &from_block) }
432
+ end
376
433
 
377
- should "alter non-error block results' bt with nested wbt accrued first lines" do
434
+ should "alter non-error block results' bt with nested wbt accrued "\
435
+ "first lines" do
378
436
  subject.fail "not affected"
379
437
  begin
380
438
  subject.with_backtrace(from_bt1, &from_block1)
381
- rescue Assert::Result::TestSkipped => e
382
- test_results1 << Assert::Result::Skip.for_test(test1, e)
439
+ rescue Assert::Result::TestSkipped => ex
440
+ test_results1 << Assert::Result::Skip.for_test(test1, ex)
383
441
  end
384
442
 
385
443
  assert_that(test_results1.size).equals(5)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "assert"
2
4
  require "assert/default_runner"
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "assert"
2
4
  require "assert/default_suite"
3
5
 
@@ -6,18 +8,22 @@ require "assert/suite"
6
8
  class Assert::DefaultSuite
7
9
  class UnitTests < Assert::Context
8
10
  desc "Assert::DefaultSuite"
9
- subject { unit_class }
11
+ subject{ unit_class }
10
12
 
11
- let(:unit_class) { Assert::DefaultSuite }
13
+ let(:unit_class){ Assert::DefaultSuite }
12
14
  end
13
15
 
14
16
  class InitTests < UnitTests
15
17
  desc "when init"
16
- subject { unit_class.new(config1) }
18
+ subject{ unit_class.new(config1) }
19
+
20
+ let(:ci1){ Factory.context_info(Factory.modes_off_context_class) }
21
+ let(:test1){ Factory.test(Factory.string, ci1){} }
22
+ let(:config1){ Factory.modes_off_config }
17
23
 
18
- let(:ci1) { Factory.context_info(Factory.modes_off_context_class) }
19
- let(:test1) { Factory.test(Factory.string, ci1) { } }
20
- let(:config1) { Factory.modes_off_config }
24
+ should have_readers :test_count, :result_count, :pass_result_count
25
+ should have_readers :fail_result_count, :error_result_count
26
+ should have_readers :skip_result_count, :ignore_result_count
21
27
 
22
28
  should "be a Suite" do
23
29
  assert_that(subject).is_kind_of(Assert::Suite)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "assert"
2
4
  require "assert/factory"
3
5
 
@@ -6,9 +8,9 @@ require "much-factory"
6
8
  module Assert::Factory
7
9
  class UnitTests < Assert::Context
8
10
  desc "Assert::Factory"
9
- subject { unit_class }
11
+ subject{ unit_class }
10
12
 
11
- let(:unit_class) { Assert::Factory }
13
+ let(:unit_class){ Assert::Factory }
12
14
 
13
15
  should "include and extend MuchFactory" do
14
16
  assert_that(subject).includes(MuchFactory)
@@ -1,22 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "assert"
2
4
  require "assert/file_line"
3
5
 
4
6
  class Assert::FileLine
5
7
  class UnitTests < Assert::Context
6
8
  desc "Assert::FileLine"
7
- subject { unit_class }
9
+ subject{ unit_class }
8
10
 
9
- let(:unit_class) { Assert::FileLine }
11
+ let(:unit_class){ Assert::FileLine }
10
12
 
11
- let(:file1) { "#{Factory.path}_tests.rb" }
12
- let(:line1) { Factory.integer.to_s }
13
+ let(:file1){ "#{Factory.path}_tests.rb" }
14
+ let(:line1){ Factory.integer.to_s }
13
15
 
14
16
  should have_imeths :parse
15
17
 
16
18
  should "know how to parse and init from a file line path string" do
17
19
  file_line_path = [
18
20
  "#{file1}:#{line1}",
19
- "#{file1}:#{line1} #{Factory.string}"
21
+ "#{file1}:#{line1} #{Factory.string}",
20
22
  ].sample
21
23
  file_line = subject.parse(file_line_path)
22
24
 
@@ -45,7 +47,7 @@ class Assert::FileLine
45
47
 
46
48
  class InitTests < UnitTests
47
49
  desc "when init"
48
- subject { unit_class.new(file1, line1) }
50
+ subject{ unit_class.new(file1, line1) }
49
51
 
50
52
  should have_readers :file, :line
51
53
 
@@ -71,7 +73,7 @@ class Assert::FileLine
71
73
  no = unit_class.new("#{Factory.path}_tests.rb", Factory.integer.to_s)
72
74
 
73
75
  assert_that(subject).equals(yes)
74
- assert_not_equal no, subject
76
+ assert_not_equal no, subject
75
77
  end
76
78
  end
77
79
  end