#!/usr/bin/perl

#
# MarkdownTester -- Run tests for Markdown implementations
#
# Copyright (c) 2004-2005 John Gruber
# <http://daringfireball.net/projects/markdown/>
#

use strict;
use warnings;
use Getopt::Long;
use Benchmark;

our $VERSION = '1.0.2';
# Sat 24 Dec 2005

my $time_start = new Benchmark;
my $test_dir = "Tests";
my $script  = "./Markdown.pl";
my $use_tidy = 0;
my ($flag_version);

GetOptions (
			"script=s"   => \$script,
			"testdir=s"  => \$test_dir,
			"tidy"       => \$use_tidy,
			"version"    => \$flag_version,
			);

if($flag_version) {
	my $progname = $0;
	$progname =~ s{.*/}{};
	die "$progname version $VERSION\n";
}

unless (-d $test_dir) { die "'$test_dir' is not a directory.\n"; }
unless (-f $script)   { die "$script does not exist.\n"; }
unless (-x $script)   { die "$script is not executable.\n"; }

my $tests_passed = 0;
my $tests_failed = 0;

TEST:
foreach my $testfile (glob "$test_dir/*.text") {
	my $testname = $testfile;
	$testname =~ s{.*/(.+)\.text$}{$1}i; 
	print "$testname ... ";

	# Look for a corresponding .html file for each .text file:
	my $resultfile = $testfile;
	$resultfile =~ s{\.text$}{\.html}i;
	unless (-f $resultfile) {
		print "'$resultfile' does not exist.\n\n";
		next TEST;
	}
	
	# open(TEST, $testfile)     || die("Can't open testfile: $!");
	open(RESULT, $resultfile) || die("Can't open resultfile: $!");
	undef $/;
	# my $t_input = <TEST>;
	my $t_result = <RESULT>;

	my $t_output = `'$script' '$testfile'`;

	# Normalize the output and expected result strings:
	$t_result =~ s/\s+\z//; # trim trailing whitespace
	$t_output =~ s/\s+\z//; # trim trailing whitespace
	if ($use_tidy) {
		#  Escape the strings, pass them through to CLI tidy tool for tag-level equivalency
		$t_result =~ s{'}{'\\''}g; # escape ' chars for shell
		$t_output =~ s{'}{'\\''}g;
		$t_result = `echo '$t_result' | tidy -quiet --show-warnings n`;
		$t_output = `echo '$t_output' | tidy -quiet --show-warnings n`;
	}

	if ($t_output eq $t_result) {
		print "OK\n";
		$tests_passed++;
	}
	else {
		print "FAILED\n\n";
		$tests_failed++;
	}
}

print "\n\n";
print "$tests_passed passed; $tests_failed failed.\n";

my $time_end = new Benchmark;
my $time_diff = timediff($time_end, $time_start);
print "Benchmark: ", timestr($time_diff), "\n";


__END__

=pod

=head1 NAME

B<MarkdownTest>


=head1 SYNOPSIS

B<MarkdownTest.pl> [ B<--options> ]  [ I<file> ... ]


=head1 DESCRIPTION


=head1 OPTIONS

Use "--" to end switch parsing. For example, to open a file named "-z", use:

	MarkdownTest.pl -- -z

=over 4

=item B<--script>

Specify the path to the Markdown script to test. Defaults to
"./Markdown.pl". Example:

	./MarkdownTest.pl --script ./PHP-Markdown/php-markdown

=item B<--testdir>

Specify the path to a directory containing test data. Defaults to "Tests".

=item B<--tidy>

Flag to turn on using the command line 'tidy' tool to normalize HTML
output before comparing script output to the expected test result.
Assumes that the 'tidy' command is available in your PATH. Defaults to
off.

=back



=head1 BUGS



=head1 VERSION HISTORY

1.0	Mon 13 Dec 2004-2005

1.0.1 Mon 19 Sep 2005

	+	Better handling of case when foo.text exists, but foo.html doesn't.
		It now prints a message and moves on, rather than dying.


=head1 COPYRIGHT AND LICENSE

Copyright (c) 2004-2005 John Gruber  
<http://daringfireball.net/>   
All rights reserved.

This is free software; you may redistribute it and/or modify it under
the same terms as Perl itself.

=cut
