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