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