ok array->is_mutable,
'array is_mutable'
;
ok !immarray->is_mutable,
'immarray !is_mutable'
;
ok !array->is_immutable,
'array !is_immutable'
;
ok immarray->is_immutable,
'immarray is_immutable'
;
my
$imm
= immarray( 1 .. 4 );
for
my
$method
(
@List::Objects::WithUtils::Role::Array::Immutable::ImmutableMethods
) {
eval
{;
$imm
->
$method
};
ok $@ =~ /implemented/,
"$method dies"
}
eval
{;
push
@$imm
,
'bar'
};
like $@,
qr/read-only/
,
'push dies'
;
eval
{;
pop
@$imm
};
like $@,
qr/read-only/
,
'pop dies'
;
eval
{;
unshift
@$imm
, 0 };
like $@,
qr/read-only/
,
'unshift dies'
;
eval
{;
shift
@$imm
};
like $@,
qr/read-only/
,
'shift dies'
;
eval
{;
splice
@$imm
, 0, 1, 10 };
like $@,
qr/read-only/
,
'3-arg splice dies'
;
eval
{;
$imm
->[10] =
'foo'
};
like $@,
qr/read-only/
,
'attempted extend dies'
;
eval
{;
$imm
->[0] = 10 };
like $@,
qr/read-only/
,
'element set dies'
;
eval
{;
@$imm
= () };
like $@,
qr/read-only/
,
'array clear dies'
;
if
($] >= 5.014) {
eval
{;
$imm
->
map
(
sub
{
$_
++ }) };
like $@,
qr/read-only/
,
'changing vals via topicalizer dies'
;
}
is_deeply
[
$imm
->all ],
[ 1 .. 4 ],
'array ok after exceptions'
;
my
$with_arr
= immarray( array(
qw/ a b c /
) );
ok(
$with_arr
->get(0)->set(0,
'foo'
),
'mutable set() inside immutable list ok'
);
my
$with_hash
= immarray( hash(
foo
=>
'bar'
) );
ok(
$with_hash
->get(0)->get(
'foo'
) eq
'bar'
,
'hash in immarray ok'
);
ok(
$with_hash
->get(0)->set(
foo
=>
'baz'
),
'hash->set in immarray ok'
);
ok(
$with_hash
->get(0)->get(
'foo'
) eq
'baz'
,
'hash->get in immarray ok'
);
{
my
$warned
;
local
$SIG
{__WARN__} =
sub
{
$warned
++ };
immarray(3,2,1)->
sort
(
sub
{
$a
<=>
$b
});
ok !
$warned
,
'immarray imported $a/$b vars ok'
;
}
done_testing;