1package main; 2 3use strict; 4use warnings; 5 6use Test::More 0.88; 7 8delete $ENV{TZ}; 9 10my @copier_methods = 11 qw{ attribute_names clone copy create_attribute_methods init warner }; 12 13my @format_methods = ( @copier_methods, qw{ 14 config date_format desired_equinox_dynamical decode format gmt 15 local_coord provider time_format time_formatter tz 16} ); 17 18my @format_time_methods = ( @copier_methods, 19 qw{ new format_datetime format_datetime_width gmt tz } ); 20 21my @geocode_methods = ( @copier_methods, 22 qw{ geocode geocoder } ); 23 24my @parse_time_methods = ( @copier_methods, 25 qw{ new base config delegate decode parse parse_time_absolute reset 26 tz use_perltime } ); 27 28defined $ENV{TZ} 29 and diag "\$ENV{TZ} is '$ENV{TZ}'"; 30 31require_ok 'Astro::App::Satpass2::Utils' 32 or BAIL_OUT; 33 34{ 35 can_ok 'Astro::App::Satpass2::Utils', qw{ __parse_class_and_args } 36 or BAIL_OUT; 37 38 my $code = Astro::App::Satpass2::Utils->can( 39 '__parse_class_and_args' ); 40 41 is_deeply [ $code->( undef, 'Fubar' ) ], [ 'Fubar' ], 42 q<__parse_class_and_args( 'Fubar' )>; 43 44 is_deeply [ $code->( undef, 'Fu::Bar,baz=burfle' ) ], 45 [ qw{ Fu::Bar baz burfle } ], 46 q<__parse_class_and_args( 'Fu::Bar,baz=burfle' )>; 47 48 is_deeply [ $code->( undef, 'Fu::Bar,baz=burfle=buzz' ) ], 49 [ qw{ Fu::Bar baz burfle=buzz } ], 50 q<__parse_class_and_args( 'Fu::Bar,baz=burfle=buzz' )>; 51 52 { 53 no warnings qw{ qw }; 54 55 is_deeply [ $code->( undef, 'Fu::Bar,baz=bur\\,fle' ) ], 56 [ qw{ Fu::Bar baz bur,fle } ], 57 q<__parse_class_and_args( 'Fu::Bar,baz=bur\\,fle' )>; 58 59 is_deeply [ $code->( undef, 'Fu::Bar,baz="bur,fle"' ) ], 60 [ qw{ Fu::Bar baz bur,fle } ], 61 q<__parse_class_and_args( 'Fu::Bar,baz="bur,fle"' )>; 62 } 63 64} 65 66require_ok 'Astro::App::Satpass2::Locale' 67 or BAIL_OUT; 68 69require_ok 'Astro::App::Satpass2::Locale::C' 70 or BAIL_OUT; 71 72require_ok 'Astro::App::Satpass2::Warner' 73 or BAIL_OUT; 74 75can_ok 'Astro::App::Satpass2::Warner', 76 qw{ new wail warning weep whinge } 77 or BAIL_OUT; 78 79require_ok 'Astro::App::Satpass2::Copier' 80 or BAIL_OUT; 81 82can_ok 'Astro::App::Satpass2::Copier', @copier_methods 83 or BAIL_OUT; 84 85require_ok 'Astro::App::Satpass2::Macro' 86 or BAIL_OUT; 87 88require_ok 'Astro::App::Satpass2::Macro::Command' 89 or BAIL_OUT; 90 91isa_ok 'Astro::App::Satpass2::Macro::Command', 92 'Astro::App::Satpass2::Macro'; 93 94require_ok 'Astro::App::Satpass2::Macro::Code' 95 or BAIL_OUT; 96 97isa_ok 'Astro::App::Satpass2::Macro::Code', 98 'Astro::App::Satpass2::Macro' 99 or BAIL_OUT; 100 101require_ok 'Astro::App::Satpass2::FormatTime' 102 or BAIL_OUT; 103 104isa_ok 'Astro::App::Satpass2::FormatTime', 'Astro::App::Satpass2::Copier' 105 or BAIL_OUT; 106 107can_ok 'Astro::App::Satpass2::FormatTime', @format_time_methods 108 or BAIL_OUT; 109 110require_ok 'Astro::App::Satpass2::FormatTime::POSIX::Strftime' 111 or BAIL_OUT; 112 113 114isa_ok 'Astro::App::Satpass2::FormatTime::POSIX::Strftime', 115 'Astro::App::Satpass2::FormatTime' 116 or BAIL_OUT; 117 118can_ok 'Astro::App::Satpass2::FormatTime::POSIX::Strftime', 119 @format_time_methods 120 or BAIL_OUT; 121 122instantiate( 'Astro::App::Satpass2::FormatTime::POSIX::Strftime' ) 123 or BAIL_OUT; 124 125SKIP: { 126 127 my $tests = 11; 128 129 eval { 130 require DateTime; 131 require DateTime::TimeZone; 132 1; 133 } or skip 'DateTime and/or DateTime::TimeZone not available', $tests; 134 135 require_ok 'Astro::App::Satpass2::FormatTime::DateTime' 136 or BAIL_OUT; 137 138 isa_ok 'Astro::App::Satpass2::FormatTime::DateTime', 139 'Astro::App::Satpass2::FormatTime' 140 or BAIL_OUT; 141 142 can_ok 'Astro::App::Satpass2::FormatTime::DateTime', 143 @format_time_methods 144 or BAIL_OUT; 145 146 require_ok 'Astro::App::Satpass2::FormatTime::DateTime::Strftime' 147 or BAIL_OUT; 148 149 isa_ok 'Astro::App::Satpass2::FormatTime::DateTime::Strftime', 150 'Astro::App::Satpass2::FormatTime::DateTime' 151 or BAIL_OUT; 152 153 can_ok 'Astro::App::Satpass2::FormatTime::DateTime::Strftime', 154 @format_time_methods 155 or BAIL_OUT; 156 157 instantiate( 'Astro::App::Satpass2::FormatTime::DateTime::Strftime' ) 158 or BAIL_OUT; 159 160 require_ok 'Astro::App::Satpass2::FormatTime::DateTime::Cldr' 161 or BAIL_OUT; 162 163 isa_ok 'Astro::App::Satpass2::FormatTime::DateTime::Cldr', 164 'Astro::App::Satpass2::FormatTime::DateTime' 165 or BAIL_OUT; 166 167 can_ok 'Astro::App::Satpass2::FormatTime::DateTime::Cldr', 168 @format_time_methods 169 or BAIL_OUT; 170 171 instantiate( 'Astro::App::Satpass2::FormatTime::DateTime::Cldr' ) 172 or BAIL_OUT; 173 174} 175 176instantiate( 'Astro::App::Satpass2::FormatTime' ) 177 or BAIL_OUT; 178 179require_ok 'Astro::App::Satpass2::FormatValue' 180 or BAIL_OUT; 181 182can_ok 'Astro::App::Satpass2::FormatValue', qw{ 183 almanac altitude angle apoapsis apogee appulse argument_of_perigee 184 ascending_node azimuth b_star_drag bodies body center classification 185 clone date declination deg2rad earth eccentricity effective_date 186 element_number elevation embodies ephemeris_type epoch event 187 events first_derivative fixed_width floor fraction_lit has_method 188 illumination inclination inertial instance international 189 is_valid_title_gravity julianday latitude local_coord longitude 190 magnitude maidenhead max mean_anomaly mean_motion min mma 191 more_title_lines name new oid operational periapsis perigee 192 period phase rad2deg range reflections reftype reset_title_lines 193 revolutions_at_epoch right_ascension second_derivative semimajor 194 semiminor station status time title_gravity tle type 195} 196 or BAIL_OUT; 197 198instantiate( 'Astro::App::Satpass2::FormatValue' ) 199 or BAIL_OUT; 200 201require_ok 'Astro::App::Satpass2::Format' 202 or BAIL_OUT; 203 204isa_ok 'Astro::App::Satpass2::Format', 'Astro::App::Satpass2::Copier' 205 or BAIL_OUT; 206 207can_ok 'Astro::App::Satpass2::Format', @format_methods 208 or BAIL_OUT; 209 210require_ok 'Astro::App::Satpass2::Format::Dump' 211 or BAIL_OUT; 212 213isa_ok 'Astro::App::Satpass2::Format::Dump', 'Astro::App::Satpass2::Format' 214 or BAIL_OUT; 215 216instantiate( 'Astro::App::Satpass2::Format::Dump' ) 217 or BAIL_OUT; 218 219can_ok 'Astro::App::Satpass2::Format::Dump', @format_methods 220 or BAIL_OUT; 221 222require_ok 'Astro::App::Satpass2::Wrap::Array' 223 or BAIL_OUT; 224 225can_ok 'Astro::App::Satpass2::Wrap::Array', qw{ new dereference }; 226 227instantiate( 'Astro::App::Satpass2::Wrap::Array', [], 228 'Astro::App::Satpass2::Wrap::Array' ) 229 or BAIL_OUT; 230 231require_ok 'Astro::App::Satpass2::Format::Template' 232 or BAIL_OUT; 233 234isa_ok 'Astro::App::Satpass2::Format::Template', 235 'Astro::App::Satpass2::Format' 236 or BAIL_OUT; 237 238can_ok 'Astro::App::Satpass2::Format', @format_methods 239 or BAIL_OUT; 240 241instantiate( 'Astro::App::Satpass2::Format::Template' ) 242 or BAIL_OUT; 243 244require_ok 'Astro::App::Satpass2::ParseTime' 245 or BAIL_OUT; 246 247isa_ok 'Astro::App::Satpass2::ParseTime', 'Astro::App::Satpass2::Copier' 248 or BAIL_OUT; 249 250can_ok 'Astro::App::Satpass2::ParseTime', @parse_time_methods 251 or BAIL_OUT; 252 253require_ok 'Astro::App::Satpass2::ParseTime::Code' 254 or BAIL_OUT; 255 256isa_ok 'Astro::App::Satpass2::ParseTime::Code', 257 'Astro::App::Satpass2::ParseTime' 258 or BAIL_OUT; 259 260can_ok 'Astro::App::Satpass2::ParseTime::Code', 261 @parse_time_methods 262 or BAIL_OUT; 263 264is eval { Astro::App::Satpass2::ParseTime::Code->delegate() }, ## no critic (RequireCheckingReturnValueOfEval) 265 'Astro::App::Satpass2::ParseTime::Code', 266 'Code delegate is Astro::App::Satpass2::ParseTime::Code'; 267 268require_ok 'Astro::App::Satpass2::ParseTime::Date::Manip' 269 or BAIL_OUT; 270 271can_ok 'Astro::App::Satpass2::ParseTime::Date::Manip', @parse_time_methods 272 or BAIL_OUT; 273 274my $date_manip_delegate = Astro::App::Satpass2::Utils::__date_manip_backend(); 275defined $date_manip_delegate 276 and $date_manip_delegate = 277 "Astro::App::Satpass2::ParseTime::Date::Manip::v$date_manip_delegate"; 278 279is eval { Astro::App::Satpass2::ParseTime::Date::Manip->delegate() }, ## no critic (RequireCheckingReturnValueOfEval) 280 $date_manip_delegate, 281 'Date::Manip delegate is ' . ( 282 defined $date_manip_delegate ? $date_manip_delegate : 'undef' ) 283; 284 285require_ok 'Astro::App::Satpass2::ParseTime::Date::Manip::v5' 286 or BAIL_OUT; 287 288isa_ok 'Astro::App::Satpass2::ParseTime::Date::Manip::v5', 289 'Astro::App::Satpass2::ParseTime' 290 or BAIL_OUT; 291 292can_ok 'Astro::App::Satpass2::ParseTime::Date::Manip::v5', 293 @parse_time_methods 294 or BAIL_OUT; 295 296require_ok 'Astro::App::Satpass2::ParseTime::Date::Manip::v6' 297 or BAIL_OUT; 298 299isa_ok 'Astro::App::Satpass2::ParseTime::Date::Manip::v6', 300 'Astro::App::Satpass2::ParseTime' 301 or BAIL_OUT; 302 303can_ok 'Astro::App::Satpass2::ParseTime::Date::Manip::v6', 304 @parse_time_methods 305 or BAIL_OUT; 306 307require_ok 'Astro::App::Satpass2::ParseTime::ISO8601' 308 or BAIL_OUT; 309 310isa_ok 'Astro::App::Satpass2::ParseTime::ISO8601', 311 'Astro::App::Satpass2::ParseTime' 312 or BAIL_OUT; 313 314can_ok 'Astro::App::Satpass2::ParseTime::ISO8601', 315 @parse_time_methods 316 or BAIL_OUT; 317 318is eval { Astro::App::Satpass2::ParseTime::ISO8601->delegate() }, ## no critic (RequireCheckingReturnValueOfEval) 319 'Astro::App::Satpass2::ParseTime::ISO8601', 320 'ISO8601 delegate is Astro::App::Satpass2::ParseTime::ISO8601'; 321 322SKIP: { 323 324 my $tests = 1; 325 326 $date_manip_delegate 327 or skip 'Unable to load Date::Manip', $tests; 328 329 instantiate( 'Astro::App::Satpass2::ParseTime', 330 class => 'Astro::App::Satpass2::ParseTime::Date::Manip', 331 $date_manip_delegate ) 332 or BAIL_OUT; 333} 334 335instantiate( 'Astro::App::Satpass2::ParseTime', 336 class => 'Astro::App::Satpass2::ParseTime::ISO8601', 337 'Astro::App::Satpass2::ParseTime::ISO8601' ) 338 or BAIL_OUT; 339 340{ 341 342 my $want_class = $date_manip_delegate || 343 'Astro::App::Satpass2::ParseTime::ISO8601'; 344 345 instantiate( 'Astro::App::Satpass2::ParseTime', $want_class ) 346 or BAIL_OUT; 347 348 instantiate( 'Astro::App::Satpass2::ParseTime', 349 class => 'Astro::App::Satpass2::ParseTime::Date::Manip, 350 Astro::App::Satpass2::ParseTime::ISO8601', 351 $want_class ) 352 or BAIL_OUT; 353 354 instantiate( 'Astro::App::Satpass2::ParseTime', 355 class => 'Date::Manip,ISO8601', 356 $want_class ) 357 or BAIL_OUT; 358 359 instantiate( 'Astro::App::Satpass2::ParseTime', 360 class => 'ISO8601,Date::Manip', 361 'Astro::App::Satpass2::ParseTime::ISO8601' ) 362 or BAIL_OUT; 363 364} 365 366require_ok 'Astro::App::Satpass2::Geocode' 367 or BAIL_OUT; 368 369can_ok 'Astro::App::Satpass2::Geocode', @geocode_methods 370 or BAIL_OUT; 371 372SKIP: { 373 my $tests = 3; 374 375 eval { 376 require Geo::Coder::OSM; 377 1; 378 } or skip 'Unable to load Geo::Coder::OSM', $tests; 379 380 require_ok 'Astro::App::Satpass2::Geocode::OSM' 381 or BAIL_OUT; 382 383 can_ok 'Astro::App::Satpass2::Geocode::OSM', @geocode_methods 384 or BAIL_OUT; 385 386 instantiate( 'Astro::App::Satpass2::Geocode::OSM' ) 387 or BAIL_OUT; 388} 389 390require_ok 'Astro::App::Satpass2' 391 or BAIL_OUT; 392 393can_ok 'Astro::App::Satpass2', qw{ 394 new alias almanac begin cd choose clear dispatch drop dump echo end 395 execute exit export flare formatter geocode geodetic get height help 396 init initfile list load localize location macro pass phase position 397 pwd quarters run save set show sky source spacetrack st status 398 system time time_parser tle unexport validate version 399} 400 or BAIL_OUT; 401 402instantiate( 'Astro::App::Satpass2' ) 403 or BAIL_OUT; 404 405done_testing; 406 407sub instantiate { 408 my ( $class, @args ) = @_; 409 my $want = @args ? pop @args : $class; 410 if ( my $obj = eval { $class->new( @args ) } ) { 411 @_ = ( $obj, $want ); 412 goto &isa_ok; 413 } else { 414 @_ = ( "Can't instantiate $class: $@" ); 415 goto &fail; 416 } 417} 418 4191; 420 421# ex: set textwidth=72 : 422