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

package XMLTests;

BEGIN { *$_ = \&{"main::$_"} for qw(ok diag) }
use Scriptalicious;
use File::Find;
use FindBin qw($Bin);
use strict;
use YAML qw(Load Dump);

our $grep;
getopt_lenient( "test-grep|t=s" => \$grep );

sub find_tests {
	my $group = shift;
	my @tests;
	find(
		sub {
			if (m{\.(?:x|ya)ml$}
				&&
				(!$grep||$File::Find::name=~m{$grep})
				)
			{   my $name = $File::Find::name;
				$name =~ s{^\Q$Bin\E/}{} or die;
				push @tests, $name;
			}
		},
		"$Bin/$group"
	);
	@tests;
}

sub read_xml {
	my $test = shift;
	open XML, "<$Bin/$test";
	binmode XML, ":utf8";
	my $xml = do {
		local($/);
		<XML>;
	};
	close XML;
	$xml;
}

sub read_yaml {
	my $test = shift;
	open YAML, "<$Bin/$test";
	binmode YAML, ":utf8";
	my $yaml = do {
		local($/);
		<YAML>;
	};
	close YAML;
	my $obj = Load($yaml);
	if (wantarray) {
		return ($obj, $yaml);
	}
	else {
		return $obj;
	}
}

sub parse_test {
	my $class = shift;
	my $xml = shift;
	my $test_name = shift;
	my $lax = shift // 0;
	
	my $object = eval { $class->parse($xml, $lax) };
	my $ok = ok($object, "$test_name - parsed OK");
	if ( !$ok ) {
		diag("exception during parsing: $@");
	}
	if ( $ok and ($main::VERBOSE//0)>0) {
		diag("read: ".Dump($object));
	}
	$object;
}

sub parsefail_test {
	my $class = shift;
	my $xml = shift;
	my $test_name = shift;
	my $object = eval { $class->parse($xml) };
	my $error = $@;
	my $ok = ok(!$object&&$error, "$test_name - exception raised");
	if ( !$ok ) {
		diag("parsed to: ".Dump($object));
	}
	if ( $ok and ($main::VERBOSE||0)>0) {
		diag("error: ".Dump($error));
	}
	$error;
}

sub emit_test {
	my $object = shift;
	my $test_name = shift;
	start_timer;
	my $r_xml = eval { $object->to_xml };
	my $time = show_elapsed;
	ok($r_xml, "$test_name - emitted OK ($time)")
		or do {
		diag("exception during emitting: $@");
		return undef;
		};
	if (($main::VERBOSE||0)>0) {
		diag("xml: ".$r_xml);
	}
	return $r_xml;
}

sub xml_compare_test {
	my $xml_compare = shift;
	my $r_xml = shift;
	my $xml = shift;
	my $test_name = shift;

	my $is_same = $xml_compare->is_same($r_xml, $xml);
	ok($is_same, "$test_name - XML output same")
		or diag("Error: ".$xml_compare->error);

}

1;

# Copyright (C) 2009, 2010  NZ Registry Services
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the Artistic License 2.0 or later.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# Artistic License 2.0 for more details.
#
# You should have received a copy of the Artistic License the file
# COPYING.txt.  If not, see
# <http://www.perlfoundation.org/artistic_license_2_0>