# XML-STX test suite BEGIN { $| = 1; unshift @INC, "blib/lib", "blib/arch", "test"; } use strict; use XML::STX; use TestHandler; print '-' x 47, "\n"; print "loaded\n"; my $total = 0; my $passed = 0; my @failed = (); my @errors = (0,0,0); my @err0 = (); my $m = 0; # to measure times or not my $time = 0; $@ = undef; eval "require Time::HiRes;"; $m = 1 unless $@; my $stx = XML::STX->new(Writer => 'XML::STX::Writer'); $stx->{Parser} = 'XML::SAX::ExpatXS'; open(INDEX,'test/_index'); while () { next if $_ =~ /^#/ or $_ =~ /^\s*$/; if ($_ =~ /^\$ERRORS(.*)$/) { @err0 = split(' ', $1); next; }; chomp; $total++; my @ln = split('\|', $_, 4); my $templ_uri = "test/$ln[0].stx"; my $data_uri = "test/_data$ln[1].xml"; my $handler = TestHandler->new(); $stx->{ErrorListener} = $handler; my $transformer = $stx->new_transformer($templ_uri); # external parameters unless ($ln[2] =~ /^\d+$/) { foreach (split(' ', $ln[2])) { my ($name, $value) = split('=',$_,2); $transformer->{Parameters}->{$name} = $value; } } my $source = $stx->new_source($data_uri); my $result = $stx->new_result($handler); $transformer->{ErrorListener} = $handler; my $t0 = Time::HiRes::time() if $m; $transformer->transform($source, $result); my $t = Time::HiRes::time() - $t0 if $m; $time += $t; $handler->{result} =~ s/\s//g; $ln[3] =~ s/\s//g; #print "->$handler->{result}\n"; #print "->$ln[3]\n"; my $dots = 35 - length($ln[0]); if ($handler->{result} eq $ln[3]) { print "$ln[0]", '.' x $dots, "OK"; printf " (%.3f \s\)", $t if $m; print "\n"; $passed++; } else { print "$ln[0]", '.' x $dots, "FAILED!\n"; push @failed, $ln[0]; } $errors[0] += $handler->{warnings}; $errors[1] += $handler->{errors}; $errors[2] += $handler->{fatals}; } close INDEX; # errors $total++; my $error_line = 'errors (' . join('-', @errors) . ')'; my $dots = 35 - length($error_line); if (join('-',@err0) eq join('-', @errors)) { print $error_line, '.' x $dots, "OK\n"; $passed++; } else { print $error_line, '.' x $dots, "FAILED\n"; push @failed, 'errors'; } print '-' x 47, "\n"; if ($passed == $total) { print "All tests passed successfully: $passed/$total\n"; printf "Total time: %.3f s\n", $time if $m; } else { print "There were problems: $passed/$total\n"; print '(', join(', ', @failed), ")\n"; } print '-' x 47, "\n";