use
5.010;
our
$VERSION
=
'0.004_002'
;
our
@EXPORT
=
qw(dataframe_ok dataframe_is)
;
sub
dataframe_ok ($;$) {
my
(
$thing
,
$name
) =
@_
;
my
$ctx
= context();
unless
(
$thing
->
$_DOES
(
'Data::Frame'
) ) {
my
$thingname
= render_ref(
$thing
);
$ctx
->ok( 0,
$name
, [
"'$thingname' is not a data frame object."
] );
$ctx
->release;
return
0;
}
$ctx
->ok( 1,
$name
);
$ctx
->release;
return
1;
}
sub
dataframe_is ($$;$@) {
my
(
$got
,
$exp
,
$name
,
@diag
) =
@_
;
my
$ctx
= context();
local
$Data::Frame::TOLERANCE_REL
= 1e-9;
unless
(
$got
->
$_DOES
(
'Data::Frame'
) ) {
my
$gotname
= render_ref(
$got
);
$ctx
->ok( 0,
$name
,
[
"First argument '$gotname' is not a data frame object."
] );
$ctx
->release;
return
0;
}
unless
(
$exp
->
$_DOES
(
'Data::Frame'
) ) {
my
$expname
= render_ref(
$exp
);
$ctx
->ok( 0,
$name
,
[
"Second argument '$expname' is not a data frame object."
] );
$ctx
->release;
return
0;
}
my
$diff
;
eval
{
$diff
= (
$got
!=
$exp
); };
if
($@) {
my
$gotname
= render_ref(
$got
);
$ctx
->ok( 0,
$name
, [
"'$gotname' is different from expected."
, $@ ],
@diag
);
$ctx
->release;
return
0;
}
my
$diff_which
=
$diff
->which(
bad_to_val
=> 1 );
unless
(
$diff_which
->isempty ) {
my
$gotname
= render_ref(
$got
);
my
$column_names
=
$exp
->column_names;
my
@table
= table(
sanitize
=> 1,
max_width
=> 80,
collapse
=> 1,
header
=> [
qw(ROWIDX COLUMN GOT CHECK)
],
rows
=> [
map
{
my
(
$ridx
,
$cidx
) =
@$_
;
[
$ridx
,
$column_names
->[
$cidx
],
$got
->at(
$ridx
,
$cidx
),
$exp
->at(
$ridx
,
$cidx
)
]
} @{
$diff_which
->unpdl }
]
);
$ctx
->ok( 0,
$name
,
[
"'$gotname' is different from expected."
,
@table
],
@diag
);
$ctx
->release;
return
0;
}
$ctx
->ok( 1,
$name
);
$ctx
->release;
return
1;
}
1;