megatest 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3aed9a74324fa1784f24f68e885686237f6bda99c893e4816a038617d4952ad3
4
- data.tar.gz: 05d2d17f697bd4b776395c722c8d5b0e57dd82ad22ead0c2b0fa2bbc65e8a3f9
3
+ metadata.gz: ea30c8e8593fdaa884c4ec33c19f4d5341ccaabb28d0d81fad546b8afc3feb70
4
+ data.tar.gz: e72756df6996fd7acf921c3e474ac5c64124bdcddec97bb0c670062680a6db22
5
5
  SHA512:
6
- metadata.gz: 9ef38fe98c124067a4688ab0a0879e890a1704a99cdaeacd17afee675bde1425e0ad635944b7782dd4cf5cfc5137ce048d38affbb8fd2b163118cfe58b566882
7
- data.tar.gz: 6b32db62cedb9b956c3bb4f9d81b10f8ea371a9c4e241709a178efc7731d37676e8aed5ccf7dcf99ed02116712d308b562fe26567d64a1ab8b5d4e04a648e1ed
6
+ metadata.gz: 0d2ecdd55e90bcc208cc64f9d79930ae43639d7e37b982bd3e67835dd72b26e704f4d32205d6f9af26a2dff477310cdf70abf267afab9d178bec55802c384d30
7
+ data.tar.gz: 39cb4c8fb0befc06117d48ed82001909bf41fe128f4878b03d095708028456537a6a9ad3c33c1970f2567e32671d8e7a422437195d9b4ad086db600491da9623
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.9.0] - 2026-05-09
4
+
5
+ - Implement `capture_subprocess_io`.
6
+ - Change setup/teadown callbacks order to be more consistent with `ActiveSupport::TestCase`.
7
+ - Don't consider skips as failure when running with `--fail-fast`.
8
+ - `assert_equal` now use `==` instead of `!=` to compare objects
9
+ - `assert_operator` now calls `assert_predicate` if there no third argument (mimick Minitest).
10
+ - Support `assert_difference("expr" => 1)` like `ActiveSupport::TestCase`
11
+
3
12
  ## [0.8.0] - 2026-05-08
4
13
 
5
14
  - Improve rendering of retried failures so they're actionable.
@@ -23,8 +23,13 @@ module Megatest
23
23
  class UnexpectedError < Assertion
24
24
  attr_reader :cause
25
25
 
26
- def initialize(cause)
27
- super("Unexpected exception")
26
+ def initialize(cause, method = nil)
27
+ if method
28
+ super("Unexpected exception in #{method} block")
29
+ else
30
+ super("Unexpected exception")
31
+ end
32
+ @method = method
28
33
  @cause = cause
29
34
  end
30
35
 
@@ -95,7 +100,7 @@ module Megatest
95
100
  @__m.fail(nil, "Use assert_nil if expecting nil, or pass `allow_nil: true`")
96
101
  end
97
102
 
98
- if expected != actual
103
+ unless expected == actual
99
104
  @__m.fail(
100
105
  message,
101
106
  @__m.diff(expected, actual) ||
@@ -355,13 +360,9 @@ module Megatest
355
360
  end
356
361
  alias :assert_raise :assert_raises
357
362
 
358
- def assert_nothing_raised
363
+ def assert_nothing_raised(&block)
359
364
  @__m.assert do
360
- yield
361
- rescue ::Megatest::Assertion, *::Megatest::IGNORED_ERRORS
362
- raise # Pass through
363
- rescue Exception => unexepected_exception
364
- raise ::Megatest::UnexpectedError, unexepected_exception
365
+ @__m.safe_yield(__callee__, &block)
365
366
  end
366
367
  end
367
368
 
@@ -386,8 +387,13 @@ module Megatest
386
387
  end
387
388
  end
388
389
 
389
- def assert_operator(left, operator, right, msg = nil, message: nil)
390
+ def assert_operator(left, operator, right = @__m.unset, msg = nil, message: nil)
390
391
  message = @__m.msg(msg, message)
392
+
393
+ unless @__m.set?(right)
394
+ return assert_predicate(left, operator, message: message)
395
+ end
396
+
391
397
  @__m.assert do
392
398
  unless left.__send__(operator, right)
393
399
  @__m.fail(message, "Expected", @__m.pp(left), "to be #{operator}", @__m.pp(right))
@@ -395,8 +401,13 @@ module Megatest
395
401
  end
396
402
  end
397
403
 
398
- def refute_operator(left, operator, right, msg = nil, message: nil)
404
+ def refute_operator(left, operator, right = @__m.unset, msg = nil, message: nil)
399
405
  message = @__m.msg(msg, message)
406
+
407
+ unless @__m.set?(right)
408
+ return refute_predicate(left, operator, message: message)
409
+ end
410
+
400
411
  @__m.assert do
401
412
  if left.__send__(operator, right)
402
413
  @__m.fail(message, "Expected", @__m.pp(left), "to not be #{operator}", @__m.pp(right))
@@ -405,7 +416,11 @@ module Megatest
405
416
  end
406
417
  alias_method :assert_not_operator, :refute_operator
407
418
 
408
- def assert_difference(expression, difference = @__m.unset, message: nil, &block)
419
+ def assert_difference(expression = @__m.unset, difference = @__m.unset, message: nil, **kwargs, &block)
420
+ if !@__m.set?(expression) && !kwargs.empty?
421
+ expression = kwargs
422
+ end
423
+
409
424
  expressions = if @__m.set?(difference)
410
425
  Array(expression).to_h { |e| [e, difference] }
411
426
  elsif Hash === expression
@@ -419,7 +434,7 @@ module Megatest
419
434
  @__m.assert do
420
435
  before = exps.map(&:call)
421
436
 
422
- retval = @__m.safe_yield(&block)
437
+ retval = @__m.safe_yield(__callee__, &block)
423
438
 
424
439
  expressions.zip(exps, before) do |(code, diff), exp, before_value|
425
440
  actual = exp.call
@@ -434,13 +449,13 @@ module Megatest
434
449
  end
435
450
  end
436
451
 
437
- def refute_difference(expressions, message: nil, &block)
452
+ def refute_difference(expressions = @__m.unset, message: nil, &block)
438
453
  exps = Array(expressions).map { |e| @__m.expression(e, block) }
439
454
 
440
455
  @__m.assert do
441
456
  before = exps.map(&:call)
442
457
 
443
- retval = @__m.safe_yield(&block)
458
+ retval = @__m.safe_yield(__callee__, &block)
444
459
 
445
460
  exps.zip(before) do |exp, before_value|
446
461
  actual = exp.call
@@ -616,5 +631,30 @@ module Megatest
616
631
  $stderr = orig_stderr
617
632
  end
618
633
  end
634
+
635
+ def capture_subprocess_io
636
+ require "tempfile" unless defined?(::Tempfile)
637
+
638
+ captured_stdout, captured_stderr = Tempfile.new("out"), Tempfile.new("err")
639
+
640
+ orig_stdout, orig_stderr = $stdout.dup, $stderr.dup
641
+ $stdout.reopen captured_stdout
642
+ $stderr.reopen captured_stderr
643
+
644
+ yield
645
+
646
+ $stdout.rewind
647
+ $stderr.rewind
648
+
649
+ [captured_stdout.read, captured_stderr.read]
650
+ ensure
651
+ $stdout.reopen orig_stdout
652
+ $stderr.reopen orig_stderr
653
+
654
+ orig_stdout.close
655
+ orig_stderr.close
656
+ captured_stdout.close!
657
+ captured_stderr.close!
658
+ end
619
659
  end
620
660
  end
@@ -91,14 +91,17 @@ module Megatest
91
91
  runtime.record_failures do
92
92
  instance.before_teardown
93
93
  end
94
+
95
+ runtime.record_failures do
96
+ instance.teardown
97
+ end
98
+
94
99
  test_case.each_teardown_callback do |callback|
95
100
  runtime.record_failures(downlevel: 2) do
96
101
  instance.instance_exec(&callback)
97
102
  end
98
103
  end
99
- runtime.record_failures do
100
- instance.teardown
101
- end
104
+
102
105
  runtime.record_failures do
103
106
  instance.after_teardown
104
107
  end
@@ -139,12 +139,12 @@ module Megatest
139
139
  end
140
140
  end
141
141
 
142
- def safe_yield
142
+ def safe_yield(method)
143
143
  yield
144
144
  rescue Assertion, *IGNORED_ERRORS
145
145
  raise
146
- rescue ::Exception => unexepected_exception
147
- raise UnexpectedError, unexepected_exception
146
+ rescue ::Exception => unexpected_exception
147
+ raise UnexpectedError.new(unexpected_exception, method)
148
148
  end
149
149
 
150
150
  UNSET = BasicObject.new
@@ -5,6 +5,8 @@
5
5
  module Megatest
6
6
  class Selector
7
7
  class List
8
+ attr_accessor :loaders
9
+
8
10
  def initialize(config, loaders, filters)
9
11
  @loaders = loaders
10
12
  if loaders.empty?
@@ -89,7 +89,7 @@ module Megatest
89
89
  def on_setup(block)
90
90
  raise Error, "setup blocks can't be defined in context blocks" if @current_context
91
91
 
92
- @setup_callbacks.unshift(block)
92
+ @setup_callbacks << block
93
93
  end
94
94
 
95
95
  def on_around(block)
@@ -377,7 +377,7 @@ module Megatest
377
377
 
378
378
  def each_teardown_callback(&block)
379
379
  @test_suite.ancestors.each do |test_suite|
380
- test_suite.teardown_callbacks.each(&block)
380
+ test_suite.teardown_callbacks.reverse_each(&block)
381
381
  end
382
382
  end
383
383
 
@@ -627,7 +627,7 @@ module Megatest
627
627
  end
628
628
 
629
629
  def bad?
630
- !@retried && !@failures.empty?
630
+ !@retried && !skipped? && !@failures.empty?
631
631
  end
632
632
 
633
633
  def status
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Megatest
4
- VERSION = "0.8.0"
4
+ VERSION = "0.9.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: megatest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
@@ -75,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0'
77
77
  requirements: []
78
- rubygems_version: 4.0.6
78
+ rubygems_version: 4.0.11
79
79
  specification_version: 4
80
80
  summary: Modern test-unit style test framework
81
81
  test_files: []