#! /bin/false
use
Data::Traverse;
sub
testScalar {
my
$self
=
shift
,
my
$data
=
"foobar"
;
my
$item
;
my
$count
= 0;
my
$wanted
=
sub
{
++
$count
;
$item
=
$_
;
};
traverse
$wanted
,
$data
;
$self
->assert_equals (1,
$count
);
$self
->assert_str_equals (
$data
,
$item
);
}
sub
testArray {
my
$self
=
shift
;
my
$data
= [ (0 .. 4) ];
my
$count
;
my
$wanted
=
sub
{
$self
->assert_str_equals (
'ARRAY'
,
$Data::Traverse::type
)
unless
ref
$_
;
++
$count
;
};
traverse
$wanted
,
$data
;
$self
->assert_equals (1 + @{
$data
},
$count
);
}
sub
testHash {
my
$self
=
shift
;
my
@hashdata
=
qw (a
b c d e);
my
$data
= {
map
{
$_
=>
$_
}
@hashdata
};
my
$count
;
my
$wanted
=
sub
{
$self
->assert_str_equals (
'HASH'
,
$Data::Traverse::type
)
unless
ref
$_
;
++
$count
;
};
traverse
$wanted
,
$data
;
$self
->assert_equals (1 + 2 *
@hashdata
,
$count
);
}
sub
testMixed {
my
$self
=
shift
;
my
@hashdata
=
qw (a
b c d e);
my
$data
= {
map
{
$_
=>
$_
}
@hashdata
};
my
@list
= (0 .. 4);
$data
->{list} = [
@list
];
my
$count
;
my
$wanted
=
sub
{
++
$count
;
};
traverse
$wanted
,
$data
;
$self
->assert_equals (1 + 2 *
@hashdata
+ 2 +
@list
,
$count
);
}
sub
testBlessedArray {
my
$self
=
shift
;
my
$data
= [ (0 .. 4) ];
bless
$data
;
my
$count
;
my
$wanted
=
sub
{
$self
->assert_str_equals (
'ARRAY'
,
$Data::Traverse::type
)
unless
ref
$_
;
++
$count
;
};
traverse
$wanted
,
$data
;
$self
->assert_equals (1 + @{
$data
},
$count
);
}
sub
testBlessedHash {
my
$self
=
shift
;
my
@hashdata
=
qw (a
b c d e);
my
$data
= {
map
{
$_
=>
$_
}
@hashdata
};
bless
$data
;
my
$count
;
my
$wanted
=
sub
{
$self
->assert_str_equals (
'HASH'
,
$Data::Traverse::type
)
unless
ref
$_
;
++
$count
;
};
traverse
$wanted
,
$data
;
$self
->assert_equals (1 + 2 *
@hashdata
,
$count
);
}
sub
testBlessedMixed {
my
$self
=
shift
;
my
@hashdata
=
qw (a
b c d e);
my
$data
= {
map
{
$_
=>
$_
}
@hashdata
};
my
@list
= (0 .. 4);
$data
->{list} = [
@list
];
bless
$data
;
bless
$data
->{list};
my
$count
;
my
$wanted
=
sub
{
++
$count
;
};
traverse
$wanted
,
$data
;
$self
->assert_equals (1 + 2 *
@hashdata
+ 2 +
@list
,
$count
);
}
sub
testTraverse {
my
$self
=
shift
;
my
$data
= [[[[[ 1 ], 11], 111], 1111], 11111];
my
$wasref
= 1;
my
$last
=
''
;
my
$wanted
=
sub
{
my
$isref
=
ref
$_
;
$self
->assert (
$wasref
|| (!
$wasref
&& !
$isref
),
"References and non-references should "
.
"alternate only once. "
.
"Last: $last ($wasref), current: $_ ($isref)."
);
$last
=
$_
;
$wasref
=
$isref
;
};
traverse
$wanted
,
$data
;
$self
->assert (!
$wasref
,
"The last visited node should not be "
.
"a reference."
);
}
1;