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 $immh = immhash_of Int() => ( foo => 1, bar => 2 );

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

ok $immh->get('foo') == 1 && $immh->get('bar') == 2, 'get ok';

eval {; immhash_of Int() => ( foo => 'baz' ) };
ok $@ =~ /constraint/, 'immhash_of invalid type died';

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

eval {; $immh->{foo} = 3 };
ok $@ =~ /read-only/, 'hash item set dies';

eval {; delete $immh->{foo} };
ok $@ =~ /read-only/, 'hash item delete dies';

eval {; $immh->{quux} = 4 };
ok $@ =~ /read-only/, 'hash item insert dies';

done_testing;
