The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
use Test::More tests => 16;
use vars qw($AR $HR @ARGold @HRGold);
require 't/Testdata.pm';
# share imported pkgs via myvars to other pkgs in file
my ($ar,$hr) = ($AR, $HR);
my @argold = @ARGold;
my @hrgold = @HRGold;


use vars q($odd);
my ($mdd, %style); # cant declare inside use

BEGIN { %style = (indent=>1, terse=>1); }

# 2 imports, each inits an object
use Data::Dumper::EasyOO;

Data::Dumper::EasyOO->import(%style, init => \$mdd);
Data::Dumper::EasyOO->import(%style, init => \$odd);

is($mdd->($AR), $ARGold[1][1], "use-time init of my var");
is($odd->($HR), $HRGold[1][1], "use-time init of pkg var");

pass "test copy constructor";
my $ndd = $mdd->new;
$ndd->Indent(2);

is($ndd->($AR), $ARGold[1][2], "cpd obj w indent=>2");
is($ndd->($HR), $HRGold[1][2], "cpd obj w indent=>2");

#$ndd->(copied => \%INC);

SKIP: {
    eval "use Test::Warn";
    skip "these tests need Test::Warn", 4 if $@;
    pass "test (init => \$var) where \$var is already defined";

    my $code = q{ use Data::Dumper::EasyOO (init => \$odd) };
    #print "code: $code, with $odd\n";


  TODO: {
      local $TODO = "withut this todo block, test fails ?!?";
      # eval "use re 'debug'";
      warnings_like
	  ( sub { eval "$code" },
	    [ qr/init arg must be a ref to a (scalar) variable/,
	      qr/wont construct a new EzDD object into non-undef variable/, ],
	    'Auto-Construct only into variable w/o a defined value');
      # eval "no re 'debug'";
  };

    $odd = undef;
    eval "$code";
    isa_ok ($odd, 'Data::Dumper::EasyOO', 're-construct after undeffing var.');

    # test void-context call on obj w/o autoprint
    $odd = Data::Dumper::EasyOO->new();
    $odd->Set(autoprint => undef);
    warning_like( sub { $odd->(\%INC) },
		  qr/called in void context, without autoprint defined/,
		  "carps on void context call to obj w/o autoprint on");
}

SKIP: {
    eval "use Config";
    skip "these tests need Test::Warn", 1 
	unless $Config::Config{useperlio};

    # strcat in eval's arg to prevent compile-time parse, 
    # which would cause 5.5.3 to barf on 3 arg open
    eval "".q{
    	my $buf;
	open (my $fh, '>', \$buf);
	$odd->Set(autoprint => $fh);
	$odd->(odd => \%INC);

	like ($buf, qr/PerlIO/,
	      "autoprint => \$fh works on use-time init'd obj");
    };
    warn $@ if $@;
}


package MultiInit;
*is = \&Test::More::is;

# multiple object inits/auto-constructs
my ($ez1, $ez2, $ez3);
use Data::Dumper::EasyOO ( init		=> \$ez1,
			   indent	=> 1,
			   init		=> \$ez2,
			   terse	=> 1,
			   init		=> \$ez3,
			   indent	=> 2);

is($ez1->($ar), $argold[0][2], "init => \$ez1 prints as expected");
is($ez1->($hr), $hrgold[0][2], "init => \$ez1 prints as expected");

is($ez2->($ar), $argold[0][1], "init => \$ez2 prints as expected");
is($ez2->($hr), $hrgold[0][1], "init => \$ez2 prints as expected");

is($ez3->($ar), $argold[1][1], "init => \$ez3 prints as expected");
is($ez3->($hr), $hrgold[1][1], "init => \$ez3 prints as expected");