The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package main;

use strict;
use warnings;

use Astro::SpaceTrack;
use HTML::Parser;
use LWP::UserAgent;
use Test::More 0.96;	# Because of subtest()

$ENV{SPACETRACK_USER}
    or plan skip_all => 'Environment variable SPACETRACK_USER not defined';

my $st = Astro::SpaceTrack->new (
    space_track_version	=> 1,	# v2 does not support this. Yet.
);
my $rslt = $st->_get ('perl/bulk_files.pl');
$rslt->is_success()
    or plan skip_all => 'Space Track inaccessable: ' . $rslt->status_line();

my %got = parse_string ($rslt->content);

my %expect;
{
    my $rslt = $st->names ('spacetrack');
    foreach (split '\n', $rslt->content ()) {
	my ($code, $name) = split '\s*:\s*', $_, 2;
	$code =~ s/\s+\((\d+)\)$//;
	my $number = $1;
	$expect{$code} = {
	    number => $number,
	    name => $name,
	    todo => 0,
	};
    }
}

$expect{satellite_situation_report} = {
    name => 'Satellite Situation Report',
    number => 25,
    note => 'Not fetchable via Astro::SpaceTrack',
    todo => 0,
    ignore => 1,	# What it says. Trumps todo.
    silent => 1,	# Ignore silently.
};

=begin comment

$expect{'1999-025'} = {
    name => 'Fengyun 1C Debris',
    note => 'Not actually provided as a fetchable data set.',
    todo => 0,
};
if ($expect{sts}) {
    $expect{sts}{note} = 'Only available when a mission is in progress.';
    $expect{sts}{todo} = 1;
    $expect{sts}{ignore} = 1;	# What it says. Trumps todo.
}

=end comment

=cut

foreach my $key (sort keys %expect) {
    my $number = $expect{$key}{number};
    if ( $expect{$key}{ignore} ) {
	if ( $expect{$key}{silent} ) {
	    delete $got{$number};
	} else {
	    my $info = $got{$number} || $expect{$key};
	    note "\nIgnored - $key ($info->{name})";
	    $expect{$key}{note}
		and note "    $expect{$key}{note}";
	    note '    ' . ( delete $got{$number} ? 'present' : 'not present' );
	}
    } else {
	ok delete $got{$number}, "$key ($expect{$key}{name})";
	$expect{$key}{note}
	    and note "    $expect{$key}{note}";
	if ( $number++ ) {
	    ok delete $got{$number}, "$key ($expect{$key}{name}) with names";
	}
    }
}

done_testing;

sub parse_string {
    my $string = shift;
    my $psr = HTML::Parser->new (api_version => 3);
    $psr->case_sensitive (0);
    my %data;
    my $collect;
    $psr->handler (start => sub {
	    if ($_[1] eq 'a' && $_[2]{href} &&
		$_[2]{href} =~ m/dl\.pl\?ID=(\d+)$/ && $1 < 100) {
##		$data{$_[2]{href}} = $collect = {
		$data{$1} = $collect = {
		    name => undef,
		};
	    }
	}, 'self,tagname,attr');
    $psr->handler (text => sub {
	    if ($collect) {
		if (defined $collect->{name}) {
		    $collect->{name} .= ' ' . $_[1];
		} else {
		    $collect->{name} = $_[1];
		}
	    }
	}, 'self,text');
    $psr->handler (end => sub {
	    $_[1] eq 'a' and $collect = undef;
	}, 'self,tagname');
    $psr->parse ($string);
    return %data;
}

1;

# ex: set textwidth=72 :