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::Coord::ECI::TLE;
use Time::Local;

BEGIN {

    eval {
	require Test::More;
	Test::More->VERSION( 0.88 );	# Because of done_testing()
	Test::More->import();
	1;
    } or do {
	print "1..0 # skip Test::More 0.88 required\n";
	exit;
    };
}

my ($near, $deep) = Astro::Coord::ECI::TLE->parse(<<eod);
1 88888U          80275.98708465  .00073094  13844-3  66816-4 0    8
2 88888  72.8435 115.9689 0086731  52.6988 110.5714 16.05824518  105
1 11801U          80230.29629788  .01431103  00000-0  14311-1
2 11801  46.7916 230.4354 7318036  47.4722  10.4117  2.28537848
eod

my $time = 61196688000	# 01-Apr-3909 00:00:00 GMT, epoch 1-Jan-1970.
    + timegm( 0, 0, 0, 1, 0, 70 );	# Adjust for system epoch.

plan(tests => 14);

my $want;

# SGP

$near->set(model => 'sgp');
$want = qr{effective eccentricity > 1};

fails( $near, universal => $time, $want,
    'SGP model failure' );

fails( $near, universal => $time, $want,
    'SGP should give same failure on retry' );

# SGP4

$near->set(model => 'sgp4');

fails( $near, universal => $time, $want,
    'SGP4 model failure' );

fails( $near, universal => $time, $want,
    'SGP4 should give same failure on retry' );

# SDP4

$deep->set(model => 'sdp4');

fails( $deep, universal => $time, $want,
    'SDP4 model failure' );

fails( $deep, universal => $time, $want,
    'SDP4 should give same failure on retry' );

# SGP8

$near->set(model => 'sgp8');

fails( $near, universal => $time, $want,
    'SGP8 model failure' );

fails( $near, universal => $time, $want,
    'SGP8 should give same failure on retry' );

# SDP8

$deep->set(model => 'sdp8');

fails( $deep, universal => $time, $want,
    'SDP8 model failure' );

fails( $deep, universal => $time, $want,
    'SDP8 should give same failure on retry' );

# SGP4R

$near->set(model => 'sgp4r');
$deep->set(model => 'sgp4r');
$want = qr{Mean eccentricity < 0 or > 1};

fails( $near, universal => $time, $want,
    'SGP4R model failure (near-Earth)' );

fails( $near, universal => $time, $want,
    'SGP4R should give same failure on retry (near-Earth)' );

fails( $deep, universal => $time, $want,
    'SGP4R model failure (deep-space).');

fails( $deep, universal => $time, $want,
    'SGP4R should give same failure on retry (deep-space)' );

sub fails {	## no critic (RequireArgUnpacking)
    my ( $obj, $method, @args ) = @_;
    my $name = pop @args;
    my $want = pop @args;
    if ( eval { $obj->$method( @args ); 1 } ) {
	@_ = ( "$name failed to throw error" );
	goto &fail;
    } else {
	@_ = ( $@, $want, $name );
	goto &like;
    }
}

1;