The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use Test::More;
use FindBin qw($Bin);

plan skip_all => 'Not yet working';

my $lib = "$Bin/../lib";
my $docs = "$Bin/../doc/";

opendir(my $d, $docs) or die;
my @docs = sort grep { /-notes\.txt$/ } readdir($d);
close $d;

my %point;    # key -> { where => , impl => $bool }
my @points;   # keys

foreach my $f (@docs) {
    my $pretty_file = $f;
    if ($f =~ /^rfc(\d+)/) {
        $pretty_file = "rfc$1";
    }

    my ($sec, $subsec, $subsecnum, $lineno);

    open (my $fh, "$docs/$f") or die $!;
    while (my $line = <$fh>) {
        $lineno++;

        # look for section/subsection headings
        if ($line =~ /^\d+\.\s+(.+)/) {
            $sec = $1;
            $subsec = "";
            $subsecnum = 0;
            next;
        }

        if ($line =~ /^(\d+\.\d+)\.\s+(.+)/) {
            $subsec = $2;
            $subsecnum = $1;
            next;
        }

        while ($line =~ s/\{=(.+?)\}//) {
            my $key = $1;
            my $where = "$subsecnum: $sec >> $subsec ($pretty_file, line $lineno)";
            die "Point $key already seen" if $point{$key};
            $point{$key} = { where => $where };
            push @points, $key;
        }
    }
}

chomp(my @pm_files = `find $lib -name '*.pm'`);
foreach my $key (implemented_points_in_files(@pm_files)) {
    $point{$key}->{impl} = 1;
}

foreach my $p (@points) {
    my $pt = $point{$p};
    ok($pt->{impl}, "$p: $pt->{where}");
#    print "Point:  $p  = $pt->{where}, $pt->{impl}\n";
}



sub implemented_points_in_files {
    my (@files) = @_;
    return map { implemented_points_in_file($_) } @files;
}

sub implemented_points_in_file {
    my $f = shift;
    open(my $fh, $f) or die;
    my @seen;
    while (<$fh>) {
        while (s/\{=(.+?)\}//) {
            push @seen, $1;
        }
    }
    return @seen;
}