BEGIN {
  unless (eval {; require Types::Standard; 1 } && !$@) {
    require Test::More;
    Test::More::plan(skip_all =>
      'these tests require Types::Standard'
    );
  }
}


use Test::More;
use strict; use warnings FATAL => 'all';

use List::Objects::WithUtils;
use Types::Standard -all;

my $immof = immarray_of Int() => 1 .. 5;
is_deeply
  [ $immof->all ],
  [ 1 .. 5 ],
  'immarray_of ok';

ok $immof->type == Int, 'type ok';

eval {; immarray_of Int() => qw/foo 1 2/ };
ok $@ =~ /constraint/, 'immarray_of invalid type died';

for my $method
  (@List::Objects::WithUtils::Role::Array::Immutable::ImmutableMethods) {
  
  local $@;
  eval {; $immof->$method };
  ok $@ =~ /implemented/, "$method dies"
}


eval {; push @$immof, 6 };
ok $@ =~ /read-only/, 'push dies';

eval {; pop @$immof };
ok $@ =~ /read-only/, 'pop dies';

eval {; unshift @$immof, 0 };
ok $@ =~ /read-only/, 'unshift dies';

eval {; shift @$immof };
ok $@ =~ /read-only/, 'shift dies';

eval {; splice @$immof, 0, 1, 10 };
ok $@ =~ /read-only/, 'splice dies';

eval {; $immof->[10] = 'foo' };
ok $@ =~ /read-only/, 'attempted extend dies';

eval {; $immof->[0] = 10 };
ok $@ =~ /read-only/, 'element set dies';


done_testing;
