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 10use strict; 11use warnings; 12use Getopt::Long; 13use Benchmark; 14 15our $VERSION = '1.0.2'; 16# Sat 24 Dec 2005 17 18my $time_start = new Benchmark; 19my $test_dir = "Tests"; 20my $script = "./Markdown.pl"; 21my $use_tidy = 0; 22my ($flag_version); 23 24GetOptions ( 25 "script=s" => \$script, 26 "testdir=s" => \$test_dir, 27 "tidy" => \$use_tidy, 28 "version" => \$flag_version, 29 ); 30 31if($flag_version) { 32 my $progname = $0; 33 $progname =~ s{.*/}{}; 34 die "$progname version $VERSION\n"; 35} 36 37unless (-d $test_dir) { die "'$test_dir' is not a directory.\n"; } 38unless (-f $script) { die "$script does not exist.\n"; } 39unless (-x $script) { die "$script is not executable.\n"; } 40 41my $tests_passed = 0; 42my $tests_failed = 0; 43 44TEST: 45foreach 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 87print "\n\n"; 88print "$tests_passed passed; $tests_failed failed.\n"; 89 90my $time_end = new Benchmark; 91my $time_diff = timediff($time_end, $time_start); 92print "Benchmark: ", timestr($time_diff), "\n"; 93 94 95__END__ 96 97=pod 98 99=head1 NAME 100 101B<MarkdownTest> 102 103 104=head1 SYNOPSIS 105 106B<MarkdownTest.pl> [ B<--options> ] [ I<file> ... ] 107 108 109=head1 DESCRIPTION 110 111 112=head1 OPTIONS 113 114Use "--" 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 122Specify 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 129Specify the path to a directory containing test data. Defaults to "Tests". 130 131=item B<--tidy> 132 133Flag to turn on using the command line 'tidy' tool to normalize HTML 134output before comparing script output to the expected test result. 135Assumes that the 'tidy' command is available in your PATH. Defaults to 136off. 137 138=back 139 140 141 142=head1 BUGS 143 144 145 146=head1 VERSION HISTORY 147 1481.0 Mon 13 Dec 2004-2005 149 1501.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 158Copyright (c) 2004-2005 John Gruber 159<http://daringfireball.net/> 160All rights reserved. 161 162This is free software; you may redistribute it and/or modify it under 163the same terms as Perl itself. 164 165=cut 166