1*5759b3d2Safresh1#!/usr/bin/perl -w
2*5759b3d2Safresh1
3*5759b3d2Safresh1# Test is_deeply and friends with circular data structures [rt.cpan.org 7289]
4*5759b3d2Safresh1
5*5759b3d2Safresh1BEGIN {
6*5759b3d2Safresh1    if( $ENV{PERL_CORE} ) {
7*5759b3d2Safresh1        chdir 't';
8*5759b3d2Safresh1        @INC = ('../lib', 'lib');
9*5759b3d2Safresh1    }
10*5759b3d2Safresh1    else {
11*5759b3d2Safresh1        unshift @INC, 't/lib';
12*5759b3d2Safresh1    }
13*5759b3d2Safresh1}
14*5759b3d2Safresh1
15*5759b3d2Safresh1use strict;
16*5759b3d2Safresh1use Test::More tests => 11;
17*5759b3d2Safresh1
18*5759b3d2Safresh1my $a1 = [ 1, 2, 3 ];
19*5759b3d2Safresh1push @$a1, $a1;
20*5759b3d2Safresh1my $a2 = [ 1, 2, 3 ];
21*5759b3d2Safresh1push @$a2, $a2;
22*5759b3d2Safresh1
23*5759b3d2Safresh1is_deeply $a1, $a2;
24*5759b3d2Safresh1ok( eq_array ($a1, $a2) );
25*5759b3d2Safresh1ok( eq_set   ($a1, $a2) );
26*5759b3d2Safresh1
27*5759b3d2Safresh1my $h1 = { 1=>1, 2=>2, 3=>3 };
28*5759b3d2Safresh1$h1->{4} = $h1;
29*5759b3d2Safresh1my $h2 = { 1=>1, 2=>2, 3=>3 };
30*5759b3d2Safresh1$h2->{4} = $h2;
31*5759b3d2Safresh1
32*5759b3d2Safresh1is_deeply $h1, $h2;
33*5759b3d2Safresh1ok( eq_hash  ($h1, $h2) );
34*5759b3d2Safresh1
35*5759b3d2Safresh1my ($r, $s);
36*5759b3d2Safresh1
37*5759b3d2Safresh1$r = \$r;
38*5759b3d2Safresh1$s = \$s;
39*5759b3d2Safresh1
40*5759b3d2Safresh1ok( eq_array ([$s], [$r]) );
41*5759b3d2Safresh1
42*5759b3d2Safresh1
43*5759b3d2Safresh1{
44*5759b3d2Safresh1    # Classic set of circular scalar refs.
45*5759b3d2Safresh1    my($a,$b,$c);
46*5759b3d2Safresh1    $a = \$b;
47*5759b3d2Safresh1    $b = \$c;
48*5759b3d2Safresh1    $c = \$a;
49*5759b3d2Safresh1
50*5759b3d2Safresh1    my($d,$e,$f);
51*5759b3d2Safresh1    $d = \$e;
52*5759b3d2Safresh1    $e = \$f;
53*5759b3d2Safresh1    $f = \$d;
54*5759b3d2Safresh1
55*5759b3d2Safresh1    is_deeply( $a, $a );
56*5759b3d2Safresh1    is_deeply( $a, $d );
57*5759b3d2Safresh1}
58*5759b3d2Safresh1
59*5759b3d2Safresh1
60*5759b3d2Safresh1{
61*5759b3d2Safresh1    # rt.cpan.org 11623
62*5759b3d2Safresh1    # Make sure the circular ref checks don't get confused by a reference
63*5759b3d2Safresh1    # which is simply repeating.
64*5759b3d2Safresh1    my $a = {};
65*5759b3d2Safresh1    my $b = {};
66*5759b3d2Safresh1    my $c = {};
67*5759b3d2Safresh1
68*5759b3d2Safresh1    is_deeply( [$a, $a], [$b, $c] );
69*5759b3d2Safresh1    is_deeply( { foo => $a, bar => $a }, { foo => $b, bar => $c } );
70*5759b3d2Safresh1    is_deeply( [\$a, \$a], [\$b, \$c] );
71*5759b3d2Safresh1}
72