The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use TAP::Harness::JUnit;
use Test::More;
use XML::Simple;
use File::Temp;
use File::Basename;
use Encode;

my %tests = (
	package => 'Package prefix test',
);

plan tests => 8 * int (keys %tests);

my $our_cat  = [$^X, qw/-ne print/];
my $our_cat2 = join(' ', @$our_cat);

foreach my $test (keys %tests) {
	my $model = dirname($0)."/tests/$test.xml";
	my $outfile = File::Temp->new (UNLINK => 0)->filename;

	my $harness = new TAP::Harness::JUnit ({
		xmlfile		=> $outfile,
		verbosity	=> -1,
		merge		=> 1,
		exec		=> $our_cat,
		notimes		=> 1,
	});

	$harness->runtests ([dirname($0)."/tests/$test.txt" => $tests{$test}]);

	# Repeat with explicit empty package
	my $outfile_p0 = File::Temp->new (UNLINK => 0)->filename;

	my $harness_p0 = new TAP::Harness::JUnit ({
		xmlfile		=> $outfile_p0,
		package     => '',
		verbosity	=> -1,
		merge		=> 1,
		exec		=> $our_cat,
		notimes		=> 1,
	});

	$harness_p0->runtests ([dirname($0)."/tests/$test.txt" => $tests{$test}]);

	# Repeat with a defined package
	my $model_pkg  = dirname($0)."/tests/$test.qqq.xml";
	my $outfile_p1 = File::Temp->new (UNLINK => 0)->filename;

	my $harness_p1 = new TAP::Harness::JUnit ({
		xmlfile		=> $outfile_p1,
		package     => 'QQQ',
		verbosity	=> -1,
		merge		=> 1,
		exec		=> $our_cat,
		notimes		=> 1,
	});

	$harness_p1->runtests ([dirname($0)."/tests/$test.txt" => $tests{$test}]);

	# Repeat with package in ENV
	my $outfile_p2 = File::Temp->new (UNLINK => 0)->filename;
	$ENV{JUNIT_PACKAGE} = 'QQQ';
	my $harness_p2 = new TAP::Harness::JUnit ({
		xmlfile		=> $outfile_p2,
		verbosity	=> -1,
		merge		=> 1,
		exec		=> $our_cat,
		notimes		=> 1,
	});

	$harness_p2->runtests ([dirname($0)."/tests/$test.txt" => $tests{$test}]);

	is_deeply (XMLin ($outfile), XMLin ($model), "Output of $test (no package) matches model");
	eval { decode ('UTF-8', `$our_cat2 $outfile`, Encode::FB_CROAK) };
	ok (!$@, "Output of $test is valid UTF-8");
	unlink $outfile;

	is_deeply (XMLin ($outfile_p0), XMLin ($model), "Output of $test (empty package) matches model");
	eval { decode ('UTF-8', `$our_cat2 $outfile_p0`, Encode::FB_CROAK) };
	ok (!$@, "Output of $test is valid UTF-8");
	unlink $outfile_p0;

	is_deeply (XMLin ($outfile_p1), XMLin ($model_pkg), "Output of $test (defined package) matches model");
	eval { decode ('UTF-8', `$our_cat2 $outfile_p1`, Encode::FB_CROAK) };
	ok (!$@, "Output of $test is valid UTF-8");
	unlink $outfile_p1;

	is_deeply (XMLin ($outfile_p2), XMLin ($model_pkg), "Output of $test (package through ENV) matches model");
	eval { decode ('UTF-8', `$our_cat2 $outfile_p2`, Encode::FB_CROAK) };
	ok (!$@, "Output of $test is valid UTF-8");
	unlink $outfile_p2;
}