Yves wrote: > Ok, ive started work on this, however there is a minor problem: The > test in circular_refs regarding rt.cpan.org 11623. (I added names to > make it easier to work with.) > > { > # rt.cpan.org 11623 > # Make sure the circular ref checks don't get confused by a reference > # which is simply repeating. > my $a = {}; > my $b = {}; > my $c = {}; > > is_deeply( [$a, $a], [$b, $c], "rt.cpan.org 11623 - 1" ); > is_deeply( { foo => $a, bar => $a }, { foo => $b, bar => $c }, > "rt.cpan.org 11623 - 2" ); > is_deeply( [\$a, \$a], [\$b, \$c],"rt.cpan.org 11623 - 3" ); > } > > In order to make a real structural comparison these tests have to go. > In order to determine structural equivelence you have to include a > methodology of adding or altering data. If by doing so the two > structures changes differently then you have different structures, if > the structures are still equivelent afterwards you have equivelent > structures. This example would clearly fail the test.
After talking with Ovid some in the kitchen I'm of the opinion that is_deeply() is currently doing the right thing and that these tests cannot go. Largely it comes down to the Principle of Least Surprise. Here's an example. A user wants to test the results of some function that, in this situation, includes some duplicated data. So they might construct their "expected" structure like so to save a little time: my %thing = { foo => 42, bar => 23 }; my %expect = ( stuff => 23, wiff => \%thing, wham => \%thing ); Internally the code might not reuse the same reference. The user would be very surprised if the comparison failed. In fact, I would even argue that this violates some of the black boxness of the test. In much the same way that we don't check to see if a given piece of data is blessed, tied or overloaded, we wouldn't care if we have a repeating reference or two different references to equivalent data. Furthermore, the current behavior provides the more flexible option. If a user doesn't care about the particulars of the references in their structure, is_deeply() works. If they *do* then the user can always run an addition test. But if we made is_deeply() repeating reference aware then the user who does not care about that cannot use is_deeply() at all. So, I conclude that is_deeply()'s behavior is ok and something like Test::Deep should be enhanced with an option to deal with this problem. -- Michael G Schwern [EMAIL PROTECTED] http://www.pobox.com/~schwern Just call me 'Moron Sugar'. http://www.somethingpositive.net/sp05182002.shtml