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 <a...@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 > >