in reply to Test::More extension idea

Yeah, that would be useful. You also could build up a temporary hash and compare that... something like:
my %clean = %$hashref1; delete @clean{qw( key1 key2 )}; eq_hash( \%clean, $hashref2, 'partial hash comparison' );
I dunno how Schwern would react to wanting ignorable keys... it kinda breaks the pattern of 'result, 'expected', 'test name'.

Another approach is to add a new function. Test::More is built around Test::Builder, and it's pretty easy to add new features. Of course, I'm a *little* biased. :)

Replies are listed 'Best First'.
Re: Re: Test::More extension idea
by herveus (Prior) on Oct 16, 2001 at 21:54 UTC
    Howdy!

    I've hacked my copy of Test::More to add eq_hash_skip.

    =item B<eq_hash_skip> eq_hash_skip(\%this, \%that, \@keys_to_ignore); Determines if the two hashes contain the same keys and values, not counting any hash keys in the list of keys to ignore. This is a deep c +heck. Note that the list of keys to ignore is only considered against the top level hashes. Deeper structures must match exactly. If the list of keys to ignore is missing or empty, this is identical to eq_hash. =cut sub eq_hash_skip { my ($a1, $a2, $skip) = @_; return eq_hash($a1, $a2) unless (defined($skip) && @$skip); return 1 if $a1 eq $a2; my %keys_of_interest = map {($_, 1)} keys %$a1, keys %$a2; delete @keys_of_interest{@$skip}; my $ok = 1; foreach my $k (keys %keys_of_interest) { return 0 unless exists $a1->{$k}; return 0 unless exists $a2->{$k}; my($e1, $e2) = ($a1->{$k}, $a2->{$k}); $ok = _deep_check($e1, $e2); last unless $ok; } return $ok; }

    I've also added some tests to More.t to test this out :)

    I'll be corresponding with Schwern, but for the instant, I am using it this way:

    <CODE> ok eq_hash(\%hash1, \%hash2, qw/ key1 key2 / ), 'test name'; <CODE>

    yours,
    Michael