websites need tests, too
[gitmo/moose-website.git] / t / 02-spelling.t
1 #!perl
2 use 5.010;
3 use utf8;
4 use strict;
5 use warnings FATAL => 'all';
6 use autodie qw(:all);
7 use Capture::Tiny qw(capture);
8 use Encode qw(decode_utf8);
9 use File::Next qw();
10 use File::Temp qw(tempfile);
11 use File::Which qw(which);
12 use Test::More;
13 use XML::LibXML qw();
14 use XML::LibXSLT qw();
15
16 binmode Test::More->builder->$_, ':encoding(UTF-8)'
17     for qw(output failure_output todo_output);
18
19 # Skip means sweep bugs under the rug.
20 # I want this test to be actually run.
21 BAIL_OUT 'aspell is not installed.' unless which 'aspell';
22
23 my @stopwords;
24 for (<DATA>) {
25     chomp;
26     push @stopwords, $_ unless /\A (?: \# | \s* \z)/msx;    # skip comments, whitespace
27 }
28
29 my $destdir;
30 {
31     my $runtime_params_file = '_build/runtime_params';
32     my $runtime_params      = do $runtime_params_file;
33     die "Could not load $runtime_params_file. Run Build.PL first.\n"
34       unless $runtime_params;
35     $destdir = $runtime_params->{destdir};
36 }
37
38 my $iter = File::Next::files({
39         file_filter => sub {/\.html \z/msx},
40         sort_files  => 1,
41     },
42     $destdir
43 );
44
45 my $file_counter;
46
47 my $stylesheet = XML::LibXSLT->new->parse_stylesheet(
48     XML::LibXML->load_xml(string => <<''));
49 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
50     xmlns:xhtml="http://www.w3.org/1999/xhtml" version="1.0">
51     <xsl:template match="@* | node()"> <!-- apply identity function to rest of nodes -->
52         <xsl:copy>
53             <xsl:apply-templates select="@* | node()"/>
54         </xsl:copy>
55     </xsl:template>
56 </xsl:stylesheet>
57
58 while (defined(my $html_file = $iter->())) {
59     $file_counter++;
60
61     my ($temp_handle, $temp_file) = tempfile;
62     my $transformed = $stylesheet->transform(XML::LibXML->load_xml(location => $html_file, load_ext_dtd => 0,));
63     $stylesheet->output_fh($transformed, $temp_handle);
64
65     my ($stdout) = capture {
66         system "aspell -H --encoding=UTF-8 -l en list < $temp_file";
67     };
68     my @misspelt_words = grep {!($_ ~~ @stopwords)} split /\n/, decode_utf8 $stdout;
69     ok !@misspelt_words, "$html_file ($temp_file) spell-check";
70     diag join "\n", sort @misspelt_words if @misspelt_words;
71 }
72
73 done_testing($file_counter);
74
75 __DATA__
76 ## personal names
77
78 ## proper names
79
80 ## Moose-specific
81
82 ## computerese
83
84 ## other jargon
85
86 ## neologisms
87
88 ## compound
89
90 ## slang
91
92 ## things that should be in the dictionary, but are not
93
94 ## single foreign words
95
96 ## misspelt on purpose