fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / codingstd / c_function_docs.t
blob38ea23776dcaa8882f5b6aea0c2e010129564007
1 #! perl
2 # Copyright (C) 2006-2010, Parrot Foundation.
3 # $Id$
5 use strict;
6 use warnings;
8 use lib qw( . lib ../lib ../../lib );
9 use Test::More;
10 use Parrot::Config qw(%PConfig);
11 use Parrot::Distribution;
12 use Parrot::Headerizer;
14 =head1 NAME
16 t/codingstd/c_function_docs.t - checks for missing function documentation
18 =head1 SYNOPSIS
20     # test all files
21     % prove t/codingstd/c_function_docs.t
23     # test specific files
24     % perl t/codingstd/c_function_docs.t src/foo.c include/parrot/bar.h
26 =head1 DESCRIPTION
28 Checks that all C language source files have documentation for each function
29 declared.
31 =cut
33 my $DIST = Parrot::Distribution->new;
34 my $headerizer = Parrot::Headerizer->new;
36 # can not handle .ops or .pmc files yet
37 my @files = grep {/\.(c|h)$/ } @ARGV ? @ARGV :
38     map {s/^$PConfig{build_dir}\///; $_} map {s/\\/\//g; $_} map {$_->path} $DIST->get_c_language_files();
40 plan tests => scalar @files;
42 my %todos;
43 while (<DATA>) {
44     next if /^#/;
45     next if /^\s*$/;
46     chomp;
47     $todos{$_} = 1;
50 foreach my $path (@files) {
52     my $buf = $DIST->slurp($path);
53     my @missing_docs;
55     my @function_decls = $headerizer->extract_function_declarations($buf);
57     for my $function_decl (@function_decls) {
59         my $escaped_decl = $headerizer->generate_documentation_signature($function_decl);
61         my $missing = '';
62         if ( $buf =~ m/^\Q$escaped_decl\E$(.*?)^=cut/sm ) {
63             my $docs = $1;
64             $docs =~ s/\s//g;
65             if ($docs eq '') {
66                 $missing = 'boilerplate only';
67             }
68             # else:  docs!
69         }
70         else {
71             $missing = 'missing';
72         }
73         if ($missing) {
74             if ($missing eq 'boilerplate only') {
75                 push @missing_docs, "$path ($missing)\nIn:\n$escaped_decl\n";
76             }
77             else {
78                 push @missing_docs, "$path ($missing)\n$function_decl\nWant:\n$escaped_decl\n";
79             }
80         }
81     }
83     TODO: {
84         local $TODO = 'Missing function docs' if $todos{$path};
86     ok ( ! @missing_docs, $path)
87         or diag( @missing_docs
88             . " function(s) lacking documentation:\n"
89             . join ("\n", @missing_docs, "\n"));
90     }
93 __DATA__
95 # Local Variables:
96 #   mode: cperl
97 #   cperl-indent-level: 4
98 #   fill-column: 100
99 # End:
100 # vim: expandtab shiftwidth=4: