Test::More/Test::Builder work VERY hard to ensure nothing inside them
alters $! or $@. This is for thing like this:

    ok(do_something_scary());
>     is($!, 0, "expected $! val");
>     is($@, undef, '$@ not changed');


Without Test::More/Builder being careful to support this, the second 2
assertions could fail because something inside ok() modifies $! or $@.

*I cannot change Test::Builder/More* they must continue to protect $! and
$@, otherwise things break (I have a few downstream samples to show that it
does).

However. It is easy enough to have Test::Builder/More protect $! and $@
without requiring Test2 to do so.

Since Test2 is new, and nothing depends on any of its behaviors yet, I am
considering having Test2 not care about modifying $! and $@. So far I have
been taking care to preserve $! and $@, but it does add significant
complexity (and minor, but noticeable slowdown) to Test2.

*Reasons for dropping this promise from Test2:*

   - Simplifies code
   - $! and $@ are altered by many many things, adding { local ... } around
   all of them is a pain
   - Sometimes internals you don't expect to set $! will
   - Perl itself documents that you cannot depend on $! and $@ being
   unchanged past the immediate line after you set it.
   - Test::Builder will continue to protect $! and $@, so nothing will break
   - Test2 is new, nothing depends on it preserving these

*Reasons not to drop it:*

   - It is helpful to people who might not realize $! and $@ are often
   altered unexpectedly.

I am asking for input in case I missed any reasons/arguments for either
side. In either case backwards compatibility will be preserved.

-Chad

Reply via email to