#!/usr/bin/perl -w
use
5.004;
plan
tests
=> 311;
BEGIN { MyTestHelpers::nowarnings(); }
{
my
$want_version
= 129;
ok (
$Math::PlanePath::ImaginaryBase::VERSION
,
$want_version
,
'VERSION variable'
);
ok (Math::PlanePath::ImaginaryBase->VERSION,
$want_version
,
'VERSION class method'
);
ok (
eval
{ Math::PlanePath::ImaginaryBase->VERSION(
$want_version
); 1 },
1,
"VERSION class check $want_version"
);
my
$check_version
=
$want_version
+ 1000;
ok (!
eval
{ Math::PlanePath::ImaginaryBase->VERSION(
$check_version
); 1 },
1,
"VERSION class check $check_version"
);
my
$path
= Math::PlanePath::ImaginaryBase->new;
ok (
$path
->VERSION,
$want_version
,
'VERSION object method'
);
ok (
eval
{
$path
->VERSION(
$want_version
); 1 },
1,
"VERSION object check $want_version"
);
ok (!
eval
{
$path
->VERSION(
$check_version
); 1 },
1,
"VERSION object check $check_version"
);
}
{
my
$path
= Math::PlanePath::ImaginaryBase->new;
ok (
$path
->n_start, 0,
'n_start()'
);
ok (
$path
->x_negative, 1,
'x_negative()'
);
ok (
$path
->y_negative, 1,
'y_negative()'
);
}
{
my
$radix
= 2 +
int
(
rand
(20));
my
$path
= Math::PlanePath::ImaginaryBase->new (
radix
=>
$radix
);
for
(1 .. 100) {
my
$bits
=
int
(
rand
(25));
my
$n
=
int
(
rand
(2*
*$bits
)) + 1;
my
(
$x
,
$y
) =
$path
->n_to_xy (
$n
);
my
$rev_n
=
$path
->xy_to_n (
$x
,
$y
);
if
(!
defined
$rev_n
) {
$rev_n
=
'undef'
; }
ok (
$rev_n
,
$n
,
"xy_to_n($x,$y) radix=$radix reverse to expect n=$n, got $rev_n"
);
my
(
$n_lo
,
$n_hi
) =
$path
->rect_to_n_range (
$x
,
$y
,
$x
,
$y
);
ok (
$n_lo
<=
$n
, 1,
"rect_to_n_range() radix=$radix reverse n=$n cf got n_lo=$n_lo"
);
ok (
$n_hi
>=
$n
, 1,
"rect_to_n_range() radix=$radix reverse n=$n cf got n_hi=$n_hi"
);
}
}
sub
index_to_negaradix {
my
(
$n
,
$radix
) =
@_
;
my
$power
= 1;
my
$ret
= 0;
while
(
$n
) {
my
$digit
=
$n
%
$radix
;
$n
=
int
(
$n
/
$radix
);
$ret
+=
$power
*
$digit
;
$power
*= -
$radix
;
}
return
$ret
;
}
{
my
$bad
= 0;
foreach
my
$radix
(2, 3, 5, 10, 16) {
my
$zorder
= Math::PlanePath::ZOrderCurve->new (
radix
=>
$radix
);
my
$imbase
= Math::PlanePath::ImaginaryBase->new (
radix
=>
$radix
);
foreach
my
$n
(0 .. 256) {
my
(
$zx
,
$zy
) =
$zorder
->n_to_xy(
$n
);
my
$nx
= index_to_negaradix(
$zx
,
$radix
);
my
$ny
= index_to_negaradix(
$zy
,
$radix
);
my
$in
=
$imbase
->xy_to_n(
$nx
,
$ny
);
if
(
$n
!=
$in
) {
$bad
= 1;
}
}
}
ok (
$bad
, 0);
}
exit
0;