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