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 Astro::Coord::ECI::TLE::Iridium;
use Test::More 0.88;	# Because of done_testing().

note <<'EOD';

The following tests check manipulation of the canned statuses
EOD

cmp_ok elements( Astro::Coord::ECI::TLE->status( 'show' ) ), '==', 92,
    'Astro::Coord::ECI::TLE->status() items initially';

Astro::Coord::ECI::TLE->status( 'clear' );
cmp_ok elements( Astro::Coord::ECI::TLE->status( 'show' ) ), '==', 0,
    'Astro::Coord::ECI::TLE->status() items after clear';

Astro::Coord::ECI::TLE->status( add => 22222, iridium => '' );
cmp_ok elements( Astro::Coord::ECI::TLE->status( 'show' ) ), '==', 1,
    'Astro::Coord::ECI::TLE->status() items after adding 22222';

Astro::Coord::ECI::TLE->status( add => 33333, iridium => '?' );

note <<'EOD';

The following tests check the reblessing machinery
EOD

my $tle = Astro::Coord::ECI::TLE->new( id => 11111 );
is ref $tle, 'Astro::Coord::ECI::TLE', 'OID 11111 is a TLE';

ok ! $tle->can_flare(), 'OID 11111 can not flare.';

$tle->rebless( 'iridium' );
is ref $tle, 'Astro::Coord::ECI::TLE::Iridium',
    'OID 11111 can be reblessed to Iridium';

ok $tle->can_flare(), 'Now OID 11111 can flare.';

$tle->rebless();
is ref $tle, 'Astro::Coord::ECI::TLE',
    'By default, OID 11111 reblesses to a TLE';

ok ! $tle->can_flare(), 'Again, OID 11111 can not flare.';

$tle->set( id => 22222 );
is ref $tle, 'Astro::Coord::ECI::TLE::Iridium',
    q{Changing object's OID to 22222 makes it an Iridium};

ok $tle->can_flare(), 'OID 22222 can flare.';

$tle->set( id => 33333 );
is ref $tle, 'Astro::Coord::ECI::TLE::Iridium',
    q{Changing object's OID to 33333 leaves it still an Iridium};

ok ! $tle->can_flare(), 'But OID 33333 can not flare.';

$tle = Astro::Coord::ECI::TLE->new( id => 22222 );
is ref $tle, 'Astro::Coord::ECI::TLE::Iridium',
    'If we instantiate OID 22222 directly, we get an Iridium';

$tle = Astro::Coord::ECI::TLE->new( reblessable => 0, id => 22222 );
is ref $tle, 'Astro::Coord::ECI::TLE',
    'But if we turn off reblessing, OID 22222 is a plain TLE';

$tle->set( reblessable => 1 );
is ref $tle, 'Astro::Coord::ECI::TLE::Iridium',
    'If we turn reblessing back on, OID 22222 becomes an Iridium';

$tle->rebless( 'tle' );
is ref $tle, 'Astro::Coord::ECI::TLE',
    'But we can still rebless OID 22222 to a plain TLE';

$tle->rebless();
is ref $tle, 'Astro::Coord::ECI::TLE::Iridium',
    'A default rebless makes OID 22222 an Iridium again';

$tle->set( id => 11111 );
is ref $tle, 'Astro::Coord::ECI::TLE',
    'Changing the OID to 11111 makes it a plain TLE';

note <<'EOD';

The following tests check whether various attributes affect the model
EOD

ok ! $tle->is_model_attribute( 'reblessable' ),
    q{'reblessable' is not a model attribute};

ok ! $tle->is_model_attribute( 'horizon' ),
    q{'horizon' is not a model attribute};

ok ! $tle->is_model_attribute( 'status' ),
    q{'status' is not a model attribute};

ok $tle->is_model_attribute( 'bstardrag' ),
    q{'bstardrag' is a model attribute};

ok $tle->is_model_attribute( 'meananomaly' ),
    q{'meananomaly' is a model attribute};

ok ! $tle->is_model_attribute( 'id' ),
    q{'id' is not a model attribute};

ok ! $tle->is_model_attribute( 'name' ),
    q{'name' is not a model attribute};

note <<'EOD';

The following tests check whether various model names are valid
EOD

ok $tle->is_valid_model( 'model' ), q{'model' is a valid model};

ok $tle->is_valid_model( 'null' ), q{'null' is a valid model};

ok $tle->is_valid_model( 'sgp4' ), q{'sgp4' is a valid model};

ok $tle->is_valid_model( 'sdp4' ), q{'sdp4' is a valid model};

ok ! $tle->is_valid_model( 'pdq4' ), q{'pdq4' is not a valid model};

done_testing;

sub elements {
    return scalar @_;
}

1;