develooper Front page | perl.qa | Postings from July 2016

Re: Test2::Tools::Compare is vs. like

Thread Previous | Thread Next
From:
Chad Granum
Date:
July 27, 2016 15:13
Subject:
Re: Test2::Tools::Compare is vs. like
Message ID:
CAJFr3kssvXhjABUYBgM+n8mxdKVcwNTCWajoTAyskgkVBt1PkQ@mail.gmail.com
I thought I had documented the differences pretty well. If you look here
https://metacpan.org/pod/Test2::Tools::Compare#COMPARISON-TOOLS and read
both the 'is()' and 'like()' sections it makes it clear.

is:

> his is the strict checker. The strict checker requires a perfect match
> between $got and $expect. All hash fields must be specified, all array
> items must be present, etc. All non-scalar/hash/array/regex references must
> be identical (same memory address). Scalar, hash and array references will
> be traversed and compared. Regex references will be compared to see if they
> have the same pattern.
>

like:

> This is the relaxed checker. This will ignore hash keys or array indexes
> that you do not actually specify in your $expect structure. In addition
> regex and sub references will be used as validators. If you provide a regex
> using qr/.../, the regex itself will be used to validate the corresponding
> value in the $got structure. The same is true for coderefs, the value is
> passed in as the first argument (and in $_) and the sub should return a
> boolean value. In this tool regexes will stringify the thing they are
> checking.
>

Specifically "This will ignore hash keys or array indexes that you do not
actually specify in your $expect structure." directly documents the
behavior.


That said I have no opposition to making the docs more clear, and am open
to suggestions on how to reword or reorganize it.

-Chad

On Wed, Jul 27, 2016 at 8:03 AM, Andy Lester <andy@petdance.com> wrote:

> I was going to mail this to Chad directly, but I think it’s worth airing
> publicly.
>
> As a newcomer to Test2, it was never clear to me until just now when to
> use is() or like() for deep structures.  Given this code:
>
>     my $errors = do_something();
>     is( @{$errors}, 0. ‘No errors back from do_something()’ ); # old way
>
> And the new way to check would be:
>
>     is( $errors, [], ‘No errors back from do_something()’ );
>
> It would be very easy to use this instead:
>
>     like( $errors, [], ‘No errors back from do_something()’ );
>
> And it looks like like() works just fine, but really it will pass even if
> $errors has something in it.
>
>     is( [], [] ); # Passes
>     like( [‘foo’], [] ); # passes but you wouldn’t expect it to.
>
> The docs say "This is the strict checker” and “This is the relaxed
> checker” for each of them, respectively, but I think it would be worth
> having something in the docs that explains the differences between the two.
>
> Anyone else have troubles with these two functions?  Or other gotchas
> where new features aren’t what people switching from Test::More might
> expect?
>
> Andy
>
> --
> Andy Lester => www.petdance.com
>
>

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About