#!perl
require_ok(
"Astro::FITS::Header"
);
require_ok(
"Astro::FITS::Header::Item"
);
use
overload
'0+'
=>
'fudge'
,
fallback
=> 1;
sub
fudge {
return
$_
[0] }
my
$int_card
= new Astro::FITS::Header::Item(
Keyword
=>
'LIFE'
,
Value
=> 42,
Comment
=>
'Life the Universe and everything'
,
Type
=>
'INT'
);
my
$string_card
= new Astro::FITS::Header::Item(
Keyword
=>
'STUFF'
,
Value
=>
'Blah Blah Blah'
,
Comment
=>
'So long and thanks for all the fish'
,
Type
=>
'STRING'
);
my
$another_card
= new Astro::FITS::Header::Item(
Keyword
=>
'VALUE'
,
Value
=> 34.5678,
Comment
=>
'A floating point number'
,
Type
=>
'FLOAT'
);
my
$x
=
"AA"
;
my
@h1
=
map
{
$x
++; new Astro::FITS::Header::Item(
Keyword
=>
"H1$x"
,
Value
=>
$x
,
Comment
=>
"$x th header"
,
Type
=>
"STRING"
,
)} (0..5);
my
@h2
=
map
{
$x
++; new Astro::FITS::Header::Item(
Keyword
=>
"H2$x"
,
Value
=>
$x
,
Comment
=>
"$x th header"
,
Type
=>
"STRING"
,
)} (0..5);
my
$hdr
= new Astro::FITS::Header(
Cards
=> [
$int_card
,
$string_card
]);
my
$subhdr
= new Astro::FITS::Header(
Cards
=> [
$another_card
]);
print
"# Subhdr: $subhdr\n"
;
my
$subitem
= new Astro::FITS::Header::Item(
Keyword
=>
'EXTEND'
,
Value
=>
$subhdr
,
);
$hdr
->insert(0,
$subitem
);
my
$h1
= new Astro::FITS::Header(
Cards
=> \
@h1
);
my
$h2
= new Astro::FITS::Header(
Cards
=> \
@h2
);
$hdr
->subhdrs(
$h1
,
$h2
);
my
@ret
=
$hdr
->subhdrs;
is(
scalar
(
@ret
), 2,
"Count number of subheaders"
);
my
%header
;
tie
%header
,
ref
(
$hdr
),
$hdr
;
$header
{EXTEND2} =
$subhdr
;
is(
$header
{EXTEND2}{VALUE},34.5678 );
is(
ref
(
$header
{EXTEND}),
"HASH"
);
isa_ok(
$hdr
->value(
"EXTEND"
),
"Astro::FITS::Header"
);
$header
{NEWHASH} = {
A
=> 2,
B
=> 3};
is(
$header
{NEWHASH}->{A}, 2);
is(
$header
{NEWHASH}->{B}, 3);
my
%sub
;
tie
%sub
,
ref
(
$subhdr
),
$subhdr
;
$header
{NEWTIE} = \
%sub
;
my
$newtie
=
$header
{NEWTIE};
my
$tieobj
=
tied
%$newtie
;
isa_ok(
$tieobj
,
"Astro::FITS::Header"
);
my
$tienum
= 0 +
$tieobj
;
my
$hdrnum
= 0 +
$subhdr
;
ok(
$tienum
> 0);
ok(
$hdrnum
> 0);
is(
$tienum
,
$hdrnum
,
"cf memory addresses"
);
printf
"# The tied object is: %s\n"
,0+
$tienum
;
printf
"# The original object is:: %s\n"
,
$hdrnum
;
is(
$header
{NEWTIE}->{VALUE},
$another_card
->value);
my
$void
=
$header
{BLAH}->{XXX};
printf
"# VOID is %s\n"
,
defined
$void
?
$void
:
'(undef)'
;
is(
ref
(
$header
{BLAH}),
'HASH'
);
$header
{BLAH}->{XXX} = 5;
is(
$header
{BLAH}->{XXX}, 5);
ok(
exists
$header
{SUBHEADERS},
"Does the subheader exist?"
);
my
$subh
=
$header
{SUBHEADERS};
is(
ref
(
$subh
),
"ARRAY"
,
"Do we have a tie?"
);
is(
@$subh
, 2,
"Got correct number of array subheaders"
);
is(
$subh
->[1]->{H2AM},
"AM"
,
"array to tied hash"
);
my
$got
;
for
my
$k
(
keys
%header
) {
$got
= 1
if
$k
eq
'SUBHEADERS'
;
}
ok(
$got
,
"SUBHEADERS appeared in foreach"
);
my
$p
=
pop
(
@$subh
);
is(
$p
->{H2AM},
"AM"
,
"pop?"
);
unshift
(
@$subh
,
$p
);
is(
$subh
->[0]->{H2AM},
"AM"
,
"unshift?"
);
my
$s
=
shift
(
@$subh
);
is(
$s
->{H2AM},
"AM"
,
"shift?"
);
push
(
@$subh
,
$s
);
is(
$subh
->[1]->{H2AM},
"AM"
,
"push?"
);
@$subh
= ();
$subh
->[2] =
$header
{BLAH};
is(
$subh
->[2]->{XXX}, 5);
$subh
->[3] = {
AAA
=>
"22"
};
is(
$subh
->[3]->{AAA}, 22);
@{
$hdr
->subhdrs } = ();
ok(!
exists
$header
{SUBHEADERS},
"Subheader should not exist"
);
$got
= 0;
for
my
$k
(
keys
%header
) {
$got
= 1
if
$k
eq
'SUBHEADERS'
;
}
ok( !
$got
,
"SUBHEADERS should not appear in foreach"
);