Home | History | Annotate | Download | only in MarkdownTest
      1 #!/usr/bin/perl
      2 
      3 #
      4 # MarkdownTester -- Run tests for Markdown implementations
      5 #
      6 # Copyright (c) 2004-2005 John Gruber
      7 # <http://daringfireball.net/projects/markdown/>
      8 #
      9 
     10 use strict;
     11 use warnings;
     12 use Getopt::Long;
     13 use Benchmark;
     14 
     15 our $VERSION = '1.0.2';
     16 # Sat 24 Dec 2005
     17 
     18 my $time_start = new Benchmark;
     19 my $test_dir = "Tests";
     20 my $script  = "./Markdown.pl";
     21 my $use_tidy = 0;
     22 my ($flag_version);
     23 
     24 GetOptions (
     25 			"script=s"   => \$script,
     26 			"testdir=s"  => \$test_dir,
     27 			"tidy"       => \$use_tidy,
     28 			"version"    => \$flag_version,
     29 			);
     30 
     31 if($flag_version) {
     32 	my $progname = $0;
     33 	$progname =~ s{.*/}{};
     34 	die "$progname version $VERSION\n";
     35 }
     36 
     37 unless (-d $test_dir) { die "'$test_dir' is not a directory.\n"; }
     38 unless (-f $script)   { die "$script does not exist.\n"; }
     39 unless (-x $script)   { die "$script is not executable.\n"; }
     40 
     41 my $tests_passed = 0;
     42 my $tests_failed = 0;
     43 
     44 TEST:
     45 foreach my $testfile (glob "$test_dir/*.text") {
     46 	my $testname = $testfile;
     47 	$testname =~ s{.*/(.+)\.text$}{$1}i; 
     48 	print "$testname ... ";
     49 
     50 	# Look for a corresponding .html file for each .text file:
     51 	my $resultfile = $testfile;
     52 	$resultfile =~ s{\.text$}{\.html}i;
     53 	unless (-f $resultfile) {
     54 		print "'$resultfile' does not exist.\n\n";
     55 		next TEST;
     56 	}
     57 	
     58 	# open(TEST, $testfile)     || die("Can't open testfile: $!");
     59 	open(RESULT, $resultfile) || die("Can't open resultfile: $!");
     60 	undef $/;
     61 	# my $t_input = <TEST>;
     62 	my $t_result = <RESULT>;
     63 
     64 	my $t_output = `'$script' '$testfile'`;
     65 
     66 	# Normalize the output and expected result strings:
     67 	$t_result =~ s/\s+\z//; # trim trailing whitespace
     68 	$t_output =~ s/\s+\z//; # trim trailing whitespace
     69 	if ($use_tidy) {
     70 		#  Escape the strings, pass them through to CLI tidy tool for tag-level equivalency
     71 		$t_result =~ s{'}{'\\''}g; # escape ' chars for shell
     72 		$t_output =~ s{'}{'\\''}g;
     73 		$t_result = `echo '$t_result' | tidy -quiet --show-warnings n`;
     74 		$t_output = `echo '$t_output' | tidy -quiet --show-warnings n`;
     75 	}
     76 
     77 	if ($t_output eq $t_result) {
     78 		print "OK\n";
     79 		$tests_passed++;
     80 	}
     81 	else {
     82 		print "FAILED\n\n";
     83 		$tests_failed++;
     84 	}
     85 }
     86 
     87 print "\n\n";
     88 print "$tests_passed passed; $tests_failed failed.\n";
     89 
     90 my $time_end = new Benchmark;
     91 my $time_diff = timediff($time_end, $time_start);
     92 print "Benchmark: ", timestr($time_diff), "\n";
     93 
     94 
     95 __END__
     96 
     97 =pod
     98 
     99 =head1 NAME
    100 
    101 B<MarkdownTest>
    102 
    103 
    104 =head1 SYNOPSIS
    105 
    106 B<MarkdownTest.pl> [ B<--options> ]  [ I<file> ... ]
    107 
    108 
    109 =head1 DESCRIPTION
    110 
    111 
    112 =head1 OPTIONS
    113 
    114 Use "--" to end switch parsing. For example, to open a file named "-z", use:
    115 
    116 	MarkdownTest.pl -- -z
    117 
    118 =over 4
    119 
    120 =item B<--script>
    121 
    122 Specify the path to the Markdown script to test. Defaults to
    123 "./Markdown.pl". Example:
    124 
    125 	./MarkdownTest.pl --script ./PHP-Markdown/php-markdown
    126 
    127 =item B<--testdir>
    128 
    129 Specify the path to a directory containing test data. Defaults to "Tests".
    130 
    131 =item B<--tidy>
    132 
    133 Flag to turn on using the command line 'tidy' tool to normalize HTML
    134 output before comparing script output to the expected test result.
    135 Assumes that the 'tidy' command is available in your PATH. Defaults to
    136 off.
    137 
    138 =back
    139 
    140 
    141 
    142 =head1 BUGS
    143 
    144 
    145 
    146 =head1 VERSION HISTORY
    147 
    148 1.0	Mon 13 Dec 2004-2005
    149 
    150 1.0.1 Mon 19 Sep 2005
    151 
    152 	+	Better handling of case when foo.text exists, but foo.html doesn't.
    153 		It now prints a message and moves on, rather than dying.
    154 
    155 
    156 =head1 COPYRIGHT AND LICENSE
    157 
    158 Copyright (c) 2004-2005 John Gruber  
    159 <http://daringfireball.net/>   
    160 All rights reserved.
    161 
    162 This is free software; you may redistribute it and/or modify it under
    163 the same terms as Perl itself.
    164 
    165 =cut
    166