]> eyrie.org Git - kerberos/krb5-strength.git/blob - tests/heimdal/pod-spelling-t
772903c286b0afb392e9063737ba3801cf352738
[kerberos/krb5-strength.git] / tests / heimdal / pod-spelling-t
1 #!/usr/bin/perl
2 #
3 # Check for spelling errors in POD documentation
4 #
5 # Checks all POD files in the tree for spelling problems using Pod::Spell and
6 # either aspell or ispell.  aspell is preferred.  This test is disabled unless
7 # RRA_MAINTAINER_TESTS is set, since spelling dictionaries vary too much
8 # between environments.
9 #
10 # Copyright 2008, 2009 Russ Allbery <rra@stanford.edu>
11 #
12 # See LICENSE for licensing terms.
13
14 use strict;
15 use Test::More;
16
17 # Skip all spelling tests unless the maintainer environment variable is set.
18 plan skip_all => 'Spelling tests only run for maintainer'
19     unless $ENV{RRA_MAINTAINER_TESTS};
20
21 # Load required Perl modules.
22 eval 'use Test::Pod 1.00';
23 plan skip_all => 'Test::Pod 1.00 required for testing POD' if $@;
24 eval 'use Pod::Spell';
25 plan skip_all => 'Pod::Spell required to test POD spelling' if $@;
26
27 # Locate a spell-checker.  hunspell is not currently supported due to its lack
28 # of support for contractions (at least in the version in Debian).
29 my @spell;
30 my %options = (aspell => [ qw(-d en_US --home-dir=./ list) ],
31                ispell => [ qw(-d american -l -p /dev/null) ]);
32 SEARCH: for my $program (qw/aspell ispell/) {
33     for my $dir (split ':', $ENV{PATH}) {
34         if (-x "$dir/$program") {
35             @spell = ("$dir/$program", @{ $options{$program} });
36         }
37         last SEARCH if @spell;
38     }
39 }
40 plan skip_all => 'aspell or ispell required to test POD spelling'
41     unless @spell;
42
43 # Prerequisites are satisfied, so we're going to do some testing.  Figure out
44 # what POD files we have and from that develop our plan.
45 $| = 1;
46 my @pod = map { s,[^/.][^/]*/../,,g; $_ }
47     ("$ENV{SOURCE}/../external/heimdal-strength.pod");
48 plan tests => scalar @pod;
49
50 # Finally, do the checks.
51 for my $pod (@pod) {
52     my $child = open (CHILD, '-|');
53     if (not defined $child) {
54         die "Cannot fork: $!\n";
55     } elsif ($child == 0) {
56         my $pid = open (SPELL, '|-', @spell) or die "Cannot run @spell: $!\n";
57         open (POD, '<', $pod) or die "Cannot open $pod: $!\n";
58         my $parser = Pod::Spell->new;
59         $parser->parse_from_filehandle (\*POD, \*SPELL);
60         close POD;
61         close SPELL;
62         exit ($? >> 8);
63     } else {
64         my @words = <CHILD>;
65         close CHILD;
66       SKIP: {
67             skip "@spell failed for $pod", 1 unless $? == 0;
68             for (@words) {
69                 s/^\s+//;
70                 s/\s+$//;
71             }
72             is ("@words", '', $pod);
73         }
74     }
75 }