The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#  -*- perl -*-


use strict;
use lib 't/springfield';
use Springfield;
use Test::More tests => 4;

use vars qw( $intrusive );

my $opinions = $intrusive ? 'ih_opinions' : 'h_opinions';
(my $other = $opinions) =~ s{^(i)?}{($1 ? "" : "i")}e;

#$Tangram::TRACE = \*STDOUT;

sub graph {
    my $homer =
    NaturalPerson->new( firstName => 'Homer',
			name => 'Simpson',
			$opinions =>
			{ work => Opinion->new(statement => 'bad'),
			  food => Opinion->new(statement => 'good'),
			  beer => Opinion->new(statement => 'better') },
			# this is for is_deeply...
			$other => undef,
		      );
}

{
	my $storage = Springfield::connect_empty();

	my $homer = graph();

	$storage->insert($homer);

	$storage->disconnect();
}

is(leaked, 0, "leaktest");

{
	my $storage = Springfield::connect();
	my ($homer) = $storage->select('NaturalPerson');

	# Test::More can be awfully pedantic at times :)
	my $homer_eg = graph();
	my $opinions_h = $homer_eg->{$opinions};

	my $ih_parent;
	if ($intrusive) {
	    $ih_parent = $homer_eg;
	}
	while (my($k,$v)= each %$opinions_h) {
	    $v->{ih_parent} = $ih_parent;
	}

	is_deeply([ sort keys %{ $homer->{$opinions}} ],
		  [ sort keys %{$opinions_h} ],
		  "Hash returned intact");
	is_deeply([ sort map { $_->{statement} } values %{ $homer->{$opinions}} ],
		  [ sort map { $_->{statement} } values %{ $opinions_h } ],
		  "Hash returned intact");

	# smash circular references...
	while (my($k,$v)= each %$opinions_h) {
	    $v->{ih_parent} = undef;
	}

	$storage->disconnect();
}

is(leaked, 0, "leaktest");