The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 14;

BEGIN {
    unshift @INC => ('t/test_lib', '/test_lib');
}

use Read;
use SyncRead;

can_ok("Read", 'new');
my $reader = Read->new();

isa_ok($reader, 'Read');

can_ok("SyncRead", 'new');
my $sync_reader = SyncRead->new();

isa_ok($sync_reader, 'SyncRead');
isa_ok($sync_reader, 'Read');

ok($sync_reader->does('TSyncRead'), '... sync reader is a TSyncRead');

# these should be the same
is($reader->read(), $sync_reader->read(), '... these should be the same results');

# now lets extract the actul trait and examine it

my $trait;
{
	no strict 'refs';
	# get the trait out
	$trait = ${"SyncRead::TRAITS"};
}

# check to see it is what we want it to be
isa_ok($trait, 'Class::Trait::Config');

# now examine the trait itself
is($trait->name, 'TSyncRead', '... get the traits name');

ok(eq_array($trait->sub_traits, []), '... this should be empty');
ok(eq_hash($trait->conflicts, {}), '... this should be empty');    
ok(eq_hash($trait->overloads, {}), '... this should be empty');

ok(eq_hash(
        $trait->requirements, 
        { read => 1 })
    , '... this should not be empty');

ok(eq_set(
        [ keys %{$trait->methods} ], 
        ['lock', 'unlock', 'read'])
    , '... this should not be empty');